我正在使用antlr来分析和重写sql查询。
我有:
select : SELECT ;
fragment S : 's' | 'S' ;
....
fragment LETTER : 'a'..'z' | 'A'..'Z' ;
SELECT : S E L E C T ;
IDENTIFIER : LETTER+ ;
定义保留关键字并让它们不区分大小写。
我的问题是如何定义非保留关键词?
答案 0 :(得分:2)
您的问题似乎与为Drools(www.jboss.org/drools)语言(DRL)构建解析器时遇到的问题类似。例如,在DRL中,“rule”是一个关键字,但也可以由java程序员用作他的POJO中的属性名称。所以我们不能将它作为保留关键字。
rule /*keyword*/ "my rule"
when
SomeClass( rule /*property name*/ == "foo" )
...
我们将这些关键字称为“软关键字”。
要在ANTLR中执行此操作,我们在LEXER中仅将“true”/“false”/“null”定义为硬关键字:
其他一切都是身份证。然后在PARSER中,我们为每个软关键字使用语义谓词:
这使得可以与Java创建的POJO无缝集成,而不会使用Drools定义的关键字冲突属性名称和其他内容。
希望它有所帮助。