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

Why am I not get getting correct column positions in that parse tree?

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

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 class 公开了 IToken StartIToken Stop 属性,每个属性公开了一个 Line 数字,一个 StartIndexStopIndex.

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

ANTLR 中是否存在一个错误,导致它考虑 \r\n 来确定行位置,但忽略它们来确定列位置?除了解析代码的第一行之外,我得到了完全不真实的列位置...有没有办法让上面的 DoSomethingElse 标识符位于第 2 行,列位置从 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 界面不包含 "column stop" 属性。但是,它确实包含一个方法 getStopIndex(),听起来您可能正在使用该方法。 getStartIndex()getStopIndex() 方法 return 流中的绝对索引(从解析开始)。要获取一行中的列,请改用 getCharPositionInLine()