如何在ANTLR中设置规则选项计数

如何在ANTLR中设置规则选项计数,antlr,Antlr,我需要帮助设置规则中选项匹配的计数。 此规则示例将匹配(规则2)零次或多次 rule1: 'text' ( '(' rule2 ')' )* 我知道+,*,?对于计数,但是如果我希望(规则2)匹配5次呢 是+,*,?语法支持的唯一计数修饰符,因此我需要在解析器侦听器中强制计数?是的,您需要在语法中指定*或+,然后在解析完成后使用侦听器验证它是否恰好出现了n次。另一种方法是扩展语法中的表达式,但这可能会对语法从语法错误中干净恢复的能力造成灾难性的后果 // this is allowed, bu

我需要帮助设置规则中选项匹配的计数。 此规则示例将匹配(规则2)零次或多次

rule1: 'text' ( '(' rule2 ')' )*
我知道+,*,?对于计数,但是如果我希望(规则2)匹配5次呢


是+,*,?语法支持的唯一计数修饰符,因此我需要在解析器侦听器中强制计数?

是的,您需要在语法中指定
*
+
,然后在解析完成后使用侦听器验证它是否恰好出现了n次。另一种方法是扩展语法中的表达式,但这可能会对语法从语法错误中干净恢复的能力造成灾难性的后果

// this is allowed, but not recommended as described in the text above
rule1
  : 'text'
    '(' rule2 ')'
    '(' rule2 ')'
    '(' rule2 ')'
    '(' rule2 ')'
    '(' rule2 ')'
  ;
如果我希望(规则2)匹配5次呢

在语法中,有两个选项:

1. 写5遍:

rule1: 'text' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')'
2. 或者使用语义谓词。请参阅第页中使用上下文相关谓词的段落

是+,*,?语法支持的唯一计数修饰符

是的,没有精确匹配5次的
(…){5}
语法

所以我需要在解析器侦听器中强制计数

这将是(IMO)最好的选择:在解析器中,只需匹配
('('rule2'))+
,并在解析后在侦听器/访问者中进行验证