Antlr4 至少一个Antlr规则可选部分

Antlr4 至少一个Antlr规则可选部分,antlr4,Antlr4,考虑以下语法片段: a : 'x' (b)? (c)? (d)? 'x' 我希望b、c或d中至少有一个在场。必须按照指定的顺序提供所有存在的文件。因此“xx”应该无效,因为至少应该指定[b,c,d]中的一个。“xcbx”也将无效,因为b和c的顺序错误。我该如何表达?以前,我对每个组合都有一个规则,这对我来说是非常便宜的。因为顺序很重要,而且您至少需要其中一个,我建议您保持语法不变,然后执行编辑,以确保在分析输入后,访问者/侦听器中存在其中一个规则 很多人犯的一个错误是想把“所有的东西”都写进语

考虑以下语法片段:

a : 'x' (b)? (c)? (d)? 'x'

我希望b、c或d中至少有一个在场。必须按照指定的顺序提供所有存在的文件。因此“xx”应该无效,因为至少应该指定[b,c,d]中的一个。“xcbx”也将无效,因为b和c的顺序错误。我该如何表达?以前,我对每个组合都有一个规则,这对我来说是非常便宜的。

因为顺序很重要,而且您至少需要其中一个,我建议您保持语法不变,然后执行编辑,以确保在分析输入后,访问者/侦听器中存在其中一个规则

很多人犯的一个错误是想把“所有的东西”都写进语法里。通常,让语法简单地正确、明确地解释输入,然后在您自己的代码中执行其余的验证,将产生更清晰的语法和更好的错误消息


当然,ANTLR将“接受”
x
,但您可以检测到没有
b
c
、或
d
,因为顺序很重要,并且您至少需要其中一个,我建议您保持语法不变,然后执行编辑,以确保在解析输入后,访问者/侦听器中存在其中一个语法

很多人犯的一个错误是想把“所有的东西”都写进语法里。通常,让语法简单地正确、明确地解释输入,然后在您自己的代码中执行其余的验证,将产生更清晰的语法和更好的错误消息


当然,ANTLR将“接受”
x
,但您可以检测到没有
b
c
、或
d
,您可以按照Mike Cargal的建议在解析运行后进行语义检查,或者您可以偶尔尝试我在MySQL语法中使用的一些东西:

a: 'x' (
     | (b) (c)? (d)?
     | (c) (d)?
     | (d)
 ) 'x'
;

您可以按照Mike Cargal的建议在解析运行后进行语义检查,或者尝试我偶尔在MySQL语法中使用的方法:

a: 'x' (
     | (b) (c)? (d)?
     | (c) (d)?
     | (d)
 ) 'x'
;