我需要帮助设置规则中选项匹配的计数。 此规则示例将匹配(rule2)零次或多次。
rule1: 'text' ( '(' rule2 ')' )*
我知道+,*,?如果我希望(规则2)匹配5次怎么办?
是+,*,?语法支持的唯一计数修饰符,所以我需要在解析器监听器中强制计数?
答案 0 :(得分:2)
如果我希望(rule2)匹配5次怎么办?
在语法中,有两个选项:
写出来5次:
rule1: 'text' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')' '(' rule2 ')'
或使用语义谓词。请参阅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 ')'
;