gpt4 book ai didi

c# - 访问 ANTLR 4 中的 channel 并分别解析它们

转载 作者:行者123 更新时间:2023-12-04 02:10:27 24 4
gpt4 key购买 nike

我已将我的评论包含在 ANTLR 4 中的一个单独 channel 中。在我的例子中,它是 channel 2。

这是我的词法分析器语法。

COMMENT: '/*' .*? '*/' -> channel(2) 
;

我想访问这个 channel 2 并在这个 channel 上做一个解析来积累评论。所以我将其包括在如下解析语法中:

comment
:COMMENT
;

在程序中

        string s = " paring string"
AntlrInputStream input = new AntlrInputStream(s);
CSSLexer lexer = new CSSLexer(input);

CommonTokenStream tokens = new CommonTokenStream(lexer,2);

然后我想对 token 进行解析

var xr = parser.comment().GetRuleContexts<CommentContext>();

因为我想从 CommentContext 对象中获取信息,例如 Start.Column

编辑:

这是改进后的问题

更具体地说,我想获取 channel 2 中的所有标记并使用评论语法解析它们以将所有评论添加到列表 (IReadOnly<CommentContext>) 中,以便我可以遍历每个标记并访问信息例如,开始行、开始列、结束行结束列和标记文本。

CommonTokenStream tokens = new CommonTokenStream(lexer,2);

这并没有给我 channel 2 中的标记。我发现的另一件事是直到这些标记作为参数传递给解析器构造 XParser parser = new XParser(tokens);

然后只有我可以通过调用 GetTokens() 访问 token .在 token 中我可以看到有评论被标识为 token 并且在 channel 2 中。即使 CommentTokenStrem如上所述输入 channel 号。它包含所有 token 。

  1. 在使用 token 创建解析器对象之前无法访问 token 的原因是什么?

  2. 我想要一个 CommentTokenStrem在 channel 2 中传递给 XParser 对象创建以使用我的 comment 解析这些标记语法。在 ANTLR 4 API 中执行此操作的最佳方法是什么?

最佳答案

CommonTokenStream在内部跟踪来自任何 channel 的所有代币。当您调用 getTokens() 时,您不会看到的唯一东西是执行 -> skip 操作的词法分析器规则(甚至没有为这些规则创建 token )。

您可以使用 TokenStream.LT 查看 channel 2 上的 token 和 IntStream.consume方法。

Java 示例

CommonTokenStream cts = new CommonTokenStream(tokenSource, 2);
List<Token> tokens = new ArrayList<Token>();
while (cts.LA(1) != EOF) {
tokens.add(cts.LT(1));
cts.consume();
}

C# 示例:

CommonTokenStream cts = new CommonTokenStream(tokenSource, 2);
IList<IToken> tokens = new List<IToken>();
while (cts.La(1) != Eof)
{
tokens.Add(cts.Lt(1));
cts.Consume();
}

关于c# - 访问 ANTLR 4 中的 channel 并分别解析它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18606701/

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