首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除了行和列之外,如何跟踪标记的偏移位置?

除了行和列之外,如何跟踪标记的偏移位置?
EN

Stack Overflow用户
提问于 2013-06-26 10:21:29
回答 2查看 913关注 0票数 2

除了beginLine、beginColumn、endLine和endColumn之外,是否还有其他选项或方法来保留标记的源偏移量位置?

我可能不得不使用TOKEN_EXTENDSCOMMON_TOKEN_ACTION (或TOKEN_FACTORY)选项来存储额外的令牌信息,但我不知道如何检索令牌的偏移量。有什么想法吗?

我正在寻找一个纯粹的解析器解决方案,也就是说,不与实际的文档交互(我可以用它来计算偏移量)。

EN

Stack Overflow用户

发布于 2013-06-26 20:07:12

我在过去使用的一个骗局是为偏移量选择默认的行/列信息。如果不需要行/列信息,可以这样做:

代码语言:javascript
复制
options {
    COMMON_TOKEN_ACTION = true;
}
...
TOKEN_MGR_DECLS : {
    static long offset = 0;
    static void CommonTokenAction(Token t) {
        // Poor-man's re-initialization.
        if ((t.beginLine == 1) && (t.beginColumn == 0)) { offset = 0; }
        offset += t.image.length();
        t.beginLine = (int)(offset >> 32);
        t.endLine = (int)(offset);
    }
}

令牌管理器和解析器都不依赖行/列信息,因此这样做是安全的。同样可以恢复令牌t的偏移信息。

如果您确实需要保留行/列信息,则可以指定令牌类型的基类以及令牌工厂:

代码语言:javascript
复制
options {
    TOKEN_EXTENDS = "my.AbstractToken";
    TOKEN_FACTORY = "my.TokenFactory";
}
...

定义基令牌类:

代码语言:javascript
复制
package my;
public abstract class AbstractToken {
    private long offset;
    protected AbstractToken() {
        // The offset hasn't been initialized.
        offset = -1;
    }
    public long getOffset() { return this.offset; }
    void setOffset(long offset) { this.offset = offset; }
}

并定义令牌工厂:

代码语言:javascript
复制
package my;
public class TokenFactory {
    private static long offset = 0;
    public static Token newToken(int kind, String image) {
        Token token = new Token(kind, image);
        token.setOffset(offset);
        offset += image.length();
    }
}

在下一次解析时,您必须手动重置偏移量。我已经详细介绍了其他一些细节,但值得注意的是,任何SKIP定义都应该转换为SPECIAL_TOKEN定义,以便提前偏移其他被忽略的空格。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17310542

复制
相关文章

相似问题

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