gpt4 book ai didi

sql - ANTLR4 : ordering problem of parser rules for a keyword used in several rules (AND, 之间)

转载 作者:行者123 更新时间:2023-12-02 12:19:49 30 4
gpt4 key购买 nike

我在使用 ANTLR4 解析某些 SQL 类型的字符串时遇到问题。解析后的字符串是:

WHERE a <> 17106
AND b BETWEEN c AND d
AND e BTW(f, g)

这是我的语法片段:

where_clause
: WHERE element
;

element
: element NOT_EQUAL_INFERIOR element
| element BETWEEN element AND element
| element BTW LEFT_PARENTHESIS element COMMA_CHAR element RIGHT_PARENTHESIS
| element AND element
| WORD
;

NOT_EQUAL_INFERIOR: '<>';
LEFT_PARENTHESIS: '(';
RIGHT_PARENTHESIS: ')';
COMMA_CHAR: ',';

BETWEEN: B E T W E E N;
BTW: B T W;

WORD ... //can be anything ... it doesn't matter for the problem.

This grammar generates a tree on that string (image)
(来源:hostpic.xyz)

但是正如您在同一张图片上看到的那样,这棵树不是“正确的树”。

ANTLR4 是贪婪的,它将 BETWEEN 之后的所有内容都包含在单个“元素”中,但我们希望它只接受“c”和“d”。

当然,由于它包含了元素规则中的所有内容,因此缺少 BETWEEN 的第二个 AND,因此失败。

我尝试过更改规则的顺序(将 AND 放在 BETWEEN 之前),我尝试将关联更改为这些规则的右侧 (< assoc=right >),但这些不起作用。他们改变了树,但没有把它变成我想要的样子。

我觉得这个错误是贪婪、关联、递归的混合体......使得寻找同类问题变得非常困难,但也许我只是错过了正确的单词。

谢谢,祝你有美好的一天!

最佳答案

我认为您滥用了规则element。我认为 SQL 不允许您将任何东西作为 BETWEEN 的左右限制。

未经测试,但我会尝试这个:

expression
: expression NOT_EQUAL_INFERIOR expression
| term BETWEEN term AND term
| term BTW LEFT_PARENTHESIS term COMMA_CHAR term RIGHT_PARENTHESIS
| expression AND expression
| term
;

term
: WORD
;

在这里,您的元素在大多数地方变成表达式,但在其他地方它变成术语。后者目前是一个虚拟规则,但我很确定您还想添加例如它的文字。

关于sql - ANTLR4 : ordering problem of parser rules for a keyword used in several rules (AND, 之间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57671909/

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