Added unary and binary operations like (+,-,<, ...); Added smallstep semantics (no proofs about it yet).
1 (* Title: HOL/Bali/Term.thy
3 Author: David von Oheimb
4 License: GPL (GNU GENERAL PUBLIC LICENSE)
7 header {* Java expressions and statements *}
9 theory Term = Value + Table:
14 \item invocation frames for local variables could be reduced to special static
15 objects (one per method). This would reduce redundancy, but yield a rather
16 non-standard execution model more difficult to understand.
17 \item method bodies separated from calls to handle assumptions in axiomat.
19 NB: Body is intended to be in the environment of the called method.
20 \item class initialization is regarded as (auxiliary) statement
22 \item result expression of method return is handled by a special result variable
23 result variable is treated uniformly with local variables
25 \item[+] welltypedness and existence of the result/return expression is
26 ensured without extra efford
32 \item expression statement allowed for any expression
33 \item no unary, binary, etc, operators
34 \item This is modeled as a special non-assignable local variable
35 \item Super is modeled as a general expression with the same value as This
36 \item access to field x in current class via This.x
37 \item NewA creates only one-dimensional arrays;
38 initialization of further subarrays may be simulated with nested NewAs
39 \item The 'Lit' constructor is allowed to contain a reference value.
40 But this is assumed to be prohibited in the input language, which is enforced
41 by the type-checking rules.
42 \item a call of a static method via a type name may be simulated by a dummy
44 \item no nested blocks with inner local variables
45 \item no synchronized statements
46 \item no secondary forms of if, while (e.g. no for) (may be easily simulated)
47 \item no switch (may be simulated with if)
48 \item the @{text try_catch_finally} statement is divided into the
49 @{text try_catch} statement
50 and a finally statement, which may be considered as try..finally with
52 \item the @{text try_catch} statement has exactly one catch clause;
54 simulated with instanceof
55 \item the compiler is supposed to add the annotations {@{text _}} during
57 transformation is left out as its result is checked by the type rules anyway
63 types locals = "(lname, val) table" (* local variables *)
67 = Break label (* break *)
68 | Cont label (* continue *)
69 | Ret (* return from method *)
71 datatype xcpt (* exception *)
72 = Loc loc (* location of allocated execption object *)
73 | Std xname (* intermediate standard exception, see Eval.thy *)
76 = AccessViolation (* Access to a member that isn't permitted *)
78 datatype abrupt (* abrupt completion *)
79 = Xcpt xcpt (* exception *)
80 | Jump jump (* break, continue, return *)
81 | Error error (* runtime errors, we wan't to detect and proof absent
82 in welltyped programms *)
84 abopt = "abrupt option"
86 text {* Local variable store and exception.
87 Anticipation of State.thy used by smallstep semantics. For a method call,
88 we save the local variables of the caller in the term Callee to restore them
89 after method return. Also an exception must be restored after the finally
93 "locals" <= (type) "(lname, val) table"
95 datatype inv_mode (* invocation mode for method calls *)
98 | IntVir (* interface or virtual *)
100 record sig = (* signature of a method, cf. 8.4.2 *)
101 name ::"mname" (* acutally belongs to Decl.thy *)
105 "sig" <= (type) "\<lparr>name::mname,parTs::ty list\<rparr>"
106 "sig" <= (type) "\<lparr>name::mname,parTs::ty list,\<dots>::'a\<rparr>"
108 -- "function codes for unary operations"
109 datatype unop = UPlus -- "+ unary plus"
110 | UMinus -- "- unary minus"
111 | UBitNot -- "~ bitwise NOT"
112 | UNot -- "! logical complement"
114 -- "function codes for binary operations"
115 datatype binop = Mul -- "* multiplication"
116 | Div -- "/ division"
117 | Mod -- "% remainder"
118 | Plus -- "+ addition"
119 | Minus -- "- subtraction"
120 | LShift -- "<< left shift"
121 | RShift -- ">> signed right shift"
122 | RShiftU -- ">>> unsigned right shift"
123 | Less -- "< less than"
124 | Le -- "<= less than or equal"
125 | Greater -- "> greater than"
126 | Ge -- ">= greater than or equal"
128 | Neq -- "!= not equal"
129 | BitAnd -- "& bitwise AND"
130 | And -- "& boolean AND"
131 | BitXor -- "^ bitwise Xor"
132 | Xor -- "^ boolean Xor"
133 | BitOr -- "| bitwise Or"
134 | Or -- "| boolean Or"
137 = LVar lname(* local variable (incl. parameters) *)
138 | FVar qtname qtname bool expr vname
139 (*class field*)("{_,_,_}_.._"[10,10,10,85,99]90)
140 | AVar expr expr (* array component *) ("_.[_]"[90,10 ]90)
141 | InsInitV stmt var (* insertion of initialization before
142 evaluation of var (for smallstep sem.) *)
145 = NewC qtname (* class instance creation *)
146 | NewA ty expr (* array creation *) ("New _[_]"[99,10 ]85)
147 | Cast ty expr (* type cast *)
148 | Inst expr ref_ty (* instanceof *) ("_ InstOf _"[85,99] 85)
149 | Lit val (* literal value, references not allowed *)
150 | UnOp unop expr (* unary operation *)
151 | BinOp binop expr expr (* binary operation *)
153 | Super (* special Super keyword *)
154 | Acc var (* variable access *)
155 | Ass var expr (* variable assign *) ("_:=_" [90,85 ]85)
156 | Cond expr expr expr (* conditional *) ("_ ? _ : _" [85,85,80]80)
157 | Call qtname ref_ty inv_mode expr mname "(ty list)"
158 "(expr list)" (* method call *)
159 ("{_,_,_}_\<cdot>_'( {_}_')"[10,10,10,85,99,10,10]85)
160 | Methd qtname sig (* (folded) method (see below) *)
161 | Body qtname stmt (* (unfolded) method body *)
162 | InsInitE stmt expr (* insertion of initialization before
163 evaluation of expr (for smallstep sem.) *)
164 | Callee locals expr (* save Callers locals in Callee-Frame
165 (for smallstep semantics) *)
167 = Skip (* empty statement *)
168 | Expr expr (* expression statement *)
169 | Lab jump stmt ("_\<bullet> _"(* labeled statement*)[ 99,66]66)
171 | Comp stmt stmt ("_;; _" [ 66,65]65)
172 | If_ expr stmt stmt ("If'(_') _ Else _" [ 80,79,79]70)
173 | Loop label expr stmt ("_\<bullet> While'(_') _" [ 99,80,79]70)
174 | Do jump (* break, continue, return *)
177 qtname vname stmt ("Try _ Catch'(_ _') _" [79,99,80,79]70)
178 | Fin stmt stmt ("_ Finally _" [ 79,79]70)
179 | FinA abopt stmt (* Save abruption of first statement
180 (for smallstep sem.) *)
181 | Init qtname (* class initialization *)
185 The expressions Methd and Body are artificial program constructs, in the
186 sense that they are not used to define a concrete Bali program. In the
187 operational semantic's they are "generated on the fly"
188 to decompose the task to define the behaviour of the Call expression.
189 They are crucial for the axiomatic semantics to give a syntactic hook to insert
190 some assertions (cf. AxSem.thy, Eval.thy).
191 The Init statement (to initialize a class on its first use) is
192 inserted in various places by the semantics.
193 Callee, InsInitV, InsInitE,FinA are only needed as intermediate steps in the
194 smallstep (transition) semantics (cf. Trans.thy). Callee is used to save the
195 local variables of the caller for method return. So ve avoid modelling a
197 The InsInitV/E terms are only used by the smallstep semantics to model the
198 intermediate steps of class-initialisation.
201 types "term" = "(expr+stmt,var,expr list) sum3"
203 "sig" <= (type) "mname \<times> ty list"
204 "var" <= (type) "Term.var"
205 "expr" <= (type) "Term.expr"
206 "stmt" <= (type) "Term.stmt"
207 "term" <= (type) "(expr+stmt,var,expr list) sum3"
212 LAcc :: "vname \<Rightarrow> expr" ("!!")
213 LAss :: "vname \<Rightarrow> expr \<Rightarrow>stmt" ("_:==_" [90,85] 85)
214 Return :: "expr \<Rightarrow> stmt"
215 StatRef :: "ref_ty \<Rightarrow> expr"
219 "this" == "Acc (LVar This)"
220 "!!v" == "Acc (LVar (EName (VNam v)))"
221 "v:==e" == "Expr (Ass (LVar (EName (VNam v))) e)"
222 "Return e" == "Expr (Ass (LVar (EName Res)) e);; Do Ret"
223 (* Res := e;; Do Ret *)
224 "StatRef rt" == "Cast (RefT rt) (Lit Null)"
228 is_stmt :: "term \<Rightarrow> bool"
229 "is_stmt t \<equiv> \<exists>c. t=In1r c"
232 bind_thms ("is_stmt_rews", sum3_instantiate (thm "is_stmt_def"));
235 declare is_stmt_rews [simp]