如何编写 antlr4 词法分析器来处理模棱两可的语法?

How to approach writing antlr4 lexer for ambiguous grammar?

提问人:Michael EstrinOne 提问时间:9/26/2023 最后编辑:Bart KiersMichael EstrinOne 更新时间:9/26/2023 访问量:48

问:

假设我有一个语法,比如:

grammar ambiguity;
activity : Action Sep Argument;
Action : [0-9];
Argument: [0-9];
Sep: ':';
WS: [ \t\r\n]+ -> skip;

简单的测试是,比如说,“1:2”;

Action 和 Argument 的规则是“相同”的,因此词法分析器片段的顺序定义了所采用的内容。当令牌被打印出来时,它将是

Action, Action
and not
Action, Argument

Token: 1, Type: 1
Token: :, Type: 3
Token: 2, Type: 1

此输出是预期的,因为“操作”片段列在最前面。但是,我无法弄清楚如何处理语法的创建逻辑。语法应该写成:

activity : Val Sep Val;
fragment Val : [0-9];

和“Action”、“Argument”部分在代码中解析为监听器?请指教。

C# 分析 ANTLR4

评论

1赞 500 - Internal Server Error 9/26/2023
我就是这样做的,FWIW。
1赞 Bart Kiers 9/26/2023
Val不过,不应该是一个片段。片段只能在词法分析器规则中使用。
0赞 Michael EstrinOne 9/26/2023
谢谢,我查看了您的最新评论,现在对我来说很有意义。再次感谢!

答:

1赞 Bart Kiers 9/26/2023 #1

是的,这就是在词法分析器中处理此类情况的方法:创建一个词法分析器规则,并在解析器规则中使用该规则。请注意,规则不能在解析器规则中使用,因此它应该是:fragment

activity : Val Sep Val;

Val : [0-9];
Sep: ':';

艺术

activity : action Sep argument;

action : Val;
argument : Val;

Val : [0-9];
Sep: ':';

评论

0赞 Michael EstrinOne 9/26/2023
啊哈!因此,您创建了两个解析器规则,它们又使用一个词法分析器规则!这就是我认为我在对 antlr4 产品的概念理解中所缺少的。谢谢,我会进行更改并尝试您的版本。
0赞 Michael EstrinOne 9/26/2023
快速更新 - 按照您向我解释的那样工作。非常感谢,巴特!
0赞 Bart Kiers 9/27/2023
不客气@MichaelEstrinOne