c# - 为什么我无法在该解析树中获得正确的列位置?

标签 c# parsing antlr4

假设我有这样一个字符串:

var code = "Private Sub DoSomething(ByVal foo As Integer)\r\n    DoSomethingElse(foo)\r\nEnd Sub";

当我为 ANTLR 生成的解析器提供该字符串时,我得到一个看起来像这样的解析树:

[SubStmtContext]
    [VisibilityContext]
    [ArgListContext]
        [ArgContext]
            [AmbiguousIdentifierContext]
            [AsTypeClauseContext]
    [BlockContext]
        [ImplicitCallStmt_InBlockContext]
            [ICS_B_SubCallContext]
                [CertainIdentifierContext]
                [ArgsCallContext]
                    [ArgCallContext]
                        [ValueStmtContext]
                            [ImplicitCallStmt_InStmtContext]
                                [ICS_S_VariableCallContext]
                                    [VariableCallStmtContext]
                                        [AmbiguousIdentifierContext]

基础 ParserRuleContext 类公开了 IToken StartIToken Stop 属性,每个属性都公开了一个 Line 编号,带有 StartIndexStopIndex

所以回到我的输入字符串,我在第 1 行有 DoSomething 标识符,列位置从 12 开始到 22 停止 - 为什么我有 DoSomethingElse 标识符在第 2 行,列位置从 51 开始到 65 结束?

ANTLR 中是否存在一个错误,导致它使用 \r\n 来确定行位置,但忽略列位置?除了解析代码的第一行之外,我得到了完全不真实的列位置...有没有办法让上面的代码在第 2 行找到 DoSomethingElse 标识符,列位置从 4 开始并停止18 我期望他们在哪里?

下面是进行解析的实际代码:

    public IParseTree Parse(string code)
    {
        var input = new AntlrInputStream(code);
        var lexer = new VBLexer(input); // generated type
        var tokens = new CommonTokenStream(lexer);
        var parser = new VBParser(tokens); // generated type

        var result = parser.StartRule(); // generated method
        return result;
    }

列定位似乎完全不受我控制。还有其他人遇到过这个问题吗?

最佳答案

Token 接口(interface)不包含“column stop”属性。但是,它确实包含一个方法 getStopIndex(),您可能正在使用该方法。 getStartIndex()getStopIndex() 方法将绝对索引返回到流中(从解析开始)。要获取一行中的列,请改用 getCharPositionInLine()

关于c# - 为什么我无法在该解析树中获得正确的列位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28658857/

相关文章:

c# - Rhino 模拟列表约束

c# - 尝试将 ZipArchiveEntry 转换为 byte[]

parsing - 为什么我的解析器生成报告称该 LALR(1) 语法不是 LALR(1)?

c# - "var g = myComponent?.gameObject"给出错误,但 "var g = myComponent == null ? null : myComponent.gameObject"没有

java - Antlr4如何检测无法识别的 token 和给定的句子无效

Python:Google API - 从消息中获取 mimeTypes

java - 在 antlr4 中使用词法模式时出现警告 155

Antlr 4 C#语法文件

java - ANTLR4 中的树语法在哪里?

c# - N 个线程异步获取/执行任务