6 |
6 |
7 theory TranslComp imports TranslCompTp begin |
7 theory TranslComp imports TranslCompTp begin |
8 |
8 |
9 |
9 |
10 (* parameter java_mb only serves to define function index later *) |
10 (* parameter java_mb only serves to define function index later *) |
11 consts |
|
12 compExpr :: "java_mb => expr => instr list" |
|
13 compExprs :: "java_mb => expr list => instr list" |
|
14 compStmt :: "java_mb => stmt => instr list" |
|
15 |
|
16 |
11 |
17 |
12 |
18 (**********************************************************************) |
13 (**********************************************************************) |
19 (** code generation for expressions **) |
14 (** code generation for expressions **) |
20 |
15 |
21 primrec |
16 primrec compExpr :: "java_mb => expr => instr list" |
|
17 and compExprs :: "java_mb => expr list => instr list" |
|
18 where |
|
19 |
22 (*class instance creation*) |
20 (*class instance creation*) |
23 "compExpr jmb (NewC c) = [New c]" |
21 "compExpr jmb (NewC c) = [New c]" | |
24 |
22 |
25 (*type cast*) |
23 (*type cast*) |
26 "compExpr jmb (Cast c e) = compExpr jmb e @ [Checkcast c]" |
24 "compExpr jmb (Cast c e) = compExpr jmb e @ [Checkcast c]" | |
27 |
25 |
28 |
26 |
29 (*literals*) |
27 (*literals*) |
30 "compExpr jmb (Lit val) = [LitPush val]" |
28 "compExpr jmb (Lit val) = [LitPush val]" | |
31 |
29 |
32 |
30 |
33 (* binary operation *) |
31 (* binary operation *) |
34 "compExpr jmb (BinOp bo e1 e2) = compExpr jmb e1 @ compExpr jmb e2 @ |
32 "compExpr jmb (BinOp bo e1 e2) = compExpr jmb e1 @ compExpr jmb e2 @ |
35 (case bo of Eq => [Ifcmpeq 3,LitPush(Bool False),Goto 2,LitPush(Bool True)] |
33 (case bo of Eq => [Ifcmpeq 3,LitPush(Bool False),Goto 2,LitPush(Bool True)] |
36 | Add => [IAdd])" |
34 | Add => [IAdd])" | |
37 |
35 |
38 (*local variable*) |
36 (*local variable*) |
39 "compExpr jmb (LAcc vn) = [Load (index jmb vn)]" |
37 "compExpr jmb (LAcc vn) = [Load (index jmb vn)]" | |
40 |
38 |
41 |
39 |
42 (*assignement*) |
40 (*assignement*) |
43 "compExpr jmb (vn::=e) = compExpr jmb e @ [Dup , Store (index jmb vn)]" |
41 "compExpr jmb (vn::=e) = compExpr jmb e @ [Dup , Store (index jmb vn)]" | |
44 |
42 |
45 |
43 |
46 (*field access*) |
44 (*field access*) |
47 "compExpr jmb ( {cn}e..fn ) = compExpr jmb e @ [Getfield fn cn]" |
45 "compExpr jmb ( {cn}e..fn ) = compExpr jmb e @ [Getfield fn cn]" | |
48 |
46 |
49 |
47 |
50 (*field assignement - expected syntax: {_}_.._:=_ *) |
48 (*field assignement - expected syntax: {_}_.._:=_ *) |
51 "compExpr jmb (FAss cn e1 fn e2 ) = |
49 "compExpr jmb (FAss cn e1 fn e2 ) = |
52 compExpr jmb e1 @ compExpr jmb e2 @ [Dup_x1 , Putfield fn cn]" |
50 compExpr jmb e1 @ compExpr jmb e2 @ [Dup_x1 , Putfield fn cn]" | |
53 |
51 |
54 |
52 |
55 (*method call*) |
53 (*method call*) |
56 "compExpr jmb (Call cn e1 mn X ps) = |
54 "compExpr jmb (Call cn e1 mn X ps) = |
57 compExpr jmb e1 @ compExprs jmb ps @ [Invoke cn mn X]" |
55 compExpr jmb e1 @ compExprs jmb ps @ [Invoke cn mn X]" | |
58 |
56 |
59 |
57 |
60 (** code generation expression lists **) |
58 (** code generation expression lists **) |
61 |
59 |
62 "compExprs jmb [] = []" |
60 "compExprs jmb [] = []" | |
63 |
61 |
64 "compExprs jmb (e#es) = compExpr jmb e @ compExprs jmb es" |
62 "compExprs jmb (e#es) = compExpr jmb e @ compExprs jmb es" |
65 |
63 |
66 |
|
67 |
64 |
68 primrec |
65 primrec compStmt :: "java_mb => stmt => instr list" where |
|
66 |
69 (** code generation for statements **) |
67 (** code generation for statements **) |
70 |
68 |
71 "compStmt jmb Skip = []" |
69 "compStmt jmb Skip = []" | |
72 |
70 |
73 "compStmt jmb (Expr e) = ((compExpr jmb e) @ [Pop])" |
71 "compStmt jmb (Expr e) = ((compExpr jmb e) @ [Pop])" | |
74 |
72 |
75 "compStmt jmb (c1;; c2) = ((compStmt jmb c1) @ (compStmt jmb c2))" |
73 "compStmt jmb (c1;; c2) = ((compStmt jmb c1) @ (compStmt jmb c2))" | |
76 |
74 |
77 "compStmt jmb (If(e) c1 Else c2) = |
75 "compStmt jmb (If(e) c1 Else c2) = |
78 (let cnstf = LitPush (Bool False); |
76 (let cnstf = LitPush (Bool False); |
79 cnd = compExpr jmb e; |
77 cnd = compExpr jmb e; |
80 thn = compStmt jmb c1; |
78 thn = compStmt jmb c1; |
81 els = compStmt jmb c2; |
79 els = compStmt jmb c2; |
82 test = Ifcmpeq (int(length thn +2)); |
80 test = Ifcmpeq (int(length thn +2)); |
83 thnex = Goto (int(length els +1)) |
81 thnex = Goto (int(length els +1)) |
84 in |
82 in |
85 [cnstf] @ cnd @ [test] @ thn @ [thnex] @ els)" |
83 [cnstf] @ cnd @ [test] @ thn @ [thnex] @ els)" | |
86 |
84 |
87 "compStmt jmb (While(e) c) = |
85 "compStmt jmb (While(e) c) = |
88 (let cnstf = LitPush (Bool False); |
86 (let cnstf = LitPush (Bool False); |
89 cnd = compExpr jmb e; |
87 cnd = compExpr jmb e; |
90 bdy = compStmt jmb c; |
88 bdy = compStmt jmb c; |