Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander Preston committed Apr 24, 2012
2 parents 9995b40 + 06545d7 commit 940cd84
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 114 deletions.
6 changes: 4 additions & 2 deletions src/ThreadedDriver.java
@@ -1,6 +1,7 @@
import java.util.concurrent.ConcurrentLinkedQueue;

import org.zza.codegenerator.CodeGeneratingVisitor;
import org.zza.codegenerator.threeaddresscode.TerribleImplementationToGetTempUsageVisitor;
import org.zza.parser.CompilerParser;
import org.zza.parser.semanticstack.nodes.SemanticNode;
import org.zza.scanner.CompilerStateScanner;
Expand Down Expand Up @@ -42,8 +43,9 @@ public void run() {
final TypeCheckingVisitor typeChecker = new TypeCheckingVisitor();
typeChecker.visit(program);
// final CodeGeneratingVisitor code = new CodeGeneratingVisitor();
ThreeAddressCodeGenerator code = new ThreeAddressCodeGenerator();
code.visit(program);
// ThreeAddressCodeGenerator code = new ThreeAddressCodeGenerator();
TerribleImplementationToGetTempUsageVisitor code = new TerribleImplementationToGetTempUsageVisitor();
System.out.println(code.visit(program));
driver.endTime();
if(!warningList.isEmpty()) {
warningList.printWarnings();
Expand Down
@@ -1,8 +1,8 @@
package org.zza.codegenerator.threeaddresscode;

import org.zza.codegenerator.MemoryOutOfBoundsException;
import org.zza.codegenerator.ProgramFrame;
import org.zza.codegenerator.templates.IfRest3AC;
import java.util.HashMap;
import java.util.Map;

import org.zza.parser.semanticstack.nodes.*;
import org.zza.visitor.NodeVisitor;

Expand All @@ -12,36 +12,66 @@ public class TerribleImplementationToGetTempUsageVisitor extends NodeVisitor {
private int tempCount = 0;
private int lineNumber =0;
private int labelCount;
private HashMap<String, Map<String, Integer>> usage;
private int varDec =0;
private String scope;

public TerribleImplementationToGetTempUsageVisitor() {
usage = new HashMap<String, Map<String, Integer>>();
addToUsage("program");
}

private void addToUsage(String name) {
System.out.println("adding "+name+" to usage");
Map<String, Integer> newMap = new HashMap<String, Integer>();
newMap.put("locals", 0);
newMap.put("temps", 0);
usage.put(name, newMap);
}

private void addLocalsInUsage(String function, int count) {
usage.get(function).put("locals", usage.get(function).get("locals") + count);
}

private void addTempsInUsage(String function, int count) {
usage.get(function).put("temps", usage.get(function).get("temps") + count);
}

@Override
public String visit(ProgramNode node) {
scope = "program";
String parameters = node.getHeader().accept(this);
String[] splitParam = parameters.split(",");
addLocalsInUsage(scope, splitParam.length);

// System.out.println("*begin main program");
// try {
// manager.addStackFrame(new ProgramFrame(splitParam.length, 5, 5));
// } catch (MemoryOutOfBoundsException e) {
// e.printStackTrace();
// }
String body = node.getbody().accept(this);
addTempsInUsage(scope, tempCount);
tempCount = 0;
System.out.println("*end main program. Used: "+tempCount );
String declarations = node.getDeclarations().accept(this);
System.out.println("*program used "+(splitParam.length + varDec));
System.out.println(lineNumber + ": HALT 0,0,0");
System.out.println("\n\nusage map: \n"+usage);
return "program: \n"+declarations +"\n" +body;
}

@Override
public String visit(VariableDeclarationNode node) {
return handleTwoFieldNode(node, "vardec");
varDec ++;
return "vardec";
}

@Override
public String visit(FunctionNode node) {
String oldScope = scope;
String header = node.getHeader().accept(this);
System.out.println("*Entry function: " +header);

System.out.println("*Entry function: " +header + " tempcount: "+tempCount + " " +scope);
String body = node.getBody().accept(this);
System.out.println("*Finish function: "+header);
addTempsInUsage(scope, tempCount);
tempCount = 0;
System.out.println("*Finish function: "+header + " tempcount: "+tempCount);
scope = oldScope;
return "function : "+header + " " + body;
}

Expand All @@ -56,15 +86,6 @@ public String visit(ParameterNode node) {
public String visit(AssignmentExpressionNode node) {
String left = node.acceptVisitorLeftHand(this);
String right = node.acceptVisitorRightHand(this);
// try {
//// manager.addLocalVariable(left);
// } catch (MemoryOutOfBoundsException e) {
// e.printStackTrace();
// }
// Assignment3AC assign = new Assignment3AC(lineNumber, manager);
// assign.setParameters(right, left, "");
// lineNumber += assign.getEmittedSize();
// assign.emitCode();
return "assignment";
}

Expand All @@ -79,19 +100,6 @@ public String visit(CompoundStatementNode node) {

@Override
public String visit(DivisionExpressionNode node) {
// String temp = getNextTemporary();
//// try {
//// manager.addNewTemporaryVariable(temp);
//// } catch (MemoryOutOfBoundsException e) {
//// e.printStackTrace();
//// }
// String left = node.acceptVisitorLeftHand(this);
// String right = node.acceptVisitorRightHand(this);
//// Division3AC division = new Division3AC(lineNumber, manager);
//// division.setParameters(temp, left, right);
//// lineNumber += division.getEmittedSize();
//// division.emitCode();
// return temp;
return handleTwoFieldNode(node, "/");
}

Expand All @@ -107,56 +115,17 @@ public String visit(IntegerNode node) {

@Override
public String visit(MinusExpressionNode node) {
// String temp = getNextTemporary();
//// try {
//// manager.addNewTemporaryVariable(temp);
//// } catch (MemoryOutOfBoundsException e) {
//// e.printStackTrace();
//// }
// String left = node.acceptVisitorLeftHand(this);
// String right = node.acceptVisitorRightHand(this);
//// Subtraction3AC subtraction = new Subtraction3AC(lineNumber, manager);
//// subtraction.setParameters(temp, left, right);
//// lineNumber += subtraction.getEmittedSize();
//// subtraction.emitCode();
// return temp;
return handleTwoFieldNode(node, "-");
}


@Override
public String visit(MultiplicationExpressionNode node) {
// String temp = getNextTemporary();
//// try {
//// manager.addNewTemporaryVariable(temp);
//// } catch (MemoryOutOfBoundsException e) {
//// e.printStackTrace();
//// }
// String left = node.acceptVisitorLeftHand(this);
// String right = node.acceptVisitorRightHand(this);
// Multiplication3AC multiplication = new Multiplication3AC(lineNumber, manager);
// multiplication.setParameters(temp, left, right);
// lineNumber += multiplication.getEmittedSize();
// multiplication.emitCode();
// return temp;
return handleTwoFieldNode(node, "*");
}

@Override
public String visit(PlusExpressionNode node) {
// String temp = getNextTemporary();
// try {
// manager.addNewTemporaryVariable(temp);
// } catch (MemoryOutOfBoundsException e) {
// e.printStackTrace();
// }
// String left = node.acceptVisitorLeftHand(this);
// String right = node.acceptVisitorRightHand(this);
// Addition3AC addition = new Addition3AC(lineNumber, manager);
// addition.setParameters(temp, left, right);
// lineNumber += addition.getEmittedSize();
// addition.emitCode();
// return temp;
return handleTwoFieldNode(node, "+");
}

Expand All @@ -167,8 +136,7 @@ public String visit(RealNode node) {

@Override
public String visit(TypeNode node) {
// TODO Auto-generated method stub
return null;
return "";
}

@Override
Expand All @@ -185,7 +153,13 @@ public String visit(AllParametersNode node) {

@Override
public String visit(AllVariableDeclarationsNode node) {
return null;
String toReturn = "";

for (SemanticNode n : node.getArray()) {
toReturn += n.accept(this) + ",";
}

return trimEnd(toReturn);
}

@Override
Expand Down Expand Up @@ -218,14 +192,7 @@ public String visit(ComparisonNode node) {

@Override
public String visit(WhileExpressionNode node) {

return handleTwoFieldNode(node, "do");
// String whilePart = node.acceptVisitorLeftHand(this);
// String label = getNextLabel();
// System.out.println("whileLabel: "+label);
// String doPart = node.acceptVisitorRightHand(this);
// System.out.println("while: "+whilePart + " goto " +label);
// return "while";
}

@Override
Expand All @@ -240,28 +207,21 @@ public String visit(ProgramHeaderNode node) {

@Override
public String visit(DeclarationsNode node) {
String variableDec = node.getVariableDeclarations().accept(this);
addLocalsInUsage(scope, varDec);
varDec = 0;
String functionDec = node.getFunctionDeclarations().accept(this);
return functionDec;
}

@Override
public String visit(PrintStatementNode node) {
// String command = "print"+node.getArgument().accept(this);
String parameters = node.getArgument().accept(this);
// String[] params = parameters.split(",");
// Print3AC printer = null;
// for (String param : params) {
// printer = new Print3AC(lineNumber, manager);
// printer.setParameters(param, "", "");
// lineNumber += printer.getEmittedSize();
// printer.emitCode();
// }
return "print";
}

@Override
public String visit(FunctionCallNode node) {
// return handleTwoFieldNode(node, "funccall");
String params = node.acceptVisitorRightHand(this);
String name = node.acceptVisitorLeftHand(this);
System.out.println("BEGIN_CALL: \nPARAMS "+params + "\nCALL "+name);
Expand All @@ -270,7 +230,10 @@ public String visit(FunctionCallNode node) {

@Override
public String visit(FunctionHeadingNode node) {
// return handleThreeFieldNode(node, "", "");
scope = "function"+node.acceptVisitorLeftHand(this);
addToUsage(scope);
String[] count = node.getMiddle().accept(this).split(",");
addLocalsInUsage(scope, count.length);
return node.acceptVisitorLeftHand(this);

}
Expand All @@ -286,6 +249,11 @@ public String visit(AllFunctionDeclarationsNode node) {

@Override
public String visit(FunctionBodyNode node) {

String oldScope = scope;
String variableDec = node.getVariables().accept(this);
addLocalsInUsage(scope, varDec);

String functionBody = node.getBody().accept(this);
return functionBody;
}
Expand All @@ -298,22 +266,23 @@ public String visit(ReturnStatementNode node) {

@Override
public String visit(IfStatementNode node) {
// String ifPart = node.acceptVisitorLeftHand(this);
// String[] ifParts = ifPart.split(",");
// int oldLineNumber = lineNumber;
// lineNumber += 4;
// node.acceptVisitorMiddle(this);
// IfHeader3AC ifHeader = new IfHeader3AC(oldLineNumber, manager);
// ifHeader.setParameters(ifParts[0], ifParts[2], ifParts[1], lineNumber - oldLineNumber - 2);
// ifHeader.emitCode();
// oldLineNumber = lineNumber;
// lineNumber += 2;
// node.acceptVisitorRightHand(this);
//
// IfRest3AC ifRest = new IfRest3AC(oldLineNumber, manager);
// ifRest.setParameters("", "", "", lineNumber - oldLineNumber - 2);
// ifRest.emitCode();
return "if";
return handleThreeFieldNode(node, "", "");
//// String ifPart = node.acceptVisitorLeftHand(this);
//// String[] ifParts = ifPart.split(",");
//// int oldLineNumber = lineNumber;
//// lineNumber += 4;
//// node.acceptVisitorMiddle(this);
//// IfHeader3AC ifHeader = new IfHeader3AC(oldLineNumber, manager);
//// ifHeader.setParameters(ifParts[0], ifParts[2], ifParts[1], lineNumber - oldLineNumber - 2);
//// ifHeader.emitCode();
//// oldLineNumber = lineNumber;
//// lineNumber += 2;
//// node.acceptVisitorRightHand(this);
////
//// IfRest3AC ifRest = new IfRest3AC(oldLineNumber, manager);
//// ifRest.setParameters("", "", "", lineNumber - oldLineNumber - 2);
//// ifRest.emitCode();
// return "if";
}

@Override
Expand Down
1 change: 0 additions & 1 deletion src/org/zza/visitor/ThreeAddressCodeGenerator.java
Expand Up @@ -20,7 +20,6 @@ public class ThreeAddressCodeGenerator extends NodeVisitor {
private int labelCount = 0;
private int lineNumber = 0;
private DataMemoryManager manager;
private int globalCount = 0;


public ThreeAddressCodeGenerator() {
Expand Down

0 comments on commit 940cd84

Please sign in to comment.