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

问题描述:

我遇到ANTLRv4问题。我需要在Antlr解析树中按字母顺序排序节点。ANTLR java如何从树节点或排序节点获取令牌

与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

我有主意,以创建新的树,数据类和ANTLR的树拷贝递归孩子ArrayList中,然后将Array和addChildren排序到新树。 但我有这个challange开始时的问题。我尝试了很多来自ParseTree类的方法来从ANTLR树中获取节点,并且当我使用.toString()方法时,我总是得到类似[794 790 785 728]或整个树的东西。 请帮助我,告诉我如何将树复制到我的新树。

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

我会继续它的方式是:使用监听器类和数据结构就像一个列表,简单地记录要么EnterExit事件对每个解析器规则,你遍历学步车树。然后,如你所说,一旦在规则的处理程序中,递归地遍历各种子树,直到到达终端(没有子节点的节点),将它们添加到列表中。你可能会有重复的来自任何非平凡的输入。

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

+0

谢谢你的回答。 我实现了监听器和步行器,我认为它可以工作,但是他仍然不会向我返回任何名字或其中一个节点的实际数目。 他给了我这样的事情http://imgur.com/a/JE5TC 我的听众的实现仅仅是现在: 公共类AntlrJava8Listener扩展Java8BaseListener { \t @覆盖公共无效enterEveryRule(@NotNull ParserRuleContext ctx){ \t System.out.println(ctx.getStart()); \t } 如果我使用ctx.getText()返回他我很多的白线 – Daxter44

+0

我不明白什么号码的这个表的意思是,我认为它的令牌或规则的表,但是我怎么看这一点。对于同一棵树的表格,就像我在第一篇文章中展示的那样 – Daxter44