提问人:Michael EstrinOne 提问时间:9/26/2023 最后编辑:Bart KiersMichael EstrinOne 更新时间:9/26/2023 访问量:48
如何编写 antlr4 词法分析器来处理模棱两可的语法?
How to approach writing antlr4 lexer for ambiguous grammar?
问:
假设我有一个语法,比如:
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”部分在代码中解析为监听器?请指教。
答:
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
上一个:C# 如何从Web浏览器控件的选定文本中提取html表格
下一个:网站访问和解析
评论
Val
不过,不应该是一个片段。片段只能在词法分析器规则中使用。