Я изменил парсер 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)
Кажется, что грамматика должна справиться с этим, что сообщение об ошибке? –
@lp_ - Я добавил сообщение об ошибке. –