说我有这样的字符串:
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 Start
和IToken Stop
属性,每个属性都显示Line
个数字,StartIndex
和{{1} }。
回到我的输入字符串,我在第1行有StopIndex
标识符,列位置开始12和第22位 - 为什么我在第2行,列位置有DoSomething
标识符开始51并停止65?
ANTLR中是否存在使DoSomethingElse
帐户确定行位置但是忽略列位置的错误?除了解析代码的第一行以外,我得到了完全不真实的列位置......有没有办法让上面的代码在第2行找到\r\n
标识符,列位置开始4和停止18在哪里,我期待他们?
这是进行解析的实际代码:
DoSomethingElse
列定位似乎完全不受我的控制。其他人遇到过这个问题吗?
答案 0 :(得分:3)
Token
接口不包含“列停止”属性。但是,它确实包含了一个方法getStopIndex()
,听起来你可能正在使用它。 getStartIndex()
和getStopIndex()
方法将绝对索引返回到流中(从解析开始)。要获得一行中的列,请改用getCharPositionInLine()
。