ANTLR java 如何从树节点或排序节点获取令牌



我对ANTLRv4有问题。我需要在 Antlr 解析树中按字母顺序对节点进行排序。

带有ANTLR实现的Klas:

public class Tokenizer {
public void tokenizer(String code, String path) {
ANTLRInputStream in = new ANTLRInputStream(code);
Java8Lexer lexer = new Java8Lexer(in);                     
CommonTokenStream tokens = new CommonTokenStream(lexer);   
Java8Parser parser = new Java8Parser(tokens);
parser.setBuildParseTree(true);        
ParserRuleContext t = parser.compilationUnit();
ParseTree tree = t;         
System.out.println("Sciezka0: " + tree.getChild(0).getChild(0).getChild(0).getChildCount());           
System.out.println("Sciezka1: " + tree.getChild(0).getChild(0).getChild(0).getChild(0));
System.out.println("Sciezka2: " + tree.getChild(0).getChild(0).getChild(0).getChild(1).toStringTree());
System.out.println("Sciezka3: " + tree.getChild(0).getChild(0).getChild(0).getChild(2).toStringTree());
System.out.println("Sciezka4: " + tree.getChild(0).getChild(0).getChild(0).getChild(3).toStringTree();         

}      
}

并树我需要排序的内容:https://i.stack.imgur.com/lIqbx.jpg

我的想法是创建新的树数据类并将递归子级从Antlr树复制到ArrayList,然后对数组进行排序并将Kids添加到新树中。 但是在这个挑战开始时我遇到了问题。我尝试了很多来自 ParseTree 类的方法从 ANTLR 树中获取节点,当我使用 .toString(( 方法时,我总是得到这样的东西 [794 790 785 728] 或整个树。 请帮助我并告诉我如何将树复制到我的新树中。

你的方法几乎是正确的。 你走在正确的轨道上。

我继续这样做的方法是:使用 Listener 类和像 List 这样的数据结构,只需在使用步行者遍历树时记录每个解析器规则的EnterExit事件。 然后,一旦进入规则的处理程序,正如您所说,递归遍历各种子树,直到到达终端(没有子节点(,将它们添加到列表中。 您可能会从任何重要的输入中获得重复项。

完成后删除重复的列表,或将列表复制到另一个排序列表,随时检查重复项,我认为您已完成。

相关内容

  • 没有找到相关文章

最新更新