我正在编码一个递归下降解析器,我需要将终端和非终端添加到树数据结构中,然后逐级打印出来。但是,我在以完全准确的方式打印树时遇到了麻烦。我相信是因为我的子节点未正确添加。
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
-}
好像无法将子代添加到子代节点?不知道这是怎么回事