def testCompiling4(): """constant folding; local & global variables'""" compileString(""" program p; const seven = (9 mod 3 + 5 * 3) div 2; type int = integer; var x, y: integer; procedure q; const sotrue = true and true; const sofalse = false and true; const alsotrue = false or true; const alsofalse = false or false; var x: int; begin x := 3; if sotrue then y := x else y := seven; write(y); {writes 3} if sofalse then y := x else y := seven; write(y); {writes 7} if alsotrue then y := x else y := seven; write(y); {writes 3} if alsofalse then y := x else y := seven; write(y); {writes 7} if not(true or false) then write(5) else write(9) end; begin x := 7; q(); write(x) {writes 7} end """, 'T4.s')
def testPrettyPrint0(): compileString( """ program p; begin if false then writeln else if true then write(5) else write(7) ; write(9) end """, 'T0.s')
def testTypeCheck1(): """produces error 'not a record'""" compileString(""" program p; var v: integer; begin v.g := 4 end """)
def testTypeCheck5(): """produces error 'variable or procedure expected'""" compileString(""" program p; const c = 7; begin c := 4 end """)
def testTypeCheck4(): """produces error 'undefined identifier x', 'statement expected""" compileString(""" program p; const c = x + 1; begin end """)
def testTypeCheck2(): """produces error 'identifier expected'""" compileString(""" program p; var v: record f: integer end; begin v.3 := 4 end """)
def testTypeCheck0(): """produces error 'not a field'""" compileString(""" program p; var v: record f: integer end; begin v.g := 4 end """)
def testCodeGenCheck0(): """produces error 'value too large'""" compileString(""" program p; const c = 100000; var x: integer; begin x := c end """)
def testCodeGenCheck2(): """produces error 'out of register'""" compileString(""" program p; var x: integer; begin x := 0*x + (1*x + (2*x + (3*x + (4*x + (5*x + (6*x + (7*x + (8*x)))))))) end """)
def testTypeCheck7(): """produces error 'too few parameters'""" compileString(""" program p; procedure q(a: integer); begin a := 7 end; begin q() end """)
def testTypeCheck9(): """produces error 'illegal parameter mode'""" compileString(""" program p; procedure q(var a: integer); begin a := 7 end; begin q(5) end """)
def testCodeGenCheck1(): """produces error 'no structured value parameters'""" compileString(""" program p; type a = array [1..10] of integer; procedure q(f: a); begin a := 4 end begin a(5) end """)
def testTypeCheck6(): """produces error 'extra parameter'""" compileString(""" program p; var x: integer; procedure q; begin x := 7 end; begin q(x) end """)
def testCodeGenCheck4(): """produces error 'unsupported parameter type'""" compileString(""" program p; var x: integer; procedure q(b: boolean); begin b := false end; begin q(x > 7) end """)
def testTypeCheck3(): """produces error 'incompatible assignment' twice""" compileString(""" program p; var x: boolean; procedure q; var x: integer; begin x := true end; begin x := 3 end """)
def testPrettyPrint1(): compileString( """ program p; \{hello\} const ccc = 4 div 3; type I = integer; type A2=array[1..2]of array[3..4] of record f:boolean; g, h: integer end; var v, vv, vvv: boolean; var ww:record a: array[5..6]of record b: boolean end; c:boolean end; procedure pp(var i,j :I;r:boolean); const c = 3 div 3; begin i := c end; begin if v then if ww.c then begin v := true end else v:=false; if 3 > 4 then while false do if 5 mod 2=1 then writeln else write(7) end """, 'T1.s')
def testCompiling6(): """illustrating lack of 'optimization'""" compileString(""" program p; var x: integer; begin x := 5; x := x + 0; x := 0 + x; x := x * 1; x := 1 * x; x := x + 3; x := 3 + x end """, 'T6.s')
def testCompiling0(): """input & output""" compileString(""" program p; var x: integer; begin read(x); x := 3 * x; write(x); writeln(); writeln(); write(x * 5) end """, 'T0.s') """ generates
def testCodeGenCheck3(): """produces error 'level!'""" compileString(""" program p; procedure q; var x: integer; procedure r; begin x := 5 end; begin x := 3 end; begin x := 7 end """)
def testCompiling3(): """booleans and conditions""" compileString(""" program p; const five = 5; const seven = 7; const always = true; const never = false; var x, y, z: integer; var b, t, f: boolean; begin x := seven; y := 9; z := 11; t := true; f := false; if true then write(7) else write(9); {writes 7} if false then write(7) else write(9); {writes 9} if t then write(7) else write(9); {writes 7} if f then write(7) else write(9); {writes 9} if not t then write(7) else write(9); {writes 9} if not f then write(7) else write(9); {writes 7} if t or t then write(7) else write(9); {writes 7} if t or f then write(7) else write(9); {writes 7} if f or t then write(7) else write(9); {writes 7} if f or f then write(7) else write(9); {writes 9} if t and t then write(7) else write(9); {writes 7} if t and f then write(7) else write(9); {writes 9} if f and t then write(7) else write(9); {writes 9} if f and f then write(7) else write(9); {writes 9} writeln(); b := true; if b then write(3) else write(5); {writes 3} b := false; if b then write(3) else write(5); {writes 5} b := x < y; if b then write(x) else write(y); {writes 7} b := (x > y) or t; if b then write(3) else write(5); {writes 3} b := (x > y) or f; if b then write(3) else write(5); {writes 5} b := (x = y) or (x > y); if b then write(3) else write(5); {writes 5} b := (x = y) or (x < y); if b then write(3) else write(5); {writes 3} b := f and (x >= y); if b then write(3) else write(5); {writes 5} writeln(); while y > 3 do {writes 9, 8, 7, 6, 5, 4} begin write(y); y := y - 1 end; write(y); writeln(); {writes 3} if not(x < y) and t then {writes 7} write(x) end """, 'T3.s')
def testCompiling1(): """parameter passing""" compileString(""" program p; var x: integer; procedure q({-4($sp)}a: integer {4($fp)}; {-8($sp)}var b: integer {($fp)}); var y: integer;{-12($fp)} begin y := a; write(y); writeln(); {writes 7} a := b; write(x); write(a); writeln(); {writes 5, 5} b := y; write(b); write(x); writeln(); {writes 7, 7} write(a); write(y); writeln() {writes 5, 7} end; begin x := 5; q(7, x); write(x) {writes 7} end """, 'T1.s')
def testCompiling5(): """example for code generation""" compileString(""" program p; var g: integer; {global variable} procedure q(v: integer); {value parameter} var l: integer; {local variable} begin l := 9; if l > v then write(l) else write(g) end; begin g := 5; q(7) end """, 'T5.s')
def testCompiling2(): """arrays and records""" compileString(""" program p; type a = array [1 .. 7] of integer; type r = record f: integer; g: a; h: integer end; var v: a; var w: r; var x: integer; procedure q(var c: a; var d: r); var y: integer; begin y := 3; write(d.h); write(c[1]); write(d.g[y]); {writes 5, 3, 9} writeln(); c[7] := 7; write(c[y+4]); {writes 7} d.g[y*2] := 7; write(d.g[6]) {writes 7} end; begin x := 9; w.h := 12 - 7; write(w.h); {writes 5} v[1] := 3; write(v[x-8]); {writes 3} w.g[x div 3] := 9; write(w.g[3]); {writes 9} writeln(); q(v, w); writeln(); write(v[7]); write(w.g[6]) {writes 7, 7} end """, 'T2.s')
# {write(c)} # end # """, target='opt') target = 'opt' if 1 else 'mips' compileString("""program p; type T = record d,e,f:integer end; type A = array[0..9] of integer; var c: integer; var b: boolean; var w: A; procedure q(var z: integer); type T = record d,e:integer end; type A = array[0..9] of integer; var y: integer; var m,n: boolean; var w: T; var wd, we: integer; begin b:=true; w.d := 9; w.e := 5; w.d := 3 - 1 end; begin w[1] := 9; w[2] := 5; c := 10; c := c + 1; write(c); q(c) end """, target=target) # compileString("""program p;