<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package edu.ufl.cise.cop5555.sp12.ast;

import edu.ufl.cise.cop5555.sp12.TokenStream.IllegalStringLiteralException;

/**
 * *Creates a String representing an AST.
 * 
 * Sample usage: AST tree = ... 
 *               ToStringVisitor pv = new ToStringVisitor();
 *               tree.visit(pv,""); 
 *               String s = pv.getString(); 
 *               System.out.println(s);
 * 
 */
public class ToStringVisitor implements ASTVisitor {// will implement all the Abstract methods in ASTVisitor
	private StringBuilder s = new StringBuilder();

	
	private String sh = "  "; // shift string

	public String getString() {
		return s.toString();
	}

	private void indent(String fi) {
		s.append(fi);
	}

	private void ln() {
		s.append("\n");
	}

	@Override
	public Object visitBlock(Block block, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("Block:");
		ln();
		if (block.decOrCommands.isEmpty()) {
			indent(fi);
			s.append("empty");
		} else {
			for (DecOrCommand cd : block.decOrCommands) {
				indent(fi);
				cd.visit(this, fi);
				ln();
			}
		}
		return null;
	}

	@Override
	public Object visitDeclaration(Declaration declaration, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("Declaration:");
		ln();
		indent(fi);
		declaration.type.visit(this, fi);
		ln();
		indent(fi);
		s.append("identifier=" + declaration.ident.getText());
		return null;
	}

	@Override
	public Object visitSimpleType(SimpleType simpleType, Object arg) {
		s.append("type=" + simpleType.type);
		return null;
	}

	@Override
	public Object visitCompoundType(CompoundType compoundType, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("type=[");
		compoundType.keyType.visit(this,fi);
		s.append(",");
		compoundType.valType.visit(this,fi);
		s.append("]");
		return null;
	}

	@Override
	public Object visitAssignExprCommand(AssignExprCommand assignExprCommand,
			Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("AssignExprCommand:");
		ln();
		indent(fi);
		s.append("lValue=");
		assignExprCommand.lValue.visit(this,fi); 
		ln();
		indent(fi);
		s.append("expression=");
		assignExprCommand.expression.visit(this,fi);
		return null;
	}

	@Override
	public Object visitAssignPairListCommand(
			AssignPairListCommand assignPairListCommand, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("AssignPairListCommand:");
		ln();
		indent(fi);
		s.append("lValue=");
		assignPairListCommand.lValue.visit(this,fi); 
		ln();
		indent(fi);
		s.append("pairList=");
		assignPairListCommand.pairList.visit(this,fi);
		return null;
	}

	@Override
	public Object visitPrintCommand(PrintCommand printCommand, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("PrintCommand:");
		ln();
		indent(fi);
		s.append("expression=");
		printCommand.expression.visit(this,fi); 
		return null;
	}

	@Override
	public Object visitPrintlnCommand(PrintlnCommand printlnCommand, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("PrintlnCommand:");
		ln();
		indent(fi);
		s.append("expression=");
		printlnCommand.expression.visit(this,fi); 
		return null;
	}

	@Override
	public Object visitDoCommand(DoCommand doCommand, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("DoCommand:");
		ln();
		indent(fi);
		s.append("expression=");
		doCommand.expression.visit(this,fi); 
		ln();
		indent(fi);
		s.append("block=");
		doCommand.block.visit(this,fi); 	
		return null;
	}

	@Override
	public Object visitDoEachCommand(DoEachCommand doEachCommand, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("DoEachCommand:");
		ln();
		indent(fi);
		s.append("lValue=");
		doEachCommand.lValue.visit(this,fi); 
		ln();
		indent(fi);
		s.append("key=");
		s.append(doEachCommand.key.getText());
		ln();
		indent(fi);
		s.append("val=");
		s.append(doEachCommand.val.getText());
		ln();
		indent(fi);
		s.append("block=");
		doEachCommand.block.visit(this,fi); 	
		return null;
	}

	@Override
	public Object visitIfCommand(IfCommand ifCommand, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("IfCommand:");
		ln();
		indent(fi);
		s.append("expression=");
		ifCommand.expression.visit(this,fi); 
		ln();
		indent(fi);
		s.append("block=");
		ifCommand.block.visit(this,fi); 	
		return null;
	}

