2014-12-25 2 views
0

Я изменил парсер PLSQL, указанный [Porcelli] (https://github.com/porcelli/plsql-parser). Я использую этот синтаксический анализатор для анализа файлов PlSql. Я столкнулся с проблемой с синтаксическим разбором Insert..Выберите утверждения, например.Parse Insert..Выберите инструкцию, используя ANSLR на основе PLSQL-анализатора

insert into tname Select cname from tname2 

Но если я приведу имена столбцов в отчете вставки, то она будет разобрана, например

insert into tname (c1,c2) Select cname from tname2 

грамматика Insert_statement присутствует в

insert_statement 
: insert_key^ 
( single_table_insert 
| multi_table_insert 
) 
; 

// $<Insert - Specific Clauses 

single_table_insert 
: insert_into_clause 
( values_clause static_returning_clause? 
| select_statement 
) 
error_logging_clause? 
-> ^(SINGLE_TABLE_MODE insert_into_clause values_clause? static_returning_clause?   select_statement? error_logging_clause?) 
; 

insert_into_clause 
: into_key general_table_ref 
    (LEFT_PAREN column_name (COMMA column_name)* RIGHT_PAREN)? 
    -> ^(into_key general_table_ref ^(COLUMNS column_name*)) 
; 

Не уверен, почему это неудача для первого случая, хотя грамматика справляется с этим.

EDIT:

Я получаю NoViableException, вот StackTrace,

Exception in thread "main" java.lang.RuntimeException: Parser Exception 
NoViableAltException([email protected][]) 
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.single_table_insert(PLSQLParser_PLSQL_DMLParser.java:12904) 
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.insert_statement(PLSQLParser_PLSQL_DMLParser.java:12806) 
at br.com.porcelli.parser.plsql.PLSQLParser.insert_statement(PLSQLParser.java:36823) 
at com.abc.xyz.main.PlSql.parse(PlSql.java:49) 
at com.abc.xyz.main.PlSql.main(PlSql.java:41) 

at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.reportError(PLSQLParser_PLSQL_DMLParser.java:821) 
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.single_table_insert(PLSQLParser_PLSQL_DMLParser.java:13058) 
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.insert_statement(PLSQLParser_PLSQL_DMLParser.java:12806) 
at br.com.porcelli.parser.plsql.PLSQLParser.insert_statement(PLSQLParser.java:36823) 
at com.abc.xyz.main.PlSql.parse(PlSql.java:49) 
at com.abc.xyz.main.PlSql.main(PlSql.java:41) 
+1

Кажется, что грамматика должна справиться с этим, что сообщение об ошибке? –

+0

@lp_ - Я добавил сообщение об ошибке. –

ответ

0

Это работает для меня. Попытайтесь использовать мою ветку. Но я не могу понять, почему. See

Смежные вопросы