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

时间:2015-02-22 14:19:44

标签: 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个数字,StartIndex和{{1} }。

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

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

这是进行解析的实际代码:

DoSomethingElse

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

1 个答案:

答案 0 :(得分:3)

Token接口不包含“列停止”属性。但是,它确实包含了一个方法getStopIndex(),听起来你可能正在使用它。 getStartIndex()getStopIndex()方法将绝对索引返回到流中(从解析开始)。要获得一行中的列,请改用getCharPositionInLine()