From b56603daf78437fcb31289ce4b1b3b07dcf118c7 Mon Sep 17 00:00:00 2001 From: mathis Date: Wed, 26 Jan 2022 17:27:29 +0100 Subject: [PATCH] goodbye. --- comp/ex1.txt | 74 +++++++++++++++++------------------------- comp/gn.txt | 79 +++++++++++++++++---------------------------- comp/grandMere.txt | 41 ++++++----------------- comp/masking1.txt | 21 ++++++------ comp/test.txt | 1 + lib/compil.ml | 34 +++++++++++-------- progs/gn.kat | 2 +- progs/grandMere.kat | 61 ++++++++++++++++++---------------- 8 files changed, 132 insertions(+), 181 deletions(-) diff --git a/comp/ex1.txt b/comp/ex1.txt index 3b4c4cf..d46fa92 100644 --- a/comp/ex1.txt +++ b/comp/ex1.txt @@ -34,6 +34,7 @@ STORE 0 DUPN 1 PUSHA Couleur_4_name STORE 1 +ALLOC 0 ALLOC 12 DUPN 1 PUSHA Point_4_egal @@ -145,6 +146,7 @@ STORE 10 DUPN 1 PUSHA DefaultPoint_7_couleur STORE 11 +ALLOC 0 -- ----- STATIC ATTRIBS ----- PUSHN 4 -- ----- MAIN INSTRUCTION ----- @@ -591,28 +593,23 @@ STOP _CTOR_Point_: NOP PUSHN 0 PUSHL -4 -LOAD 4 PUSHL -3 -STORE 3 +STORE 4 PUSHL -4 -LOAD 5 PUSHL -2 -STORE 4 +STORE 5 PUSHL -4 -LOAD 6 PUSHL -1 -STORE 5 +STORE 6 PUSHL -4 -LOAD 2 PUSHI 0 PUSHA Point_4_incr CALL POPN 0 -STORE 1 +STORE 2 PUSHL -4 -LOAD 3 PUSHI 0 -STORE 2 +STORE 3 POPN 0 RETURN Point_4_egal: NOP @@ -690,7 +687,6 @@ PUSHI 1 EQUAL POPN 1 PUSHL -1 -LOAD 1 ALLOC 7 DUPN 1 PUSHG 0 @@ -706,7 +702,7 @@ CONCAT PUSHA _CTOR_Point_ CALL POPN 3 -STORE 0 +STORE 1 PUSHL -1 LOAD 1 STOREL -2 @@ -755,19 +751,17 @@ RETURN Point_4_move: NOP PUSHN 0 PUSHL -1 -LOAD 4 PUSHL -1 LOAD 4 PUSHL -4 ADD -STORE 3 +STORE 4 PUSHL -1 -LOAD 5 PUSHL -1 LOAD 5 PUSHL -3 ADD -STORE 4 +STORE 5 PUSHL -2 JZ lbl9 PUSHN 0 @@ -801,9 +795,8 @@ RETURN Point_7_setName: NOP PUSHN 0 PUSHL -1 -LOAD 6 PUSHL -2 -STORE 5 +STORE 6 POPN 0 RETURN Point_4_gety: NOP @@ -818,41 +811,37 @@ STOREL -2 RETURN Point_4_init: NOP PUSHN 0 -PUSHG 0 PUSHI 0 -STORE 0 +STOREG 7 POPN 0 RETURN Point_7_howMany: NOP -PUSHG 0 +PUSHG 7 STOREL -1 RETURN Point_4_incr: NOP PUSHN 0 -PUSHG 0 -PUSHG 0 +PUSHG 7 PUSHI 1 ADD -STORE 0 -PUSHG 0 +STOREG 7 +PUSHG 7 STOREL -1 POPN 0 RETURN _CTOR_Couleur_: NOP PUSHN 0 PUSHL -2 -LOAD 1 PUSHL -1 -STORE 0 +STORE 1 PUSHL -2 LOAD 1 PUSHI 0 INF JZ lbl11 PUSHL -2 -LOAD 1 PUSHI 0 -STORE 0 +STORE 1 JUMP lbl12 lbl11: NOP PUSHL -2 @@ -861,9 +850,8 @@ PUSHI 2 SUP JZ lbl13 PUSHL -2 -LOAD 1 PUSHI 0 -STORE 0 +STORE 1 JUMP lbl14 lbl13: NOP PUSHN 0 @@ -939,20 +927,19 @@ PUSHN 0 POPN 0 RETURN CouleurFactory_4_gris: NOP -PUSHG 3 +PUSHG 10 STOREL -1 RETURN CouleurFactory_4_noir: NOP -PUSHG 2 +PUSHG 9 STOREL -1 RETURN CouleurFactory_5_blanc: NOP -PUSHG 1 +PUSHG 8 STOREL -1 RETURN CouleurFactory_4_init: NOP PUSHN 0 -PUSHG 1 ALLOC 2 DUPN 1 PUSHG 1 @@ -961,8 +948,7 @@ PUSHI 0 PUSHA _CTOR_Couleur_ CALL POPN 1 -STORE 1 -PUSHG 2 +STOREG 8 ALLOC 2 DUPN 1 PUSHG 1 @@ -971,8 +957,7 @@ PUSHI 1 PUSHA _CTOR_Couleur_ CALL POPN 1 -STORE 2 -PUSHG 3 +STOREG 9 ALLOC 2 DUPN 1 PUSHG 1 @@ -981,10 +966,11 @@ PUSHI 2 PUSHA _CTOR_Couleur_ CALL POPN 1 -STORE 3 +STOREG 10 POPN 0 RETURN _CTOR_PointColore_: NOP +PUSHL -4 PUSHL -3 PUSHL -2 PUSHS "P-" @@ -994,15 +980,13 @@ CALL POPN 0 STR CONCAT -PUSHL -4 PUSHA _CTOR_Point_ CALL POPN 4 PUSHN 0 PUSHL -4 -LOAD 7 PUSHL -1 -STORE 6 +STORE 7 POPN 0 RETURN PointColore_5_print: NOP @@ -1095,13 +1079,13 @@ LOAD 7 STOREL -2 RETURN _CTOR_PointNoir_: NOP +PUSHL -3 PUSHL -2 PUSHL -1 PUSHI 0 PUSHA CouleurFactory_4_noir CALL POPN 0 -PUSHL -3 PUSHA _CTOR_PointColore_ CALL POPN 4 @@ -1124,13 +1108,13 @@ PUSHI 0 STOREL -2 RETURN _CTOR_DefaultPoint_: NOP +PUSHL -1 PUSHI 0 PUSHI 0 PUSHI 0 PUSHA CouleurFactory_5_blanc CALL POPN 0 -PUSHL -1 PUSHA _CTOR_PointColore_ CALL POPN 4 diff --git a/comp/gn.txt b/comp/gn.txt index 6b0be48..3a06a20 100644 --- a/comp/gn.txt +++ b/comp/gn.txt @@ -67,6 +67,7 @@ STORE 8 DUPN 1 PUSHA GrandNombre_6_nombre STORE 9 +ALLOC 0 -- ----- STATIC ATTRIBS ----- PUSHN 0 -- ----- MAIN INSTRUCTION ----- @@ -409,9 +410,11 @@ STOP _CTOR_TriNombre_: NOP PUSHN 0 PUSHL -1 -LOAD 3 -PUSHI 0 +PUSHI 1 STORE 2 +PUSHL -1 +PUSHI 0 +STORE 3 POPN 0 RETURN TriNombre_8_imprimer: NOP @@ -551,12 +554,11 @@ PUSHI 1 STOREL 0 lbl14: NOP PUSHL -1 -LOAD 3 PUSHL -1 LOAD 3 PUSHL -2 MUL -STORE 2 +STORE 3 PUSHL -1 LOAD 3 PUSHI 1000 @@ -569,14 +571,13 @@ PUSHI 1000 DIV STOREL 3 PUSHL -1 -LOAD 3 PUSHL -1 LOAD 3 PUSHL 3 PUSHI 1000 MUL SUB -STORE 2 +STORE 3 PUSHI 0 PUSHI 2 PUSHL -1 @@ -638,11 +639,10 @@ SUPEQ JZ lbl19 PUSHN 0 PUSHL -1 -LOAD 3 PUSHL 0 PUSHI 1000 SUB -STORE 2 +STORE 3 PUSHI 0 PUSHI 2 PUSHL -1 @@ -667,9 +667,8 @@ JUMP lbl20 lbl19: NOP PUSHN 0 PUSHL -1 -LOAD 3 PUSHL 0 -STORE 2 +STORE 3 PUSHI 1 STOREL 1 POPN 0 @@ -737,13 +736,12 @@ PUSHI 1000 DIV STOREL 1 PUSHL -1 -LOAD 3 PUSHL 0 PUSHL 1 PUSHI 1000 MUL SUB -STORE 2 +STORE 3 PUSHI 0 PUSHI 2 PUSHL -1 @@ -770,9 +768,8 @@ JUMP lbl26 lbl25: NOP PUSHN 0 PUSHL -1 -LOAD 3 PUSHL 0 -STORE 2 +STORE 3 PUSHI 1 STOREL -3 POPN 0 @@ -792,13 +789,12 @@ PUSHI 1000 DIV STOREL 0 PUSHL -1 -LOAD 3 PUSHL -2 PUSHL 0 PUSHI 1000 MUL SUB -STORE 2 +STORE 3 PUSHL 0 PUSHI 0 SUP @@ -843,7 +839,6 @@ RETURN TriNombre_6_copier: NOP PUSHN 0 PUSHL -1 -LOAD 3 PUSHI 0 PUSHL -2 DUPN 1 @@ -851,7 +846,7 @@ LOAD 0 LOAD 10 CALL POPN 1 -STORE 2 +STORE 3 PUSHI 0 PUSHL -2 DUPN 1 @@ -966,13 +961,11 @@ EQUAL JZ lbl35 PUSHN 0 PUSHL -1 -LOAD 1 PUSHL -2 -STORE 0 +STORE 1 PUSHL -1 -LOAD 2 PUSHI 0 -STORE 1 +STORE 2 POPN 0 JUMP lbl36 lbl35: NOP @@ -1011,13 +1004,11 @@ PUSHN 0 POPN 0 lbl38: NOP PUSHL -1 -LOAD 2 PUSHI 1 -STORE 1 +STORE 2 PUSHL -1 -LOAD 3 PUSHI 0 -STORE 2 +STORE 3 POPN 0 RETURN TriNombre_4_last: NOP @@ -1038,7 +1029,6 @@ RETURN _CTOR_GrandNombre_: NOP PUSHN 0 PUSHL -1 -LOAD 2 ALLOC 4 DUPN 1 PUSHG 0 @@ -1046,11 +1036,10 @@ STORE 0 PUSHA _CTOR_TriNombre_ CALL POPN 0 -STORE 1 +STORE 2 PUSHL -1 -LOAD 1 PUSHI 1 -STORE 0 +STORE 1 POPN 0 RETURN GrandNombre_8_imprimer: NOP @@ -1077,7 +1066,6 @@ RETURN GrandNombre_8_affecter: NOP PUSHN 0 PUSHL -1 -LOAD 1 PUSHI 0 PUSHL -2 PUSHL -1 @@ -1087,7 +1075,7 @@ LOAD 0 LOAD 4 CALL POPN 2 -STORE 0 +STORE 1 PUSHL -1 LOAD 1 STOREL -3 @@ -1096,7 +1084,6 @@ RETURN GrandNombre_10_multiplier: NOP PUSHN 0 PUSHL -1 -LOAD 1 PUSHI 0 PUSHL -2 PUSHL -1 @@ -1106,16 +1093,15 @@ LOAD 0 LOAD 1 CALL POPN 2 -STORE 0 +STORE 1 PUSHL -1 LOAD 1 PUSHI 0 EQUAL JZ lbl39 PUSHL -1 -LOAD 1 PUSHI 1 -STORE 0 +STORE 1 JUMP lbl40 lbl39: NOP PUSHN 0 @@ -1150,9 +1136,8 @@ PUSHL 0 INF JZ lbl41 PUSHL -1 -LOAD 1 PUSHL 0 -STORE 0 +STORE 1 JUMP lbl42 lbl41: NOP PUSHN 0 @@ -1164,9 +1149,8 @@ PUSHI 0 EQUAL JZ lbl43 PUSHL -1 -LOAD 1 PUSHI 1 -STORE 0 +STORE 1 JUMP lbl44 lbl43: NOP PUSHN 0 @@ -1195,9 +1179,8 @@ PUSHL 0 INF JZ lbl45 PUSHL -1 -LOAD 1 PUSHL 0 -STORE 0 +STORE 1 JUMP lbl46 lbl45: NOP PUSHN 0 @@ -1209,9 +1192,8 @@ PUSHI 0 EQUAL JZ lbl47 PUSHL -1 -LOAD 1 PUSHI 1 -STORE 0 +STORE 1 JUMP lbl48 lbl47: NOP PUSHN 0 @@ -1260,7 +1242,6 @@ CALL POPN 1 POPN 1 PUSHL -1 -LOAD 1 PUSHI 0 PUSHL -2 PUSHL -1 @@ -1269,16 +1250,15 @@ LOAD 0 LOAD 5 CALL POPN 2 -STORE 0 +STORE 1 PUSHL -1 LOAD 1 PUSHI 0 EQUAL JZ lbl51 PUSHL -1 -LOAD 1 PUSHI 1 -STORE 0 +STORE 1 JUMP lbl52 lbl51: NOP PUSHN 0 @@ -1353,7 +1333,6 @@ CALL POPN 2 POPN 1 PUSHL -1 -LOAD 1 PUSHI 0 PUSHL -2 DUPN 1 @@ -1361,7 +1340,7 @@ LOAD 0 LOAD 8 CALL POPN 1 -STORE 0 +STORE 1 POPN 0 RETURN GrandNombre_5_nbTri: NOP diff --git a/comp/grandMere.txt b/comp/grandMere.txt index 092d16e..e52f4ff 100644 --- a/comp/grandMere.txt +++ b/comp/grandMere.txt @@ -1,23 +1,11 @@ -- ----- VTABLES ----- +ALLOC 0 +ALLOC 0 +ALLOC 0 ALLOC 1 DUPN 1 -PUSHA A_7_sValeur -STORE 0 -ALLOC 1 -DUPN 1 -PUSHA A_7_sValeur -STORE 0 -ALLOC 1 -DUPN 1 -PUSHA A_7_sValeur -STORE 0 -ALLOC 2 -DUPN 1 -PUSHA A_7_sValeur -STORE 0 -DUPN 1 PUSHA D_6_valeur -STORE 1 +STORE 0 -- ----- STATIC ATTRIBS ----- PUSHN 0 -- ----- MAIN INSTRUCTION ----- @@ -36,7 +24,7 @@ PUSHI 0 PUSHL 0 DUPN 1 LOAD 0 -LOAD 1 +LOAD 0 CALL POPN 1 STR @@ -65,11 +53,10 @@ DUPN 1 WRITES POPN 1 PUSHL -1 -LOAD 1 PUSHI 0 PUSHI 12 SUB -STORE 0 +STORE 1 PUSHL -1 LOAD 1 STR @@ -80,11 +67,6 @@ WRITES POPN 1 POPN 0 RETURN -A_7_sValeur: NOP -PUSHL -1 -LOAD 1 -STOREL -2 -RETURN _CTOR_B_: NOP PUSHL -1 PUSHA _CTOR_A_ @@ -96,12 +78,11 @@ DUPN 1 WRITES POPN 1 PUSHL -1 -LOAD 2 PUSHL -1 LOAD 1 PUSHI 2 ADD -STORE 1 +STORE 2 PUSHL -1 LOAD 2 STR @@ -119,7 +100,6 @@ CALL POPN 1 PUSHN 0 PUSHL -2 -LOAD 3 PUSHI 3 PUSHL -2 LOAD 1 @@ -127,7 +107,7 @@ ADD PUSHL -2 LOAD 2 ADD -STORE 2 +STORE 3 PUSHS "C::(): " DUPN 1 WRITES @@ -143,19 +123,18 @@ POPN 1 POPN 0 RETURN _CTOR_D_: NOP -PUSHI 12 PUSHL -2 +PUSHI 12 PUSHA _CTOR_C_ CALL POPN 2 PUSHN 0 PUSHL -2 -LOAD 4 PUSHL -2 LOAD 3 PUSHI 4 ADD -STORE 3 +STORE 4 PUSHS "D::(): " DUPN 1 WRITES diff --git a/comp/masking1.txt b/comp/masking1.txt index 77d90d1..80d8da5 100644 --- a/comp/masking1.txt +++ b/comp/masking1.txt @@ -146,9 +146,8 @@ STOP _CTOR_A_: NOP PUSHN 0 PUSHL -1 -LOAD 1 PUSHI 1 -STORE 0 +STORE 1 POPN 0 RETURN A_1_f: NOP @@ -163,14 +162,13 @@ CALL POPN 1 PUSHN 0 PUSHL -1 -LOAD 1 PUSHS "coucou" -STORE 0 +STORE 2 POPN 0 RETURN A2_1_g: NOP PUSHL -1 -LOAD 1 +LOAD 2 STOREL -2 RETURN _CTOR_A3_: NOP @@ -180,9 +178,8 @@ CALL POPN 1 PUSHN 0 PUSHL -1 -LOAD 1 PUSHI 5 -STORE 0 +STORE 3 POPN 0 RETURN A3_1_k: NOP @@ -196,14 +193,14 @@ PUSHS "\n" WRITES POPN 1 PUSHL -1 -LOAD 1 +LOAD 2 DUPN 1 WRITES PUSHS "\n" WRITES POPN 1 PUSHL -1 -LOAD 1 +LOAD 3 STR DUPN 1 WRITES @@ -214,12 +211,12 @@ POPN 0 RETURN A3_1_f: NOP PUSHL -1 -LOAD 1 +LOAD 3 STOREL -2 RETURN A3_1_h: NOP PUSHL -1 -LOAD 1 +LOAD 3 STOREL -2 RETURN _CTOR_A4_: NOP @@ -232,6 +229,6 @@ POPN 0 RETURN A4_1_z: NOP PUSHL -1 -LOAD 1 +LOAD 3 STOREL -2 RETURN diff --git a/comp/test.txt b/comp/test.txt index 5e966eb..26a7a6d 100644 --- a/comp/test.txt +++ b/comp/test.txt @@ -1,4 +1,5 @@ -- ----- VTABLES ----- +ALLOC 0 ALLOC 1 DUPN 1 PUSHA Derived_4_test diff --git a/lib/compil.ml b/lib/compil.ml index 7dc01f8..a19539f 100644 --- a/lib/compil.ml +++ b/lib/compil.ml @@ -46,6 +46,8 @@ let make_method_addrs params = in let addrs = ("this", -1)::addrs in addrs +(** Order of stack: result, params *) + let make_static_method_addrs params = let len = List.length params in let addrs = params |> List.mapi (fun i (p: param) -> @@ -54,6 +56,8 @@ let make_static_method_addrs params = in let addrs = ("result", -len - 1)::addrs in addrs +(** Order of stack: this, params *) + let make_ctor_addrs params = let len = List.length params in let addrs = params |> List.mapi (fun i (p: param) -> @@ -76,7 +80,9 @@ let rec all_attrs decls decl = (** Get the offset of an instance attribute in a class. *) let attr_offset decls decl attrName = - all_attrs decls decl |> Util.index_of attrName + let attrs = all_attrs decls decl + in let rev_index = List.rev attrs |> Util.index_of attrName + in (List.length attrs) - rev_index (* VTABLE is offset 0 *) let static_attr_offset decls decl attr = let rec r_offset decls = @@ -86,7 +92,7 @@ let static_attr_offset decls decl attr = |> Util.index_of attr | d::r -> (List.length d.staticAttrs) + r_offset r | _ -> failwith "static_attr_offset unreachable" - in r_offset decls + in r_offset decls + List.length decls (* after the vtables *) (* --------------------------------------------- *) @@ -135,6 +141,7 @@ let compile chan ast = let _ALLOC = Printf.fprintf chan "ALLOC %d\n" in let _LABEL = Printf.fprintf chan "%s: NOP\n" in let _COMMENT = Printf.fprintf chan "-- %s\n" in + let _BREAK () = Printf.fprintf chan "* NOP\n" in let code_op op = match op with | Eq -> _EQUAL () @@ -173,16 +180,15 @@ let compile chan ast = let name = get_expr_type decls env e in let decl = get_class decls name in let off = attr_offset decls decl s - in code_expr addrs env to_; + in code_expr addrs env e; code_expr addrs env from_; _STORE off - | StaticAttr(name, s) -> + | StaticAttr(name, s) -> let decl = get_class decls name - in let off = static_attr_offset decls decl s - in code_expr addrs env to_; - code_expr addrs env from_; - _STORE off + in let addr = static_attr_offset decls decl s + in code_expr addrs env from_; + _STOREG addr | Id(s) -> let addr = get_addr addrs s @@ -210,13 +216,13 @@ let compile chan ast = in let decl = get_class decls clName in let superDecl = get_class decls (Option.get decl.super).name in _PUSHL (get_addr addrs "this"); (* push this *) - _LOAD ((attr_offset decls superDecl s) + 1) + _LOAD (attr_offset decls superDecl s) | _ -> code_expr addrs env e; (* push this *) let decl = get_expr_type decls env e in let decl = get_class decls decl - in _LOAD ((attr_offset decls decl s) + 1) + in _LOAD (attr_offset decls decl s) and code_builtin_string addrs env e m = code_expr addrs env e; (* push this *) @@ -316,8 +322,7 @@ let compile chan ast = in let code_vtable decl = let vt = Vtable.make decls decl - in if vt <> [] then - _ALLOC (List.length vt); + in _ALLOC (List.length vt); vt |> List.iteri (fun i (name, decl) -> _DUPN 1; _PUSHA (meth_lbl decl.name name); @@ -329,8 +334,8 @@ let compile chan ast = in let code_super_call addrs env decl = let { args; name } = Option.get decl.super - in List.iter (code_expr addrs env) args; (* push args *) - _PUSHL (get_addr addrs "this"); (* push this *) + in _PUSHL (get_addr addrs "this"); (* push this *) + List.iter (code_expr addrs env) args; (* push args *) _PUSHA (ctor_lbl name); _CALL (); _POPN ((List.length args) + 1) (* pop args & this *) @@ -387,6 +392,7 @@ in _COMMENT "----- MAIN INSTRUCTION -----"; _START (); code_main_instr ast.instr; + (* _BREAK (); *) _STOP (); _COMMENT "----- FUNCTIONS -----"; diff --git a/progs/gn.kat b/progs/gn.kat index 7e515bf..a226540 100644 --- a/progs/gn.kat +++ b/progs/gn.kat @@ -8,7 +8,7 @@ class TriNombre() is { var last: Integer /* Par defaut, on est isole */ var suivant: TriNombre /* valeur arbitraire si last = 1 */ - def TriNombre () is { this.trinome := 0; } + def TriNombre () is { this.last := 1; this.trinome := 0; } def suivant() : TriNombre := this.suivant diff --git a/progs/grandMere.kat b/progs/grandMere.kat index c7c5ed9..93e33e0 100644 --- a/progs/grandMere.kat +++ b/progs/grandMere.kat @@ -1,46 +1,51 @@ class A() is { - var va: Integer - def sValeur() : Integer := this.va - def A() is { - "A::(): ".print(); - this.va.toString().print(); - ", ".print(); - this.va := -12; - this.va.toString().println(); + var va: Integer + def A() is { + "A::(): ".print(); + this.va.toString().print(); + ", ".print(); + this.va := -12; + this.va.toString().println(); } } + class B() extends A is { - var vb: Integer - def B() : A() is { "B::(): ".print(); this.vb := this.va + 2; - this.vb.toString().println(); - } + var vb: Integer + def B() : A() is { + "B::(): ".print(); + this.vb := this.va + 2; + this.vb.toString().println(); + } } + class C(v : Integer) extends B is { - var vc: Integer - def C(v : Integer): B() is { - this.vc := 3 + this.va + this.vb; - "C::(): ".print(); - this.vc.toString().println(); - } + var vc: Integer + def C(v : Integer): B() is { + this.vc := 3 + this.va + this.vb; + "C::(): ".print(); + this.vc.toString().println(); + } } -class D(v : Integer) extends C is - { var vd: Integer - def valeur() : Integer is { + +class D(v : Integer) extends C is { + var vd: Integer + def valeur() : Integer is { this.va.toString().println(); this.vb.toString().println(); this.vc.toString().println(); this.vd.toString().println(); result := this.va + this.vb + this.vc + this.vd; - } + } def D(v : Integer): C(12) is { this.vd := this.vc + 4; - "D::(): ".print(); + "D::(): ".print(); this.vd.toString().println(); } - } +} + { - monD : D - is - monD := new D(5); - monD.valeur().toString().println(); + monD : D + is + monD := new D(5); + monD.valeur().toString().println(); }