从ParserRuleContext

时间:2016-11-10 13:41:36

标签: antlr antlr4

主要问题

是否有一种简单的方法可以从解析器规则类TokenStream中获取令牌列表(最好是以ParserRuleContext的形式)?

相关答案

在回答问题Traversal of tokens using ParserRuleContext in listener - ANTLR4时出现了这个解决方案:

ParserRuleContext pctx = ctx.getParent();
List<TerminalNode> nodes = pctx.getTokens(pctx.getStart(), pctx.getStop());

但ANTLRv4中没有签名ParserRuleContext::getTokens(Token, Token)的方法。

我的解决方案

我考虑过使用TokenStream方法从TokenStream:get(index: int)重新获取令牌列表,其中index值将设置为给定ParserRuleContext开头的一系列指标/停止令牌。

其他问题

有没有办法以TokenStream的形式从TokenStream获取令牌子集?

1 个答案:

答案 0 :(得分:1)

所以,我忽略了ANTLRv4 API中的一些类及其变形。

回答主要问题

上面提出的解决方案是正确的。此外,BufferedTokenStreamCommonTokenStream类具有方法public List<Token> getTokens(int start, int stop),允许从给定范围中检索标记列表(尤其是从ParserRuleContext类的开始标记和停止标记之间的范围)

回答其他问题

您可以使用实现ListTokenSource接口的TokenSource类。然后,您可以创建传递CommonTokenStream的{​​{1}}类。

ParserRuleRewriter的代码示例

我将上述想法封装到以ListTokenSource为特色的小代码示例中 - 一个ParserRuleRewriter仅重写给定的解析器规则。在代码TokenStreamRewriter中,参数是完整程序的令牌流。

tokenStream