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

时间:2017-08-22 21:32:21

标签: java algorithm sorting antlr antlr4

我有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]或整个树。 请帮帮我,告诉我如何将树复制到我的新树。

1 个答案:

答案 0 :(得分:0)

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

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

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