summaryrefslogtreecommitdiff
path: root/boil
diff options
context:
space:
mode:
Diffstat (limited to 'boil')
-rw-r--r--boil/library/BoilSimp.java970
-rw-r--r--boil/library/BoilVisitor.java89
-rw-r--r--boil/tests/ex42.java2
-rw-r--r--boil/tests/ex44.java3
4 files changed, 56 insertions, 1008 deletions
diff --git a/boil/library/BoilSimp.java b/boil/library/BoilSimp.java
deleted file mode 100644
index 4763834..0000000
--- a/boil/library/BoilSimp.java
+++ /dev/null
@@ -1,970 +0,0 @@
-package boil.library;
-
-import syntaxtree.*;
-import visitor.*;
-import st.*;
-import misc.*;
-import java.util.*;
-
-public class BoilSimp extends GJDepthFirst<String,String> {
-
- private String vapor; // the collected vapor program
- private TypeFactory tf; // the shared type generator
- private int id;
- private SymbolTable symt;
-
- public BoilSimp(SymbolTable symt) {
- this.symt = symt;
- this.vapor = "";
- this.tf = new TypeFactory();
- this.id = 0;
- }
-
- public String getVapor() {
- return this.vapor;
- }
-
- public int getVarIndex(ClassInstance cls, TypeInstance type) {
- /**
- * Returns the index of the attribute in the class, or a negative number
- * if it is not included.
- */
- int attr_index = -1;
- if (cls != null &&
- ((attr_index = cls.getLocals().indexOf(type)) >= 0)) {
- attr_index += cls.getMethods().size() * 4;
- }
- return attr_index;
- }
-
- //
- // Auto class visitors--probably don't need to be overridden.
- //
- public String visit(NodeList n, String args) {
- String mod = "";
- int _count=0;
- for ( Enumeration<Node> e = n.elements(); e.hasMoreElements(); ) {
- mod += e.nextElement().accept(this,args);
- _count++;
- }
- return mod;
- }
-
- public String visit(NodeListOptional n, String args) {
- String mod = "";
- if ( n.present() ) {
- int _count=0;
- for ( Enumeration<Node> e = n.elements(); e.hasMoreElements(); ) {
- mod += e.nextElement().accept(this,args);
- _count++;
- }
- return mod;
- }
- else
- return "";
-
- }
-
- public String visit(NodeOptional n, String args) {
- if ( n.present() )
- return n.node.accept(this,args);
- else
- return "";
- }
-
- public String visit(NodeSequence n, String args) {
- String mod = "";
- int _count=0;
- for ( Enumeration<Node> e = n.elements(); e.hasMoreElements(); ) {
- e.nextElement().accept(this,args);
- _count++;
- }
- return mod;
- }
-
- public String visit(NodeToken n, String args) { return ""; }
-
- //
- // User-generated visitor methods below
- //
-
- /**
- * f0 -> MainClass()
- * f1 -> ( TypeDeclaration() )*
- * f2 -> <EOF>
- */
- public String visit(Goal n, String args) {
- String mod = "";
- ///////////////////////////////////////////////////////////////
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- ///////////////////////////////////////////////////////////////
- return mod;
- }
-
- /**
- * f0 -> "class"
- * f1 -> Identifier()
- * f2 -> "{"
- * f3 -> "public"
- * f4 -> "static"
- * f5 -> "void"
- * f6 -> "main"
- * f7 -> "("
- * f8 -> "String"
- * f9 -> "["
- * f10 -> "]"
- * f11 -> Identifier()
- * f12 -> ")"
- * f13 -> "{"
- * f14 -> ( VarDeclaration() )*
- * f15 -> ( Statement() )*
- * f16 -> "}"
- * f17 -> "}"
- */
- public String visit(MainClass n, String args) {
- String id = n.f1.f0.tokenImage;
- ///////////////////////////////////////////////////////////////
- this.symt.setActive(TypeEnum.classname, id);
- this.symt.setActive(TypeEnum.method, "main");
- this.tf.reset();
- String mod = "";
- this.vapor += "func Main()\n";
-
- n.f0.accept(this, args);
- n.f1.accept(this, args); // throw class name away
- n.f2.accept(this, args);
- n.f3.accept(this, args);
- n.f4.accept(this, args);
- n.f5.accept(this, args);
- n.f6.accept(this, args);
- n.f7.accept(this, args);
- n.f8.accept(this, args);
- n.f9.accept(this, args);
- n.f10.accept(this, args);
- n.f11.accept(this, args); // throw boiler 'args' variable away
- n.f12.accept(this, args);
- n.f13.accept(this, args);
- n.f14.accept(this, args); // FIXME
- n.f15.accept(this, args);
- n.f16.accept(this, args);
- n.f17.accept(this, args);
-
- this.vapor += " goto :exit\nerror:\n" +
- " Error(\"Mem exhausted\")\n goto :exit\n" +
- "exit:\n ret\n\n";
-
- this.symt.removeActive(TypeEnum.method);
- ///////////////////////////////////////////////////////////////
- return mod;
- }
-
- /**
- * f0 -> ClassDeclaration()
- * | ClassExtendsDeclaration()
- */
- public String visit(TypeDeclaration n, String args) {
- String mod = "";
- ///////////////////////////////////////////////////////////////
- n.f0.accept(this, args);
- ///////////////////////////////////////////////////////////////
- return mod;
- }
-
- /**
- * f0 -> "class"
- * f1 -> Identifier()
- * f2 -> "{"
- * f3 -> ( VarDeclaration() )*
- * f4 -> ( MethodDeclaration() )*
- * f5 -> "}"
- */
- public String visit(ClassDeclaration n, String args) {
- String id = n.f1.f0.tokenImage;
- String mod = "";
- ///////////////////////////////////////////////////////////////
- this.symt.setActive(TypeEnum.classname, id);
-
-
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- this.vapor += String.format("const functable_%s\n", id);
- for (MethodInstance mtd : this.symt.getClass(id).getMethods()) {
- this.vapor += String.format(" :%s_%s\n", id, mtd);
- }
- this.vapor += "\n";
- n.f2.accept(this, args);
- // n.f3.accept(this, args);
- n.f4.accept(this, args);
- n.f5.accept(this, args);
-
- return mod;
- }
-
- /**
- * f0 -> "class"
- * f1 -> Identifier()
- * f2 -> "extends"
- * f3 -> Identifier()
- * f4 -> "{"
- * f5 -> ( VarDeclaration() )*
- * f6 -> ( MethodDeclaration() )*
- * f7 -> "}"
- */
- public String visit(ClassExtendsDeclaration n, String args) {
- String id = n.f1.f0.tokenImage;
- this.symt.setActive(TypeEnum.classname, id);
- String mod = "";
-
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- n.f3.accept(this, args);
- n.f4.accept(this, args);
- n.f5.accept(this, args);
- n.f6.accept(this, args);
- n.f7.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> Type()
- * f1 -> Identifier()
- * f2 -> ";"
- */
- public String visit(VarDeclaration n, String args) {
- String mod = "";
-
- String cls = n.f0.accept(this, args);
- String id = n.f1.f0.tokenImage;
- TypeInstance t = this.symt.getType(id);
-
- if (!cls.isEmpty()) {
- this.vapor += String.format(" %s = HeapAllocZ(%d)\n",
- this.tf.alias(t.getName()),
- t.getSize());
- // this.vapor += String.format(" if0 %s goto :error\n",
- // this.tf.alias(this.symt.getType(id).getName()));
- }
- n.f2.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "public"
- * f1 -> Type()
- * f2 -> Identifier()
- * f3 -> "("
- * f4 -> ( FormalParameterList() )?
- * f5 -> ")"
- * f6 -> "{"
- * f7 -> ( VarDeclaration() )*
- * f8 -> ( Statement() )*
- * f9 -> "return"
- * f10 -> Expression()
- * f11 -> ";"
- * f12 -> "}"
- */
- public String visit(MethodDeclaration n, String args) {
- String id = n.f2.f0.tokenImage;
- this.symt.setActive(TypeEnum.method, id);
- this.tf.reset();
- String mod = "";
-
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- this.vapor += "func " + this.symt.getActive(TypeEnum.classname) + "_" + id + "(this";
- n.f3.accept(this, args);
- String argu = n.f4.accept(this, args);
- this.vapor += String.format("%s)\n", argu);
- n.f5.accept(this, args);
- n.f6.accept(this, args);
-
- // spill out all class attributes, if they're not used, who cares
- this.vapor += String.format(" %s = this\n",
- this.tf.alias(Integer.toString(this.id++)));
- ClassInstance parent = this.symt.getMethod(id).getClassInstance();
- int attr_index = parent.getMethods().size() * 4;
- for (TypeInstance attr : parent.getLocals()) {
- this.vapor += String.format(" %s = [%s+%d]\n",
- this.tf.alias(attr.getName()),
- this.tf.alias(Integer.toString(this.id-1)),
- attr_index);
- attr_index += 4;
- }
-
- n.f7.accept(this, args);
- n.f8.accept(this, args);
- n.f9.accept(this, args);
- String ret = n.f10.accept(this, args);
- n.f11.accept(this, args);
- n.f12.accept(this, args);
-
- // minor cleanup
- if (n.f10.f0.which == 8 && // primary expression
- ((PrimaryExpression) n.f10.f0.choice).f0.which == 3) {
-
- TypeInstance sym = this.symt.getType(((Identifier) ((PrimaryExpression) n.f10.f0.choice).f0.choice).f0.tokenImage);
- ClassInstance cls = symt.getClass(symt.getActive(TypeEnum.classname));
-
- if ((attr_index = this.getVarIndex(cls, sym)) >=0) {
- ret = String.format("[%s+%d]",
- ret,
- attr_index);
- }
- }
-
- this.vapor += String.format(" %s = %s\n ret %s\n\n",
- this.tf.alias(Integer.toString(this.id++)),
- ret,
- this.tf.alias(Integer.toString(this.id-1)));
-
- this.symt.removeActive(TypeEnum.method);
- return mod;
- }
-
- /**
- * f0 -> FormalParameter()
- * f1 -> ( FormalParameterRest() )*
- */
- public String visit(FormalParameterList n, String args) {
- String mod = "";
- String arg = n.f0.accept(this, args);
- if (arg != null)
- mod += " " + arg;
- mod += n.f1.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> Type()
- * f1 -> Identifier()
- */
- public String visit(FormalParameter n, String args) {
- String mod = "";
- mod += n.f0.accept(this, args);
- mod += n.f1.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> ","
- * f1 -> FormalParameter()
- */
- public String visit(FormalParameterRest n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- String arg = n.f1.accept(this, args);
- if (arg != null)
- mod += " " + arg;
- return mod;
- }
-
- /**
- * f0 -> ArrayType()
- * | BooleanType()
- * | IntegerType()
- * | Identifier()
- */
- public String visit(Type n, String args) {
- String mod = "";
- mod += n.f0.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "int"
- * f1 -> "["
- * f2 -> "]"
- */
- public String visit(ArrayType n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "boolean"
- */
- public String visit(BooleanType n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "int"
- */
- public String visit(IntegerType n, String args) {
- String mod = "";
- n.f0.accept(this, args);;
- return mod;
- }
-
- /**
- * f0 -> Block()
- * | AssignmentStatement()
- * | ArrayAssignmentStatement()
- * | IfStatement()
- * | WhileStatement()
- * | PrintStatement()
- */
- public String visit(Statement n, String args) {
- String mod = "";
- mod += n.f0.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "{"
- * f1 -> ( Statement() )*
- * f2 -> "}"
- */
- public String visit(Block n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> Identifier()
- * f1 -> "="
- * f2 -> Expression()
- * f3 -> ";"
- */
- public String visit(AssignmentStatement n, String args) {
- String mod = "";
-
- String lhs = n.f0.accept(this, args);
- String id = n.f0.f0.tokenImage;
-
- n.f1.accept(this, args);
- String expr = n.f2.accept(this, args);
- n.f3.accept(this, args);
-
- TypeInstance t = this.symt.getType(id);
- ClassInstance cls = this.symt.getClass(this.symt.getActive(TypeEnum.classname));
-
- int attr_index = 0;
- if (expr.contains("functable") // is this an allocation... :)
- ) {
- lhs = String.format("[%s+%d]",
- lhs,
- attr_index);
- }
-
-
- this.vapor += String.format(" %s = %s\n",
- lhs,
- expr);
-
- return mod;
- }
-
- /**
- * f0 -> Identifier()
- * f1 -> "["
- * f2 -> Expression()
- * f3 -> "]"
- * f4 -> "="
- * f5 -> Expression()
- * f6 -> ";"
- */
- public String visit(ArrayAssignmentStatement n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- n.f3.accept(this, args);
- n.f4.accept(this, args);
- n.f5.accept(this, args);
- n.f6.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "if"
- * f1 -> "("
- * f2 -> Expression()
- * f3 -> ")"
- * f4 -> Statement()
- * f5 -> "else"
- * f6 -> Statement()
- */
- public String visit(IfStatement n, String args) {
- String mod = "";
- int if_id = this.id++;
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- String cond = n.f2.accept(this, args);
-
- vapor += String.format(" %s = %s\n",
- this.tf.alias(Integer.toString(this.id++)),
- cond);
- vapor += String.format(" if0 %s goto :if%d_else\nif%d_body:\n",
- this.tf.alias(Integer.toString(this.id-1)),
- if_id,
- if_id);
-
- n.f3.accept(this, args);
- n.f4.accept(this, args);
-
- vapor += String.format(" goto :if%d_end\nif%d_else:\n",
- if_id,
- if_id);
-
- n.f5.accept(this, args);
- n.f6.accept(this, args);
-
- vapor += String.format("if%d_end:\n",
- if_id);
-
- return mod;
- }
-
- /**
- * f0 -> "while"
- * f1 -> "("
- * f2 -> Expression()
- * f3 -> ")"
- * f4 -> Statement()
- */
- public String visit(WhileStatement n, String args) {
- String mod = "";
- int while_id = this.id++;
- vapor += String.format("while%d_test:\n",
- while_id);
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- String expr = n.f2.accept(this, args);
- vapor += String.format(" %s = %s\n",
- this.tf.alias(Integer.toString(this.id++)),
- expr);
- vapor += String.format(" if0 %s goto :while%d_end\nwhile%d_body:\n",
- this.tf.alias(Integer.toString(this.id-1)),
- while_id,
- while_id);
-
- n.f3.accept(this, args);
- n.f4.accept(this, args);
-
- vapor += String.format(" goto :while%d_test\nwhile%d_end:\n",
- while_id,
- while_id);
- return mod;
- }
-
- /**
- * f0 -> "System.out.println"
- * f1 -> "("
- * f2 -> Expression()
- * f3 -> ")"
- * f4 -> ";"
- */
- public String visit(PrintStatement n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- String expr = n.f2.accept(this, args);
- n.f3.accept(this, args);
- n.f4.accept(this, args);
-
- vapor += String.format(" %s = %s\n",
- this.tf.alias(Integer.toString(this.id++)),
- expr);
-
- vapor += String.format(" PrintIntS(%s)\n",
- this.tf.retrieveRecentList(1));
- return mod;
- }
-
- /**
- * f0 -> AndExpression()
- * | CompareExpression()
- * | PlusExpression()
- * | MinusExpression()
- * | TimesExpression()
- * | ArrayLookup()
- * | ArrayLength()
- * | MessageSend()
- * | PrimaryExpression()
- */
- public String visit(Expression n, String args) {
- String mod = "";
- mod += n.f0.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> PrimaryExpression()
- * f1 -> "&&"
- * f2 -> PrimaryExpression()
- */
- public String visit(AndExpression n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> PrimaryExpression()
- * f1 -> "<"
- * f2 -> PrimaryExpression()
- */
- public String visit(CompareExpression n, String args) {
- String mod = "";
- String oper1 = n.f0.accept(this, args);
- n.f1.accept(this, args);
- String oper2 = n.f2.accept(this, args);
-
- mod += String.format("LtS(%s %s)",
- oper1,
- oper2);
- return mod;
- }
-
- /**
- * f0 -> PrimaryExpression()
- * f1 -> "+"
- * f2 -> PrimaryExpression()
- */
- public String visit(PlusExpression n, String args) {
- String mod = "";
- String oper1 = n.f0.accept(this, args);
- n.f1.accept(this, args);
- String oper2 = n.f2.accept(this, args);
-
- mod += String.format("Add(%s %s)",
- oper1,
- oper2);
-
- return mod;
- }
-
- /**
- * f0 -> PrimaryExpression()
- * f1 -> "-"
- * f2 -> PrimaryExpression()
- */
- public String visit(MinusExpression n, String args) {
- String mod = "";
- String oper1 = n.f0.accept(this, args);
- n.f1.accept(this, args);
- String oper2 = n.f2.accept(this, args);
-
- mod += String.format("Sub(%s %s)",
- oper1,
- oper2);
-
-
- return mod;
- }
-
- /**
- * f0 -> PrimaryExpression()
- * f1 -> "*"
- * f2 -> PrimaryExpression()
- */
- public String visit(TimesExpression n, String args) {
- String mod = "";
- String oper1 = n.f0.accept(this, args);
- n.f1.accept(this, args);
- String oper2 = n.f2.accept(this, args);
-
- mod += String.format("MulS(%s %s)",
- oper1,
- oper2);
-
-
- return mod;
- }
-
- /**
- * f0 -> PrimaryExpression()
- * f1 -> "["
- * f2 -> PrimaryExpression()
- * f3 -> "]"
- */
- public String visit(ArrayLookup n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- n.f3.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> PrimaryExpression()
- * f1 -> "."
- * f2 -> "length"
- */
- public String visit(ArrayLength n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> PrimaryExpression()
- * f1 -> "."
- * f2 -> Identifier()
- * f3 -> "("
- * f4 -> ( ExpressionList() )?
- * f5 -> ")"
- */
- public String visit(MessageSend n, String args) {
- // if you have to read this, good luck
- String mod = "";
-
- String id;
- String id2 = n.f2.f0.tokenImage;
- TypeInstance cur;
- ClassInstance cls;
- switch (n.f0.f0.which) {
- case 3:
- id = ((Identifier) n.f0.f0.choice).f0.tokenImage;
- cur = this.symt.getType(id);
- break;
- case 4:
- id = n.f0.accept(this, args);
- String call_tmp = this.tf.alias(Integer.toString(this.id++));
- this.vapor += n.f4.accept(this, args);
- vapor += String.format(" %s = call %s(this",
- call_tmp,
- id);
-
- vapor += String.format(" %s)\n",
- this.tf.retrieveRecentList(this.symt.getMethod(id2)
- .getArguments()
- .size()));
-
- return call_tmp;
- case 6:
- id = n.f0.accept(this, args);
- cur = new TypeInstance(Integer.toString(this.id++), TypeEnum.ERROR);
- cur.addClassInstance(this.symt.getClass(id.substring(id.indexOf('_')+1)));
-
- this.vapor += String.format(" %s = HeapAllocZ(%d)\n",
- this.tf.alias(cur.getName()),
- cur.getSize());
- // this.vapor += String.format(" if0 %s goto :error\n",
- // this.tf.alias(cur.getName()));
-
- this.vapor += String.format(" [%s+%d] = %s\n",
- this.tf.alias(cur.getName()),
- 0,
- id);
- break;
- default:
- System.out.println("ERROR! MessageSend is not implemented for passed case! :(");
- id = null;
- cur = null;
- }
-
- n.f1.accept(this, args);
- String tp1 = Integer.toString(this.id++); // TypeFactory likes to know who it's renting to
- String tp2 = Integer.toString(this.id++);
-
- MinimalLogger.warning("id " + id);
- MinimalLogger.warning("cur " + cur);
- int mtdIndex = cur.getClassInstance().getMethods()
- .indexOf(this.symt.getMethod(id2)) * 4;
-
- this.vapor += String.format(" %s = [%s+%d]\n",
- this.tf.alias(tp1),
- this.tf.alias(cur.getName()),
- 0);
-
- this.vapor += String.format(" %s = [%s+%d]\n",
- this.tf.alias(tp2),
- this.tf.alias(tp1),
- mtdIndex);
-
- n.f3.accept(this, args);
- this.vapor += n.f4.accept(this, args);
- n.f5.accept(this, args);
-
- mod += String.format("call %s(%s",
- this.tf.alias(tp2),
- this.tf.alias(cur.getName()));
-
- mod += String.format(" %s)",
- this.tf.retrieveRecentList(this.symt.getMethod(id2)
- .getArguments()
- .size()));
-
- return mod;
- }
-
- /**
- * f0 -> Expression()
- * f1 -> ( ExpressionRest() )*
- */
- public String visit(ExpressionList n, String args) {
- String mod = "";
- String rhs = n.f0.accept(this, args);
-
- mod += String.format(" %s = %s\n",
- this.tf.alias(Integer.toString(this.id++)),
- rhs);
-
- mod += n.f1.accept(this, args);
-
- return mod;
- }
-
- /**
- * f0 -> ","
- * f1 -> Expression()
- */
- public String visit(ExpressionRest n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- String rhs = n.f1.accept(this, args);
-
- mod += String.format(" %s = %s\n",
- this.tf.alias(Integer.toString(this.id++)),
- rhs);
-
- return mod;
- }
-
- /**
- * f0 -> IntegerLiteral()
- * | TrueLiteral()
- * | FalseLiteral()
- * | Identifier()
- * | ThisExpression()
- * | ArrayAllocationExpression()
- * | AllocationExpression()
- * | NotExpression()
- * | BracketExpression()
- */
- public String visit(PrimaryExpression n, String args) {
- String mod = "";
- mod += n.f0.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> <INTEGER_LITERAL>
- */
- public String visit(IntegerLiteral n, String args) {
- String mod = "";
- mod += n.f0.tokenImage;
- return mod;
- }
-
- /**
- * f0 -> "true"
- */
- public String visit(TrueLiteral n, String args) {
- String mod = "";
- mod += "1";
- return mod;
- }
-
- /**
- * f0 -> "false"
- */
- public String visit(FalseLiteral n, String args) {
- String mod = "";
- mod += "0";
- return mod;
- }
-
- /**
- * f0 -> <IDENTIFIER>
- */
- public String visit(Identifier n, String args) {
- String mod = "";
- return this.tf.alias(n.f0.tokenImage);
- }
-
- /**
- * f0 -> "this"
- */
- public String visit(ThisExpression n, String args) {
- String mod = "";
- vapor += String.format(" %s = [this]\n",
- this.tf.alias(Integer.toString(this.id++)));
- vapor += String.format(" %s = [%s+%d]\n",
- this.tf.alias(Integer.toString(this.id-1)),
- this.tf.alias(Integer.toString(this.id-1)),
- 0);
- mod += this.tf.alias(Integer.toString(this.id-1));
- return mod;
- }
-
- /**
- * f0 -> "new"
- * f1 -> "int"
- * f2 -> "["
- * f3 -> Expression()
- * f4 -> "]"
- */
- public String visit(ArrayAllocationExpression n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- n.f2.accept(this, args);
- n.f3.accept(this, args);
- n.f4.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "new"
- * f1 -> Identifier()
- * f2 -> "("
- * f3 -> ")"
- */
- public String visit(AllocationExpression n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- mod += String.format(":functable_%s",
- n.f1.f0.tokenImage);
-
- // System.out.println(vapor);
- n.f2.accept(this, args);
- n.f3.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "!"
- * f1 -> Expression()
- */
- public String visit(NotExpression n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- n.f1.accept(this, args);
- return mod;
- }
-
- /**
- * f0 -> "("
- * f1 -> Expression()
- * f2 -> ")"
- */
- public String visit(BracketExpression n, String args) {
- String mod = "";
- n.f0.accept(this, args);
- mod += n.f1.accept(this, args);
- n.f2.accept(this, args);
- return mod;
- }
-
-}
diff --git a/boil/library/BoilVisitor.java b/boil/library/BoilVisitor.java
index 83b1fd3..2542cc0 100644
--- a/boil/library/BoilVisitor.java
+++ b/boil/library/BoilVisitor.java
@@ -105,6 +105,8 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
n.f0.accept(this, argu);
n.f1.accept(this, argu);
n.f2.accept(this, argu);
+
+ this.addVapor(String.format("func AllocArray(size)\n bytes = MulS(size 4)\n bytes = Add(bytes 4)\n v = HeapAllocZ(bytes)\n [v] = size\n ret v\n"));
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
@@ -294,20 +296,6 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
String para = n.f4.accept(this, argu);
this.addVapor(String.format("%s)\n", para));
- // spill out all class attributes, if they're not used, who cares
- String selfID = this.getUniqueID();
- this.addVapor(String.format(" %s = this\n",
- this.tf.alias(selfID)));
- ClassInstance parent = this.symt.getMethod(id).getClassInstance();
- int attr_index = parent.getMethods().size() * 4;
- for (TypeInstance attr : parent.getLocals()) {
- this.addVapor(String.format(" %s = [%s+%d]\n",
- this.tf.alias(attr.getName()),
- this.tf.alias(selfID),
- attr_index));
- attr_index += 4;
- }
-
n.f7.accept(this, argu);
n.f8.accept(this, argu);
String ret = n.f10.accept(this, argu);
@@ -492,12 +480,9 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
*/
public String visit(AssignmentStatement n, String argu) {
String _ret=null;
- String id = n.f0.f0.tokenImage;
- MinimalLogger.info(String.format("-> %s (%s)",
- n.getClass().getSimpleName(),
- id));
+ MinimalLogger.info(String.format("-> %s",
+ n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- TypeInstance t = this.symt.getType(id);
String lhs = n.f0.accept(this, argu);
String expr = n.f2.accept(this, argu);
@@ -511,9 +496,8 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
lhs,
expr));
///////////////////////////////////////////////////////////////
- MinimalLogger.info(String.format("<- %s (%s)",
- n.getClass().getSimpleName(),
- id));
+ MinimalLogger.info(String.format("<- %s",
+ n.getClass().getSimpleName()));
return _ret;
}
@@ -531,9 +515,14 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
MinimalLogger.info(String.format("-> %s",
n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- n.f0.accept(this, argu);
- n.f2.accept(this, argu);
- n.f5.accept(this, argu);
+ String lhs = n.f0.accept(this, argu);
+ int index = Integer.parseInt(n.f2.accept(this, argu)) * 4;
+ String expr = n.f5.accept(this, argu);
+
+ this.addVapor(String.format(" [%s+%d] = %s\n",
+ lhs,
+ index,
+ expr));
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
@@ -792,12 +781,15 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
* f3 -> "]"
*/
public String visit(ArrayLookup n, String argu) {
- String _ret=null;
+ String _ret="";
MinimalLogger.info(String.format("-> %s",
n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- n.f0.accept(this, argu);
- n.f2.accept(this, argu);
+ String arr = n.f0.accept(this, argu);
+ int index = Integer.parseInt(n.f2.accept(this, argu)) * 4;
+ _ret += String.format("[%s+%d]",
+ arr,
+ index);
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
@@ -811,11 +803,13 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
* f2 -> "length"
*/
public String visit(ArrayLength n, String argu) {
- String _ret=null;
+ String _ret="";
MinimalLogger.info(String.format("-> %s",
n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- n.f0.accept(this, argu);
+ String arr = n.f0.accept(this, argu);
+ _ret += String.format("[%s+0]",
+ arr);
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
@@ -899,6 +893,8 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
0);
MinimalLogger.info("Calculating method index to call...");
+ MinimalLogger.severe("t: " + t);
+ MinimalLogger.severe("t.getClassInstance() " + t.getClassInstance());
int mtdIndex = t.getClassInstance().getMethods()
.indexOf(this.symt.getMethod(mtd)) * 4;
@@ -1043,13 +1039,28 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
*/
public String visit(Identifier n, String argu) {
String _ret="";
- MinimalLogger.info(String.format("-> %s",
- n.getClass().getSimpleName()));
+ String id = n.f0.tokenImage;
+ MinimalLogger.info(String.format("-> %s (%s)",
+ n.getClass().getSimpleName(),
+ id));
///////////////////////////////////////////////////////////////
- _ret += this.tf.alias(n.f0.tokenImage);
+ ClassInstance cur = this.symt.getClass(this.symt.getActive(TypeEnum.classname));
+ TypeInstance t = this.symt.getType(id);
+ if (cur.getLocals().contains(t)) {
+ MinimalLogger.info(String.format("Getting the index for local variable %s",
+ id));
+ // calculate the attr index!
+ int attr_index = (cur.getMethods().size() * 4);
+ attr_index += cur.getLocals().indexOf(t);
+ _ret += String.format("[this+%d]",
+ attr_index);
+ } else {
+ _ret += this.tf.alias(id);
+ }
///////////////////////////////////////////////////////////////
- MinimalLogger.info(String.format("<- %s with %s",
+ MinimalLogger.info(String.format("<- %s (%s) with %s",
n.getClass().getSimpleName(),
+ id,
_ret));
return _ret;
}
@@ -1081,11 +1092,17 @@ public class BoilVisitor extends GJDepthFirst<String,String> {
* f4 -> "]"
*/
public String visit(ArrayAllocationExpression n, String argu) {
- String _ret=null;
+ String _ret="";
MinimalLogger.info(String.format("-> %s",
n.getClass().getSimpleName()));
///////////////////////////////////////////////////////////////
- n.f3.accept(this, argu);
+ String len = n.f3.accept(this, argu);
+ String aAllocID = this.tf.alias(this.getUniqueID());
+ this.addVapor(String.format(" %s = call :AllocArray(%s)\n",
+ aAllocID,
+ len));
+
+ _ret += aAllocID;
///////////////////////////////////////////////////////////////
MinimalLogger.info(String.format("<- %s with %s",
n.getClass().getSimpleName(),
diff --git a/boil/tests/ex42.java b/boil/tests/ex42.java
index 8ea74b3..9ee7efa 100644
--- a/boil/tests/ex42.java
+++ b/boil/tests/ex42.java
@@ -14,7 +14,7 @@ class A {
int weight ;
int height ;
- public Boolean Init(int v_age, int v_Salary, boolean v_Married, int v_weight, int v_height) {
+ public boolean Init(int v_age, int v_Salary, boolean v_Married, int v_weight, int v_height) {
age = v_age ;
Salary = v_Salary ;
Married = v_Married ;
diff --git a/boil/tests/ex44.java b/boil/tests/ex44.java
index d4131c2..06c8d55 100644
--- a/boil/tests/ex44.java
+++ b/boil/tests/ex44.java
@@ -9,7 +9,8 @@ class Operator{
boolean result;
public int compute(){
+ boolean result ;
result = true && false;
- return 0;
+ return 0 ;
}
}