首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ANTLR 4跳过解析规则?

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

Stack Overflow用户
提问于 2015-01-28 18:03:30
回答 1查看 3.3K关注 0票数 7

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

代码语言:javascript
复制
Whitespace : [ \t\r\n]+ -> skip ;

解析器是否与-> skip等效?也就是说,一旦一个解析器规则被匹配,有什么方法可以将它排除在解析树之外?假设,它看起来可能是这样的:

代码语言:javascript
复制
document : prolog? -> skip 
           misc* element misc* 
         ;

(例子摘自“反The权威书”,第225页。)

EN

回答 1

Stack Overflow用户

发布于 2015-01-29 20:30:28

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

代码语言:javascript
复制
@members {
    boolean once = true;
    public boolean once() {
        if (once) {
            once = false;
            return true;
        }
        return false;
    }
}

只考虑一次分则匹配的可能性:

代码语言:javascript
复制
example1 : { once() }? prolog misc* element misc* 
         | misc* element misc* 
         ;

只允许一次机会匹配一个分则:

代码语言:javascript
复制
example2 : prolog { once() }? misc* element misc* 
         | misc* element misc* 
         ;

只匹配一次分则:

代码语言:javascript
复制
example3 : prolog misc* element misc* { once() }?
         | misc* element misc* 
         ;

更新

Antlr3有一个后缀'!‘运算符,该运算符将其元素从树中悄悄地隐藏。Antlr4没有直接等效的。

惯用的解决方法是在行走时完全忽略解析树中元素的存在。除非您显式地编写代码,否则访问者不会关心元素是否存在。

尽管如此,您可以模仿elide操作符,将prolog规则降级为将匹配的令牌放置在隐藏通道上的令牌规则(以防万一您以后要查看它)。根据prolog规则的复杂性,规则降级并不总是一种选择。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28199252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档