Добавление детей детей в дерево - PullRequest
0 голосов
/ 11 марта 2019

Я кодирую синтаксический анализатор рекурсивного спуска, и мне нужно добавить терминалы и нетерминалы в древовидную структуру данных, а затем распечатывать их уровень за уровнем. Однако у меня возникли проблемы с печатью моего дерева с полной точностью. Я считаю, что это потому, что мои дочерние узлы не добавляются правильно.

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
--}
-$

и так далее ... Однако, если я установлю root в main на

TreeNode<String> treeRoot = parser.block;

Я получаю

Block
-{
-Statement List
-}

Как будто я не могу добавить детей в дочерние узлы? Не уверен, что здесь происходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...