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

时间:2014-08-08 21:12:21

标签: antlr

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

rule1: 'text' ( '(' rule2 ')' )*

我知道+,*,?如果我希望(规则2)匹配5次怎么办?

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

2 个答案:

答案 0 :(得分:2)

  

如果我希望(rule2)匹配5次怎么办?

在语法中,有两个选项:

1

写出来5次:

rule1: 'text' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')'

2

或使用语义谓词。请参阅ANTLR4 wiki about predicate

中的段落使用上下文相关谓词
  

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

是的,没有(...){5}语法可以完全匹配5次。

  

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

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

答案 1 :(得分:1)

是的,您需要在语法中指定*+,然后在完成解析后使用侦听器来验证它是否完全 n 次。另一种方法是扩展语法中的表达式,但这会对语法从语法错误中彻底恢复的能力产生灾难性后果。

// this is allowed, but not recommended as described in the text above
rule1
  : 'text'
    '(' rule2 ')'
    '(' rule2 ')'
    '(' rule2 ')'
    '(' rule2 ')'
    '(' rule2 ')'
  ;