将孩子的孩子添加到树中

时间:2019-03-11 18:42:12

标签: java parsing tree

我正在编码一个递归下降解析器,我需要将终端和非终端添加到树数据结构中,然后逐级打印出来。但是,我在以完全准确的方式打印树时遇到了麻烦。我相信是因为我的子节点未正确添加。

Parser.java

public class Parser {
    public TreeNode program;
    public TreeNode block;
    public TreeNode statementList;
    public TreeNode statement;
    ...
    public void parseProgram(ArrayList<Lexer.Token> tokens) {
        addProgramNode();
        ...
    }

    public TreeNode addProgramNode(){
        program = new TreeNode("Program");
        return program;
    }
   public void parseBlock(ArrayList<Lexer.Token> tokens) {
        addBlockNode();
        ...
        parseStatementList(tokens);
        ...
    }

    public TreeNode addBlockNode(){
        block = new TreeNode(program.addChild("Block"));
        return block;
    }
   public void parseStatementList(ArrayList<Lexer.Token> tokens) {
        if(epsilonProd == false){
          ...
          parseStatement(tokens);
          parseStatementList(tokens); 
          addStatementListNode();
    }

    public TreeNode addStatementListNode(){
        statementList = new TreeNode(block.addChild("Statement List"));
        return  statementList;
    }
...

我认为该错误不是我的打印方法造成的,但是为了清楚起见,我还是将其包括在内

TreeNode.java

    public void printTree(TreeNode<T> node){ // recursively print the tree
        String indent = createIndent(node.getLevel());
        System.out.println(indent + node.data);
        if(!node.children.isEmpty()) {
            System.out.println(node.data + " has " + children.size() + " children");
            for (int i = 0; i < node.children.size(); i++) {
                printTree(node.children.get(i));
            }
        }
        else{
            System.out.println("no children found for " + node.data);
        }
    }

我在Main.java中调用我的打印方法,您可以在这里看到

Main.java

Class Main {
    ...
    public static void main(String args[]){
        TreeNode<String> treeRoot = parser.program;
        treeRoot.printTree(treeRoot);
        System.out.println("\n");
        ...        
}

现在运行此命令,我得到

Program
-Block
-$

但是,输出应该类似于

Program
-Block
--{
--Statement List
---Statement List
---Statement
--}
-$

,依此类推... 但是,如果我将main的根目录设置为

TreeNode<String> treeRoot = parser.block;

我明白了

Block
-{
-Statement List
-}

好像无法将子代添加到子代节点?不知道这是怎么回事

0 个答案:

没有答案