为什么我无法在该解析树中获得正确的列位置?
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 Start
和 IToken Stop
属性,每个属性公开了一个 Line
数字,一个 StartIndex
和 StopIndex
.
所以回到我的输入字符串,我在第 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()
。
假设我有这样一个字符串:
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 Start
和 IToken Stop
属性,每个属性公开了一个 Line
数字,一个 StartIndex
和 StopIndex
.
所以回到我的输入字符串,我在第 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()
。