Parsing 如何使用ANTLR 4跳过解析规则?

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页)。不要跳过,但您可以使用谓词显著限定规则

在lexer中,可以跳过标记,使它们不进入解析器,如下所示:

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。谢谢你的主意。不幸的是,这并不是我想要的-(