在lexer中,可以跳过标记,将它们排除在解析器之外,如下所示:
Whitespace : [ \t\r\n]+ -> skip ;解析器是否与-> skip等效?也就是说,一旦一个解析器规则被匹配,有什么方法可以将它排除在解析树之外?假设,它看起来可能是这样的:
document : prolog? -> skip
misc* element misc*
;(例子摘自“反The权威书”,第225页。)
发布于 2015-01-29 20:30:28
不是跳过,但您可以使用谓词对规则的匹配方式进行显着限定。
@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没有直接等效的。
惯用的解决方法是在行走时完全忽略解析树中元素的存在。除非您显式地编写代码,否则访问者不会关心元素是否存在。
尽管如此,您可以模仿elide操作符,将prolog规则降级为将匹配的令牌放置在隐藏通道上的令牌规则(以防万一您以后要查看它)。根据prolog规则的复杂性,规则降级并不总是一种选择。
https://stackoverflow.com/questions/28199252
复制相似问题