gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:34:50 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com