提问人:Diego Marcolungo 提问时间:8/20/2023 最后编辑:Lex LiDiego Marcolungo 更新时间:8/21/2023 访问量:41
ANTLR4 规则开头的可选符号
ANTLR4 an optional symbol at begining of a rule
问:
我正在学习 ANTLR4 的工作原理。我不明白如何在规则的开头处理可选符号。
我有这个简单的语法:
genericRule: optional otherPart ;
optional: ( 'A' | 'B' | 'C' ) * ;
otherPart: 'D' | 'E' | 'F' ;
当我尝试仅将字符串与字符匹配时,解析树检查器给了我这个结果:'E'
如果我的输入不以可选标记开头,我如何排除第一个空规则,或者?optional
'A'
'B'
'C'
我想要这个解析树:
答:
0赞
Mike Cargal
8/21/2023
#1
将“可选”部分提升一个级别(到可选的位置)
grammar ExprParser;
genericRule: optional* otherPart ;
optional: 'A' | 'B' | 'C' ;
otherPart: 'D' | 'E' | 'F' ;
在语法中,您说必须有一个节点(并且该节点可能没有任何内容(子节点))。genericRule
optional
optional
评论
0赞
Diego Marcolungo
8/21/2023
谢谢,现在它按预期工作。因此,插入的级别很重要*
0赞
Mike Cargal
8/21/2023
绝对。。。是的。我总是发现带有顶级 *(或空替代项)的规则在语法中是一种“代码味道”。这并不总是错的,可能有一些原因,你可能希望树上的节点始终存在,即使它实际上是空的,但这种情况很少见。
评论
"E"
genericRule: optional? otherPart ;
optional
rule genericRule contains an optional block with at least one alternative that can match an empty string