是否有一种简单的方法可以从解析器规则类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
获取令牌子集?
答案 0 :(得分:1)
所以,我忽略了ANTLRv4 API中的一些类及其变形。
上面提出的解决方案是正确的。此外,BufferedTokenStream
和CommonTokenStream
类具有方法public List<Token> getTokens(int start, int stop)
,允许从给定范围中检索标记列表(尤其是从ParserRuleContext
类的开始标记和停止标记之间的范围)
您可以使用实现ListTokenSource
接口的TokenSource
类。然后,您可以创建传递CommonTokenStream
的{{1}}类。
我将上述想法封装到以ListTokenSource
为特色的小代码示例中 - 一个ParserRuleRewriter
仅重写给定的解析器规则。在代码TokenStreamRewriter
中,参数是完整程序的令牌流。
tokenStream