[英]How can I skip a parsing rule using ANTLR 4?
在词法分析器中,可以跳过令牌,使它们脱离解析器,如下所示:
Whitespace : [ \t\r\n]+ -> skip ;
是否有相当于-> skip
解析器? 也就是说,一旦匹配解析器规则,是否有办法将其保留在解析树之外? 假设,它可能看起来像这样:
document : prolog? -> skip
misc* element misc*
;
(例子取自最终的ANTLR书 ,第225页。)
不要跳过,但您可以使用谓词显着限定规则的匹配方式。
@members {
boolean once = true;
public boolean once() {
if (once) {
once = false;
return true;
}
return false;
}
}
考虑一次子规则匹配的可能性:
example1 : { once() }? prolog misc* element misc*
| misc* element misc*
;
只允许一次机会匹配一个子规则:
example2 : prolog { once() }? misc* element misc*
| misc* element misc*
;
只匹配一个子规则一次:
example3 : prolog misc* element misc* { once() }?
| misc* element misc*
;
更新
Antlr3有一个后缀'!' 运算符,它默默地从树中删除它的元素。 Antlr4没有直接的等价物。
惯用的解决方法是在行走时完全忽略解析树中元素的存在。 除非您明确编写代码,否则访问者不会关心元素是否存在。
尽管如此,您可以通过将prolog规则降级为令牌规则来模拟elide运算符,该令牌规则将匹配的令牌放在隐藏的通道上(以防您以后想要查看它)。 根据prolog规则的复杂性,规则降级并不总是一种选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.