如何用antlr定义非保留关键字

时间:2012-02-29 05:49:29

标签: sql antlr keyword

我正在使用antlr来分析和重写sql查询。

我有:

select : SELECT ;

fragment S : 's' | 'S' ;
....
fragment LETTER : 'a'..'z' | 'A'..'Z' ;

SELECT : S E L E C T ;

IDENTIFIER : LETTER+ ;

定义保留关键字并让它们不区分大小写。

我的问题是如何定义非保留关键词?

1 个答案:

答案 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”定义为硬关键字:

https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/main/resources/org/drools/lang/DRLLexer.g#L132

其他一切都是身份证。然后在PARSER中,我们为每个软关键字使用语义谓词:

https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/main/resources/org/drools/lang/DRLExpressions.g#L597

这使得可以与Java创建的POJO无缝集成,而不会使用Drools定义的关键字冲突属性名称和其他内容。

希望它有所帮助。