我有ANTLRv4的问题。我需要在Antlr解析树中按字母顺序排序节点。
Klas与ANTLR实施:
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();
}
}
树我需要排序的东西:http://imgur.com/a/tufRL
我想创建新的Tree-data类并将递归子节点从Antlr树复制到ArrayList,然后将Array和addChildren排序到新Tree。 但我在这个挑战的开始有问题。我尝试了很多来自ParseTree类的方法来从ANTLR树中获取节点,当我使用.toString()方法时,我总是得到类似这样的[794 790 785 728]或整个树。 请帮帮我,告诉我如何将树复制到我的新树。
答案 0 :(得分:0)
你的方法几乎是正确的。你走在正确的轨道上。
我继续使用的方法是:使用Listener类和List之类的数据结构,只需为每个解析器规则记录 Enter
或Exit
事件当你用助行器穿越树时。然后,一旦进入规则的处理程序,正如您所说,递归遍历各个子树,直到您到达终端(没有子节点的节点),将它们添加到列表中。您可能会从任何非平凡的输入中获得重复。
完成后重复删除列表,或将列表复制到另一个排序列表,检查重复项,我认为您已完成。