gpt4 book ai didi

sql - antlr如何定义非保留关键字

转载 作者:行者123 更新时间:2023-12-02 00:24:16 26 4
gpt4 key购买 nike

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

我有:

select : SELECT ;

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

SELECT : S E L E C T ;

IDENTIFIER : LETTER+ ;

定义保留关键字并使其不区分大小写。

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

最佳答案

您的问题似乎与我们在为 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

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

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

这使得与 java 创建的 POJO 无缝集成成为可能,而不会与属性名称和其他与 Drools 定义的关键字发生冲突。

希望对您有所帮助。

关于sql - antlr如何定义非保留关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9494176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com