	@Override
	public Object visitIfElseCommand(IfElseCommand ifElseCommand, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("IfElseCommand:");
		ln();
		indent(fi);
		s.append("expression=");
		ifElseCommand.expression.visit(this,fi); 
		ln();
		indent(fi);
		s.append("ifBlock=");
		ifElseCommand.ifBlock.visit(this,fi); 
		indent(fi);
		s.append("elseBlock=");
		ifElseCommand.elseBlock.visit(this,fi); 	
		return null;

	}

	@Override
	public Object visitSimpleLValue(SimpleLValue simpleLValue, Object arg) throws Exception {
		s.append("identifier=" + simpleLValue.identifier.getText());
		return null;
	}

	@Override
	public Object visitExprLValue(ExprLValue exprLValue, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("ExprLValue:"); 
		ln();
		indent(fi);
		s.append("identifier=" + exprLValue.identifier.getText());
		ln();
		indent(fi);
		s.append("expression=");
		exprLValue.expression.visit(this,fi);
		return null;
	}

	@Override
	public Object visitPair(Pair pair, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("Pair:");
		ln();
		indent(fi);
		s.append("expression0=");
		pair.expression0.visit(this,fi);
		ln();
		indent(fi);
		s.append("expression1=");
		pair.expression1.visit(this,fi);
		return null;
	}

	@Override
	public Object visitPairList(PairList pairList, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("PairList:");
		ln();
		if (pairList.pairs.isEmpty()) {
		indent(fi);
		s.append("empty");
	} else {
		for (Pair pair : pairList.pairs) {
			indent(fi);
			pair.visit(this, fi);
			ln();
		}
	}		
		return null;
	}

	@Override
	public Object visitLValueExpression(LValueExpression lValueExpression,
			Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("LValueExpression:");
		lValueExpression.lValue.visit(this,fi);
		return null;
	}

	@Override
	public Object visitIntegerLiteralExpression(
			IntegerLiteralExpression integerLiteralExpression, Object arg) throws NumberFormatException, IllegalStringLiteralException {
		s.append("IntegerLiteralExpr:");
		s.append(integerLiteralExpression.integerLiteral.getIntVal());
		return null;
	}

	@Override
	public Object visitBooleanLiteralExpression(
			BooleanLiteralExpression booleanLiteralExpression, Object arg) throws IllegalStringLiteralException {
		s.append("BooleanLiteralExpr:");
		s.append(booleanLiteralExpression.booleanLiteral.getText());
		return null;
	}

	@Override
	public Object visitStringLiteralExpression(
			StringLiteralExpression stringLiteralExpression, Object arg) throws IllegalStringLiteralException {
		s.append("StringLiteralExpr:");
		s.append(stringLiteralExpression.stringLiteral.getText());
		return null;
	}

	@Override
	public Object visitUnaryOpExpression(UnaryOpExpression unaryOpExpression,
			Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("UnaryOpExpression:");
		ln();
		indent(fi);
		s.append("op=" + unaryOpExpression.op);
		ln();
		indent(fi);
		s.append("expression1=");
		unaryOpExpression.expression.visit(this, fi);
		return null;
	}

	@Override
	public Object visitBinaryOpExpression(
			BinaryOpExpression binaryOpExpression, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("BinaryOpExpression:");
		ln();
		indent(fi);
		s.append("expression0=");
		binaryOpExpression.expression0.visit(this, fi);
		ln();
		indent(fi);
		s.append("op=" + binaryOpExpression.op);
		ln();
		indent(fi);
		s.append("expression1=");
		binaryOpExpression.expression1.visit(this, fi);
		return null;
	}

	@Override
	public Object visitProgram(Program program, Object arg) throws Exception {
		String indent = (String) arg;
		String fi = indent + sh;
		s.append("Program:");
		ln();
		indent(fi);
		s.append("identfier=" + program.ident.getText());
		ln();
		indent(fi);
		s.append("block=");
		program.block.visit(this,fi);
		return null;
	}

	public static void printAST(AST result) throws Exception {
		ToStringVisitor toStringVisitor = new ToStringVisitor();
		result.visit(toStringVisitor, " ");
		System.out.println(toStringVisitor.getString());
	}
	public static String getStringFromAST(AST result) throws Exception {
		ToStringVisitor toStringVisitor = new ToStringVisitor();
		result.visit(toStringVisitor, " ");
		return toStringVisitor.getString();
	}

	

}
</pre></body></html>