【问题标题】:How can I skip a parsing rule using ANTLR 4?如何使用 ANTLR 4 跳过解析规则?
【发布时间】:2015-01-28 18:03:30
【问题描述】:

在词法分析器中,可以跳过标记,将它们排除在解析器之外,如下所示:

Whitespace : [ \t\r\n]+ -> skip ;

解析器是否有等效于-> skip 的方法?也就是说,一旦解析器规则匹配,有没有办法将其排除在解析树之外?假设,它可能看起来像这样:

document : prolog? -> skip 
           misc* element misc* 
         ;

(示例取自 The Definitive ANTLR Book,第 225 页。)

【问题讨论】:

    标签: parsing antlr4 parser-generator


    【解决方案1】:

    不跳过,但您可以使用谓词显着限定规则的匹配方式。

    @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 运算符(以防您以后想查看它)。根据序言规则的复杂性,规则降级并不总是一种选择。

    【讨论】:

    • 这是语义谓词@GRosenberg 的一个有趣用法。谢谢你的主意。不幸的是,这真的不是我想要的。 :-(
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    相关资源
    最近更新 更多