src/HOL/MicroJava/JVM/JVMListExample.thy
author berghofe
Mon, 10 Dec 2001 15:24:48 +0100
changeset 12442 0ecba8660de7
child 12518 521f2da133be
permissions -rw-r--r--
Example for code generator.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     1
(*  Title:      HOL/MicroJava/JVM/JVMListExample.thy
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     2
    ID:         $Id$
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     3
    Author:     Stefan Berghofer
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     4
*)
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     5
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     6
header {* Example for generating executable code from JVM semantics *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     7
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     8
theory JVMListExample = JVMExec:
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     9
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    10
consts
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    11
  list_name :: cname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    12
  test_name :: cname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    13
  append_name :: mname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    14
  makelist_name :: mname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    15
  val_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    16
  next_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    17
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    18
constdefs
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    19
  val_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    20
  "val_name == VName val_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    21
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    22
  next_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    23
  "next_name == VName next_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    24
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    25
  list_class :: "(nat * nat * bytecode) class"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    26
  "list_class ==
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    27
    (Object,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    28
     [(val_name, PrimT Integer), (next_name, RefT (ClassT list_name))],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    29
     [((append_name, [RefT (ClassT list_name)]), PrimT Integer,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    30
      (0, 0,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    31
       [Load 0,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    32
        Getfield next_name list_name,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    33
        Dup,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    34
        LitPush Null,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    35
        Ifcmpeq 4,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    36
        Load 1,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    37
        Invoke list_name append_name [RefT (ClassT list_name)],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    38
        Return,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    39
        Pop,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    40
        Load 0,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    41
        Load 1,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    42
        Putfield next_name list_name,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    43
        LitPush Unit,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    44
        Return]))])"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    45
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    46
  test_class :: "(nat * nat * bytecode) class"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    47
  "test_class ==
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    48
    (Object, [],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    49
     [((makelist_name, []), PrimT Integer,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    50
      (0, 3,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    51
       [New list_name,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    52
        Dup,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    53
        Store 0,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    54
        LitPush (Intg 1),
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    55
        Putfield val_name list_name,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    56
        New list_name,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    57
        Dup,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    58
        Store 1,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    59
        LitPush (Intg 2),
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    60
        Putfield val_name list_name,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    61
        New list_name,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    62
        Dup,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    63
        Store 2,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    64
        LitPush (Intg 3),
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    65
        Putfield val_name list_name,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    66
        Load 0,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    67
        Load 1,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    68
        Invoke list_name append_name [RefT (ClassT list_name)],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    69
        Load 0,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    70
        Load 2,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    71
        Invoke list_name append_name [RefT (ClassT list_name)],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    72
        LitPush Unit,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    73
        Return]))])"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    74
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    75
  example_prg :: jvm_prog
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    76
  "example_prg == [ObjectC, (list_name, list_class), (test_name, test_class)]"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    77
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    78
  start_state :: jvm_state
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    79
  "start_state ==
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    80
    (None, empty, [([], Unit # Unit # Unit # [], test_name, (makelist_name, []), 0)])"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    81
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    82
types_code
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    83
  cname ("string")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    84
  vnam ("string")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    85
  mname ("string")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    86
  loc ("int")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    87
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    88
consts_code
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    89
  "new_Addr" ("new'_addr {* %x. case x of None => True | Some y => False *}/ {* None *}")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    90
  "cast_ok" ("true????")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    91
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    92
  "wf" ("true?")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    93
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    94
  "arbitrary" ("(raise ERROR)")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    95
  "arbitrary" :: "val" ("{* Unit *}")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    96
  "arbitrary" :: "cname" ("\"\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    97
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    98
  "Object" ("\"Object\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    99
  "list_name" ("\"list\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   100
  "test_name" ("\"test\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   101
  "append_name" ("\"append\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   102
  "makelist_name" ("\"makelist\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   103
  "val_nam" ("\"val\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   104
  "next_nam" ("\"next\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   105
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   106
ML {*
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   107
fun new_addr p none hp =
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   108
  let fun nr i = if p (hp i) then (i, none) else nr (i+1);
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   109
  in nr 0 end;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   110
*}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   111
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   112
subsection {* Single step execution *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   113
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   114
generate_code
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   115
  test = "exec (example_prg, start_state)"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   116
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   117
ML {* test *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   118
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   119
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   120
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   121
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   122
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   123
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   124
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   125
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   126
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   127
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   128
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   129
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   130
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   131
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   132
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   133
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   134
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   135
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   136
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   137
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   138
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   139
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   140
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   141
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   142
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   143
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   144
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   145
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   146
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   147
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   148
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   149
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   150
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   151
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   152
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   153
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   154
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   155
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   156
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   157
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   158
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   159
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   160
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   161
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   162
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   163
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   164
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   165
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   166
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   167
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   168
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   169
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   170
ML {* exec (example_prg, the it) *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   171
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   172
end
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   173