java - 除了行和列之外,如何跟踪 token 的偏移位置?

标签 java parsing token lexer javacc

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

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

我正在寻找一个纯粹的解析器解决方案,这意味着,没有与实际文档交互(我可以用它来计算之后的偏移量)。

最佳答案

我过去使用过的一个作弊方法是选择偏移量的默认行/列信息。如果您不需要行/列信息,您可以执行以下操作:

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);
    }
}

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

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

options {
    TOKEN_EXTENDS = "my.AbstractToken";
    TOKEN_FACTORY = "my.TokenFactory";
}
...

定义基本 token 类:

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; }
}

并定义 token 工厂:

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 定义,以便提前忽略空白的偏移量.

关于java - 除了行和列之外,如何跟踪 token 的偏移位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17310542/

相关文章:

java - AEM Servlet 获取请求 header 值

java - Neo4j-带有if else条件的密码查询中的多个匹配语句

python - 解析非标准分号分隔 "JSON"

java - 如何根据文件中的数据类型将 CSV 文件读入 2 个 ArrayList?

c - 将 char* 解析为标记时出现段错误

c++ - 从 session ID 获取正确的 token

java - 保存应用程序数据?

java - 为什么 Eclipse 不能下推静态字段?

php - 远程解析 XML 与使用 cURL 本地保存文件并在本地解析

sql - 关系数据库是如何工作的?