gpt4 book ai didi

antlr - 解决 ANTLR 词法分析器规则歧义的正确方法?

转载 作者:行者123 更新时间:2023-12-04 15:14:40 28 4
gpt4 key购买 nike

请查看源代码:https://gist.github.com/1684022 .

我定义了两个 token :

ID  :   ('a'..'z' | 'A'..'Z') ('0'..'9' | 'a'..'z' | 'A'..'Z' | ' ')*;

PITCH
: (('A'|'a') '#'?)
| (('B'|'b') '#'?)
| (('C'|'c') '#'?);

显然,字母“A”将是一个歧义。

我进一步定义:
note    :   PITCH;
name : ID;
main : name ':' note '\n'?

现在,如果我输入“A:A”作为解析器的输入,我总是会收到错误消息。解析器需要 PITCH 或 ID,具体取决于是先定义 ID 还是 PITCH:
mismatched input 'A' expecting ID

解决此问题以使其按预期工作的正确方法是什么?

如上所述,尽管解析应该如何工作具有直观意义,但 ANTLR 并没有做“正确的事情”。也就是说,即使 main规则说 name/ ID应该首先出现,词法分析器似乎对此一无所知并将“A”标识为 PITCH因为它遵循“最长匹配”/“哪个优先”规则,而不是更合理的“规则说什么”规则。

是通过匹配 ID 和 PITCH,然后像 dasblinkenlight 所说的那样稍后重新组合它们来伪造/破解它的唯一解决方案吗?

最佳答案

以下是我如何重构这个语法以使其工作:

ID  :   (('a'..'z' | 'A'..'Z') ('0'..'9' | 'a'..'z' | 'A'..'Z' | ' ')+)
| ('d'..'z' | 'D'..'Z');

PITCH : 'a'..'c' | 'A'..'C';

SHARP : '#';

note : PITCH SHARP?;

name : ID | PITCH;

main : name ':' note '\n'? EOF

这将长名称与单字符音调名称分开,后者在解析器中“重新组合”。 “sharp”标记也有自己的名字,并在解析器中被识别为可选标记。

关于antlr - 解决 ANTLR 词法分析器规则歧义的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9023015/

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