繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM