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

问题描述 投票:0回答:1

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

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

我做这个表达式是因为我想允许 any 单个语法对象的排序——没有任何假设。

但是现在,我想表达规则

a
例如是可选的,但其余的不是。如果我写

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

当然这可以匹配我不想要的空字符串。 我希望总是至少有一个

b
c
d
,或
e
存在和一个或没有
a
.

regex antlr antlr4
1个回答
0
投票

首先,你是

*
基数,意味着它们都是可选的,并且
rule
可以匹配空输入。

*
更改为
+

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

这将需要一个或多个选项(并允许它们出现多次)。

因为你想允许任何顺序,这真的是你语法中最具体的。

我们中的许多人会说语法的主要目标是以明确的方式指定解释(又名解析)输入的唯一可能方式。也就是说,它应该涵盖句法问题。

从那里,您可以跟进访问者或更可能是听众,对语义问题进行编码,例如“您必须有一个

b
,一个
c
,一个
d
,一个
e
,和可以选择有一个
a

此外,请理解,通过在您自己的侦听器验证中处理此问题,即使您可以捕获所有这些规则,您也能够制作比 ANTLR 能够制作的更有意义的错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.