Test 2
| Abstract Syntax Tree program = main_class class_decl*; main_class = [classname]:id [arg]:id statement; class_decl = id var_decl* method_decl* | {extends} [classname]:id [extend]:id var_decl* method_decl*; var_decl = type id; method_decl = type id formal_list var_decl* statement* exp; statement = {statementlist} statement* | {if} exp [true]:statement [false]:statement | {while} exp statement | {println} exp | {assign} id exp | {array_assign} id [index]:exp [r]:exp; formal_list = type id formal_rest* | {empty}; formal_rest = type id; type= {int_array} | {boolean} | {int} | {id} id; exp = {and} [l]:exp [r]:exp | {lt} [l]:exp [r]:exp | {plus} [l]:exp [r]:exp | {minus} [l]:exp [r]:exp | {times} [l]:exp [r]:exp | {length} exp | {arrayindex} [array]:exp [index]:exp | {methodcall} exp id exp_list | {integerliteral} integer_literal | {trueliteral} true | {falseliteral} false | {id} id | {this} this | {new} id | {newarray} exp | {not} exp ; exp_list = exp*; |
| public void caseAFalseliteralExp(AFalseliteralExp node) { setType(node, new ABooleanType()); } |
| public void caseALtExp(ALtExp node) { node.getL().apply(this); if (! ((Node)getType(node.getL()) instanceof AIntType) ) { System.out.println("Left side of < must be of type integer"); System.exit(-1); } node.getR().apply(this); if (! ((Node)getType(node.getR()) instanceof AIntType) ) { System.out.println("Right side of < must be of type integer"); System.exit(-1); } setType(node,new ABooleanType()); } |
- public class Q1 {
- public static void main(String [] args) {
- Q2 qa = new Q2();
- Q2 qb = new Q2();
- qa.f1( qb, 5);
- }
- }
- class Q2 {
- int a;
- public void f1( Q2 q, int n ) {
- int i;
- int j;
- i = n;
- j = i + 1;
- n = q.f2();
- this.a = n;
- }
- }
- public int f2( ) {
- int i;
- i = 3;
- return i;
- }
- }
qa.f1( qb, 5 )
0 qa 1 qb 2 TOS 5
qa.f1( qb, 5 )
|
q.f2()
|
q.f2( )
| 0 TOS | q=qb |
| BINOP( MINUS, BINOP( MINUS, CONST 3, CONST 5 ), CONST 4 ) |
| MOVE( MEM( BINOP( PLUS, TEMP fp, CONST 7)), BINOP(MINUS, CONST 3, CONST 5)) |
| MOVE( MEM( BINOP( PLUS, TEMP fp, CONST 7)), BINOP( MINUS, MEM( BINOP( PLUS, TEMP fp, CONST 9)), CONST 3)) |
| ESEQ( SEQ( SEQ( SEQ( MOVE(TEMP(t2),CONST(0)), CJUMP( Tree.CJUMP.LT, CONST(4), MEM( BINOP( BINOP.PLUS, TEMP(fp), CONST(5) ) ), T, F ) ), SEQ( LABEL(T), MOVE(TEMP(t2),CONST(1)) ) ), LABEL(F) ), TEMP(t1) ) |
| SEQ( SEQ( SEQ( LABEL(test), CJUMP(Tree.CJUMP.EQ, condition CONST(1),T,F) ), SEQ( SEQ( LABEL(T), body ), Tree.JUMP( test ) ) ), LABEL(F) ) condition from d. body from c. |
| MOVE( TEMP t0, CONST 4) MOVE( TEMP t0, CONST 3) MOVE( TEMP t0, CONST 2) MOVE( TEMP t0, CONST 1) |
| MOVE( TEMP t0, CONST 4) MOVE( TEMP t0, CONST 3) MOVE( TEMP t0, CONST 2) MOVE( TEMP t0, CONST 1) |
| ____Linearization_____ MOVE( TEMP t0, CONST 4) MOVE( TEMP t0, CONST 1) ______Basic Blocks____ LABEL L1 MOVE( TEMP t0, CONST 4) MOVE( TEMP t0, CONST 1) JUMP(NAME L0) ______Trace_________ LABEL L1 MOVE( TEMP t0, CONST 4) MOVE( TEMP t0, CONST 1) JUMP(NAME L0) LABEL L0 |
| ____Linearization____ JUMP(NAME b2) MOVE( TEMP t2, CONST 2) MOVE( TEMP t0, BINOP(PLUS, CONST 1, TEMP t1)) LABEL b1 ______Basic Blocks___ LABEL L1 JUMP(NAME b2) LABEL L2 MOVE( TEMP t2, CONST 2) MOVE( TEMP t0, BINOP(PLUS, CONST 1, TEMP t1)) JUMP(NAME b1) LABEL b1 JUMP(NAME L0) ______Trace_________ LABEL L1 JUMP(NAME b2) LABEL L2 MOVE( TEMP t2, CONST 2) MOVE( TEMP t0, BINOP(PLUS, CONST 1, TEMP t1)) LABEL b1 JUMP(NAME L0) LABEL L0 |