package esl.cuenet.mapper.tree;
import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class ParseTree implements IParseTree, IParseTreeCreator {
private String mappingsFile = null;
private ParseTreeNode document = new ParseTreeNode(IParseTreeNode.Type.ROOT, "document");
private Stack<ParseTreeNode> parentStack = new Stack<ParseTreeNode>();
private Logger logger = Logger.getLogger(ParseTree.class);
public ParseTree(String mappingsFile) {
this.mappingsFile = mappingsFile;
parentStack.add(document);
logger.info("Created Document Node");
}
@Override
public IParseTreeNode getDocument() {
return document;
}
@Override
public void addOperator(String label) {
if (parentStack.size() == 0) throw new RuntimeException("Premature stack underflow");
ParseTreeNode parent = parentStack.peek();
ParseTreeNode current = new ParseTreeNode(IParseTreeNode.Type.OPERATOR, label);
parent.addChild(current);
parentStack.add(current);
}
@Override
public void addOperand(String operandValue) {
ParseTreeNode parent = parentStack.peek();
ParseTreeNode current = new ParseTreeNode(IParseTreeNode.Type.OPERAND, operandValue);
parent.addChild(current);
}
@Override
public void startSExpression() {
}
@Override
public void endSExpression() {
if (parentStack.size() <= 1) throw new RuntimeException("endSExpression: premature stack underflow");
parentStack.pop();
}
@Override
public void eof() {
logger.info("Reached End of File");
}
@Override
public IParseTree getTree() {
return this;
}
private class ParseTreeNode implements IParseTreeNode {
Type type;
String label;
List<IParseTreeNode> children = null;
public ParseTreeNode() {
this.type = null;
this.label = null;
children = new ArrayList<IParseTreeNode>();
}
public ParseTreeNode(Type type, String label) {
this.type = type;
this.label = label;
children = new ArrayList<IParseTreeNode>();
}
public void addChild(IParseTreeNode node) {
children.add(node);
}
@Override
public Type getType() {
return type;
}
@Override
public String getLabel() {
return label;
}
@Override
public List<IParseTreeNode> children() {
return children;
}
}
}