ANTLR过滤特定令牌的语法并忽略其他所有可能的东西?

时间:2014-07-30 09:00:12

标签: sql parsing antlr

我目前正在尝试为数据定义语言创建一个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)+ 
;

提前致谢!

1 个答案:

答案 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