访问 ANTLR 4 中的通道并单独解析它们

diy*_*da_ 3 c# antlr antlr4

我已将我的评论添加到 ANTLR 4 中的一个单独频道中。在我的例子中,它是频道 2。

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

COMMENT: '/*' .*? '*/' -> channel(2) 
       ;
Run Code Online (Sandbox Code Playgroud)

我想访问这个频道 2 并在这个频道上进行解析以积累评论。所以我将其包含在解析语法中,如下所示:

comment
:COMMENT
;
Run Code Online (Sandbox Code Playgroud)

节目中

        string s = " paring string"
        AntlrInputStream input = new AntlrInputStream(s);
        CSSLexer lexer = new CSSLexer(input); 
       
        CommonTokenStream tokens = new CommonTokenStream(lexer,2);
Run Code Online (Sandbox Code Playgroud)

然后我想对令牌进行解析

var xr = parser.comment().GetRuleContexts<CommentContext>();
Run Code Online (Sandbox Code Playgroud)

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

编辑:

这是改进后的问题

更具体地说,我想获取通道 2 中的所有标记,并使用注释语法解析它们,将所有注释获取到 list( IReadOnly<CommentContext>) 中,以便我可以迭代每个注释并访问诸如起始行、起始列、结束行结束列和标记文本。

CommonTokenStream tokens = new CommonTokenStream(lexer,2);
Run Code Online (Sandbox Code Playgroud)

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

然后只有我可以通过调用来访问令牌GetTokens()。在令牌中,我可以看到有一些注释被标识为令牌并且位于通道 2 中。尽管CommentTokenStrem指定了上面的通道号。它包含所有令牌。

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

  2. 我想CommentTokenStrem在通道 2 中获取 a 并将其传递给 XParser 对象创建,以使用我的comment语法解析这些标记。在 ANTLR 4 API 中执行此操作的最佳方法是什么?

Sam*_*ell 5

CommonTokenStream内部跟踪来自任何渠道的所有代币。调用时唯一看不到的getTokens()是执行操作的词法分析器规则-> skip(甚至没有为这些规则创建令牌)。

TokenStream.LT您可以使用和方法查看通道 2 上的令牌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();
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)