Parsing 如何使用ANTLR 4跳过解析规则?
在lexer中,可以跳过标记,使它们不进入解析器,如下所示:Parsing 如何使用ANTLR 4跳过解析规则?,parsing,antlr4,parser-generator,Parsing,Antlr4,Parser Generator,在lexer中,可以跳过标记,使它们不进入解析器,如下所示: Whitespace : [ \t\r\n]+ -> skip ; 解析器是否有一个等价于->skip?也就是说,一旦匹配了解析器规则,是否有办法将其排除在解析树之外?假设,它可能看起来像这样: document : prolog? -> skip misc* element misc* ; (示例摘自权威的ANTLR书籍,第225页)。不要跳过,但您可以使用谓词显著限定规则
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规则的复杂性,规则降级并不总是一个选项。这是语义谓词的一个有趣用法,@GRosenberg。谢谢你的主意。不幸的是,这并不是我想要的-(