我有一个这样定义的规则:
rule: ( a | b | c | d | e )*;
我做这个表达式是因为我想允许 any 单个语法对象的排序——没有任何假设。
但是现在,我想表达规则
a
例如是可选的,但其余的不是。如果我写
rule: ( a? | b | c | d | e )*;
当然这可以匹配我不想要的空字符串。 我希望总是至少有一个
b
,c
,d
,或e
存在和一个或没有a
.
首先,你是
*
基数,意味着它们都是可选的,并且 rule
可以匹配空输入。
将
*
更改为+
:
rule: ( a | b | c | d | e )+;
这将需要一个或多个选项(并允许它们出现多次)。
因为你想允许任何顺序,这真的是你语法中最具体的。
我们中的许多人会说语法的主要目标是以明确的方式指定解释(又名解析)输入的唯一可能方式。也就是说,它应该涵盖句法问题。
从那里,您可以跟进访问者或更可能是听众,对语义问题进行编码,例如“您必须有一个
b
,一个c
,一个d
,一个e
,和可以选择有一个a
“
此外,请理解,通过在您自己的侦听器验证中处理此问题,即使您可以捕获所有这些规则,您也能够制作比 ANTLR 能够制作的更有意义的错误消息。