// --------------------- PARSE PHASE ---------------------- // 0: SEQUENCE -1 -1 // 1: LINE 1: var i,j,k,l // 2: TAG i[@Stringpool 0] // 3: TAG j[@Stringpool 2] // 4: TAG k[@Stringpool 4] // 5: TAG l[@Stringpool 6] // 6: VAR l[@AST 5] TYPE=INT // 7: DECLARE 6 -1 // 8: VAR k[@AST 4] TYPE=INT // 9: DECLARE 8 -1 // 10: SEQUENCE 9 7 // 11: VAR j[@AST 3] TYPE=INT // 12: DECLARE 11 -1 // 13: SEQUENCE 12 10 // 14: VAR i[@AST 2] TYPE=INT // 15: DECLARE 14 -1 // 16: SEQUENCE 15 13 // 17: SEQUENCE -1 -1 // ; // / \ // / \ // / \ // / \ // / ; // / / \ // / / \ // / / \ // / / \ // / / ; // / / / \ // / / / \ // DECLARE / / \ // / DECLARE / \ // i / DECLARE DECLARE // j / / // k l // 18: LINE 2: i = j + k // 19: ADD [@AST 11] [@AST 8] // 20: ASSIGN [declared @AST 14] [value @AST 19] // 21: SEQUENCE -1 -1 // = // / \ // / '+' // / / \ // i j k // 22: LINE 3: j = 44 // 23: CONST INT 44 // 24: ASSIGN [declared @AST 11] [value @AST 23] // 25: SEQUENCE -1 -1 // = // / \ // j 44 // 26: LINE 4: k = 22 // 27: CONST INT 22 // 28: ASSIGN [declared @AST 8] [value @AST 27] // 29: SEQUENCE -1 -1 // = // / \ // k 22 // 30: LINE 5: if ((j/2) == k) i = (2 + 3) * ((4 - 5) / 6) else i = 42 // 31: CONST INT 2 // 32: DIV [@AST 11] [@AST 31] // 33: [@AST 32] EQ [@AST 8] // 34: CONST INT 2 // 35: CONST INT 3 // 36: ADD [@AST 34] [@AST 35] // 37: CONST INT 4 // 38: CONST INT 5 // 39: SUB [@AST 37] [@AST 38] // 40: CONST INT 6 // 41: DIV [@AST 39] [@AST 40] // 42: MUL [@AST 36] [@AST 41] // 43: ASSIGN [declared @AST 14] [value @AST 42] // 44: CONST INT 42 // 45: ASSIGN [declared @AST 14] [value @AST 44] // 46: THENELSE [then-statement @AST 43] [else-statement @AST 45] // 47: IF [condition @AST 33] [then+else-statements @AST 46] // 48: SEQUENCE -1 -1 // if (...) // / \ // / then ... else ... // / / \ // / / = // / / / \ // / = i 42 // / / \ // / / '*' // / / / \ // / / / \ // / / / '/' // / / / / \ // / / / / \ // / / / '-' 6 // / / '+' / \ // / / / \ 4 5 // == i 2 3 // / \ // / \ // '/' k // / \ // j 2 // 49: LINE 6: loop // 50: LOOP 1 2 // 51: SEQUENCE -1 -1 // LOOP // 52: LINE 7: if ((j/2) == k) break // 53: CONST INT 2 // 54: DIV [@AST 11] [@AST 53] // 55: [@AST 54] EQ [@AST 8] // 56: BREAK 1 2 // 57: IFTHEN [condition @AST 55] [then-statement @AST 56] // 58: SEQUENCE -1 -1 // if (...) then // / \ // == BREAK // / \ // / \ // '/' k // / \ // j 2 // 59: LINE 8: endloop // 60: ENDLOOP 1 2 // 61: SEQUENCE -1 -1 // ENDLOOP // --------------------- CODEGEN PHASE ---------------------- // 1: LINE 1: var i,j,k,l // 16: SEQUENCE 15 13 // ; // / \ // / \ // / \ // / \ // / ; // / / \ // / / \ // / / \ // / / \ // / / ; // / / / \ // / / / \ // DECLARE / / \ // / DECLARE / \ // i / DECLARE DECLARE // j / / // k l int i; int j; int k; int l; // 18: LINE 2: i = j + k // 20: ASSIGN [declared @AST 14] [value @AST 19] // = // / \ // / '+' // / / \ // i j k _t11 = j; _t8 = k; _t19 = (_t11 + _t8); i = _t19; // 22: LINE 3: j = 44 // 24: ASSIGN [declared @AST 11] [value @AST 23] // = // / \ // j 44 _t23 = 44; j = _t23; // 26: LINE 4: k = 22 // 28: ASSIGN [declared @AST 8] [value @AST 27] // = // / \ // k 22 _t27 = 22; k = _t27; // 30: LINE 5: if ((j/2) == k) i = (2 + 3) * ((4 - 5) / 6) else i = 42 // 47: IF [condition @AST 33] [then+else-statements @AST 46] // if (...) // / \ // / then ... else ... // / / \ // / / = // / / / \ // / = i 42 // / / \ // / / '*' // / / / \ // / / / \ // / / / '/' // / / / / \ // / / / / \ // / / / '-' 6 // / / '+' / \ // / / / \ 4 5 // == i 2 3 // / \ // / \ // '/' k // / \ // j 2 _t11 = j; _t31 = 2; _t32 = (_t11 / _t31); _t8 = k; _t33 = (_t32 == _t8); if (!t_33) goto L05; L03: _t34 = 2; _t35 = 3; _t36 = (_t34 + _t35); _t37 = 4; _t38 = 5; _t39 = (_t37 - _t38); _t40 = 6; _t41 = (_t39 / _t40); _t42 = (_t36 * _t41); i = _t42; goto L04; L05: _t44 = 42; i = _t44; L04: // 49: LINE 6: loop // 50: LOOP 1 2 // LOOP L01: // 52: LINE 7: if ((j/2) == k) break // 57: IFTHEN [condition @AST 55] [then-statement @AST 56] // if (...) then // / \ // == BREAK // / \ // / \ // '/' k // / \ // j 2 _t11 = j; _t53 = 2; _t54 = (_t11 / _t53); _t8 = k; _t55 = (_t54 == _t8); if (!t_55) goto L07; L06: goto L02; L07: // 59: LINE 8: endloop // 60: ENDLOOP 1 2 // ENDLOOP goto L01; L02: