我已将我的评论包含在 ANTLR 4 中的一个单独频道中。在我的情况下,它是频道 2。
这是我的词法分析器语法。
COMMENT: '/*' .*? '*/' -> channel(2)
;
我想访问此频道 2 并在此频道上进行解析以积累评论。所以我把它包括在解析语法中,如下所示:
comment
:COMMENT
;
在节目中
string s = " paring string"
AntlrInputStream input = new AntlrInputStream(s);
CSSLexer lexer = new CSSLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer,2);
然后我想对令牌进行解析
var xr = parser.comment().GetRuleContexts<CommentContext>();
因为我想从 CommentContext 对象中获取信息,例如Start.Column
等。
编辑:
这是改进的问题
更具体地说,我想获取通道 2 中的所有标记并使用注释语法对其进行解析,以将所有注释获取到一个 list( IReadOnly<CommentContext>
) 中,以便我可以遍历其中的每一个并访问诸如起始行之类的信息,开始列、结束行结束列和标记文本。
CommonTokenStream tokens = new CommonTokenStream(lexer,2);
这并没有给我通道 2 中的标记。我发现的另一件事是,直到这些标记作为参数传递给解析器构造XParser parser = new XParser(tokens);
然后只有我可以通过调用访问令牌GetTokens()
。在令牌中,我可以看到有被标识为令牌的评论并且在频道 2 中。即使CommentTokenStrem
如上所述指定频道号。它包含所有令牌。
在使用令牌创建解析器对象之前无法访问令牌的原因是什么?
我想
CommentTokenStrem
在通道 2 中获取一个并将其传递给 XParser 对象创建,以使用我的comment
语法解析这些标记。在 ANTLR 4 API 中执行此操作的最佳方法是什么?