ANTLR4 规则开头的可选符号

ANTLR4 an optional symbol at begining of a rule

提问人:Diego Marcolungo 提问时间:8/20/2023 最后编辑:Lex LiDiego Marcolungo 更新时间:8/21/2023 访问量:41

问:

我正在学习 ANTLR4 的工作原理。我不明白如何在规则的开头处理可选符号。

我有这个简单的语法:

genericRule: optional otherPart ;

optional: ( 'A' | 'B' | 'C' ) * ;
otherPart: 'D' | 'E' | 'F' ;

当我尝试仅将字符串与字符匹配时,解析树检查器给了我这个结果:'E'

Wrong result

如果我的输入不以可选标记开头,我如何排除第一个空规则,或者?optional'A''B''C'

我想要这个解析树:

Correct result

Java 解析 ANTLR4 语法

评论

2赞 Hovercraft Full Of Eels 8/20/2023
我很困惑:为什么你把“错误的结果”称为错误?在我看来,它正在工作,因为它正在调用您的 genericRule 令牌。"E"
0赞 Lex Li 8/20/2023
尝试genericRule: optional? otherPart ;
0赞 Diego Marcolungo 8/21/2023
@HovercraftFullOfEels 是的,它正在工作,但我不想要空分支optional
0赞 Diego Marcolungo 8/21/2023
@LexLi 根据你的规则,我有一个警告:.我不想匹配空字符串rule genericRule contains an optional block with at least one alternative that can match an empty string
0赞 Diego Marcolungo 8/21/2023
为什么我的问题很糟糕?

答:

0赞 Mike Cargal 8/21/2023 #1

将“可选”部分提升一个级别(到可选的位置)

grammar ExprParser;

genericRule: optional* otherPart ;

optional:  'A' | 'B' | 'C'  ;
otherPart: 'D' | 'E' | 'F' ;

enter image description here

在语法中,您说必须有一个节点(并且该节点可能没有任何内容(子节点))。genericRuleoptionaloptional

评论

0赞 Diego Marcolungo 8/21/2023
谢谢,现在它按预期工作。因此,插入的级别很重要*
0赞 Mike Cargal 8/21/2023
绝对。。。是的。我总是发现带有顶级 *(或空替代项)的规则在语法中是一种“代码味道”。这并不总是错的,可能有一些原因,你可能希望树上的节点始终存在,即使它实际上是空的,但这种情况很少见。