src/HOL/MicroJava/Comp/TranslComp.thy
changeset 39758 b8a53e3a0ee2
parent 35416 d8d7d1b785af
equal deleted inserted replaced
39757:21423597a80d 39758:b8a53e3a0ee2
     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;