regex 允许语法规则之间的任何顺序,包括ANTLR4中的可选顺序

qacovj5a  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(110)

我有一个这样定义的规则:

rule: ( a | b | c | d | e )*;

我这样做是因为我想允许单个语法对象的任何**排序-没有任何假设。
但是现在,我想表达规则a例如是可选的,但其余的不是。

rule: ( a? | b | c | d | e )*;

那么当然这可能匹配我不想要的空字符串。我希望总是至少有一个bcd,或e存在和 one or noa

wnrlj8wa

wnrlj8wa1#

首先,你是*基数,这意味着所有这些都是可选的,rule可以匹配空输入。
*更改为+

rule: ( a | b | c | d | e )+;

这将需要一个或多个选项(并允许它们多次出现)。
既然你想允许任何顺序,这真的是你在语法中可以做到的最具体的。
我们中的许多人会说语法的主要目标是以一种明确的方式指定解释(又名解析)输入的唯一可能的方式。也就是说,它应该涵盖语法方面的问题。
从那里,您可以在访问者或更可能的听众中跟进,以编码语义问题,如“您必须具有bcde,并且可以选择具有a
此外,要理解,通过在侦听器中自己的验证中处理这个问题,即使您可以捕获所有这些规则,也可以创建比ANTLR更有意义的错误消息。

fcwjkofz

fcwjkofz2#

下面是语法:

optional : a ; 
required : b | c | d | e ;
rule: optional* required (required|optional)*;

相关问题