Я кодирую синтаксический анализатор рекурсивного спуска, и мне нужно добавить терминалы и нетерминалы в древовидную структуру данных, а затем распечатывать их уровень за уровнем. Однако у меня возникли проблемы с печатью моего дерева с полной точностью. Я считаю, что это потому, что мои дочерние узлы не добавляются правильно.
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
-}
Как будто я не могу добавить детей в дочерние узлы? Не уверен, что здесь происходит