我目前正在尝试为数据定义语言创建一个SQL语法。 对于我的程序,解析器只需要识别一些特定的sql命令,如" CREATE TABLE"," ALTER TABLE"等。 由于我正在使用自动生成的导出文件,因此我要解析的内容也会产生大量开销,例如" SET CURRENT PATH"这不是必须解析的,我想知道是否有办法忽略"其他一切"在SQL语句中未定义。希望任何人都有这方面的经验..
这是我语法的标题部分:
list: sql_expression ENDOFFILE?;
sql_expression:
((create_statement|alter_table_statement|create_unique_index_statement|insert_statement) SEMICOLON)+
;
...
我想知道是否可以像这样扩展sql_expression规则:
list: sql_expression ENDOFFILE?;
sql_expression:
((create_statement|alter_table_statement|create_unique_index_statement|insert_statement|else_stuff) SEMICOLON)+
;
提前致谢!
答案 0 :(得分:0)
是的,你可以做到这一点。 您可以忽略诸如" SET CURRENT PATH"之类的语句。或者" CONNECT..blah blah"。这些只是SQL plus命令。您需要吞下特定关键字之后的所有内容。 例如,在" ACCEPT ..blah .." ,您可以创建以下规则:
SQL_PLUS_ACCEPT
: 'accept' SPACE ( ~('\r' | '\n') )* (NEWLINE|EOF)
;
accept_key
: SQL_PLUS_ACCEPT
;
这将忽略"接受......"命令,你可以解析任何stmt u wnat来解析。您需要为其他sql plus命令执行此操作,如SET,CONNECT,EXIT等。 您可以参考此link