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