Beispiel #1
0
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')
Beispiel #2
0
def testPrettyPrint0():
    compileString(
        """
program p; begin if false then writeln else
if true then write(5) else write(7)
; write(9) end
""", 'T0.s')
Beispiel #3
0
def testTypeCheck1():
    """produces error 'not a record'"""
    compileString("""
program p;
  var v: integer;
  begin v.g := 4
  end
""")
Beispiel #4
0
def testTypeCheck5():
    """produces error 'variable or procedure expected'"""
    compileString("""
program p;
  const c = 7;
  begin c := 4
  end
""")
Beispiel #5
0
def testTypeCheck4():
    """produces error 'undefined identifier x', 'statement expected"""
    compileString("""
program p;
  const c = x + 1;
  begin
  end
""")
Beispiel #6
0
def testTypeCheck2():
    """produces error 'identifier expected'"""
    compileString("""
program p;
  var v: record f: integer end;
  begin v.3 := 4
  end
""")
Beispiel #7
0
def testTypeCheck0():
    """produces error 'not a field'"""
    compileString("""
program p;
  var v: record f: integer end;
  begin v.g := 4
  end
""")
Beispiel #8
0
def testCodeGenCheck0():
    """produces error 'value too large'"""
    compileString("""
program p;
  const c = 100000;
  var x: integer;
  begin x := c
  end
""")
Beispiel #9
0
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
""")
Beispiel #10
0
def testTypeCheck7():
    """produces error 'too few parameters'"""
    compileString("""
program p;
  procedure q(a: integer);
    begin a := 7
    end;
  begin q()
  end
""")
Beispiel #11
0
def testTypeCheck9():
    """produces error 'illegal parameter mode'"""
    compileString("""
program p;
  procedure q(var a: integer);
    begin a := 7
    end;
  begin q(5)
  end
""")
Beispiel #12
0
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
""")
Beispiel #13
0
def testTypeCheck6():
    """produces error 'extra parameter'"""
    compileString("""
program p;
  var x: integer;
  procedure q;
    begin x := 7
    end;
  begin q(x)
  end
""")
Beispiel #14
0
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
""")
Beispiel #15
0
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
""")
Beispiel #16
0
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')
Beispiel #17
0
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')
Beispiel #18
0
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
Beispiel #19
0
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
""")
Beispiel #20
0
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')
Beispiel #21
0
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')
Beispiel #22
0
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')
Beispiel #23
0
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')
Beispiel #24
0
#     {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;