src/HOL/MicroJava/J/JListExample.thy
author haftmann
Tue, 07 Oct 2008 16:07:50 +0200
changeset 28524 644b62cf678f
parent 24783 5a3e336a2e37
child 32356 e11cd88e6ade
permissions -rw-r--r--
arbitrary is undefined
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
12951
a9fdcb71d252 introduces SystemClasses and BVExample
kleing
parents: 12911
diff changeset
     1
(*  Title:      HOL/MicroJava/J/JListExample.thy
12442
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
12911
704713ca07ea new document
kleing
parents: 12565
diff changeset
     6
header {* \isaheader{Example for generating executable code from Java semantics} *}
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
     7
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 24783
diff changeset
     8
theory JListExample
644b62cf678f arbitrary is undefined
haftmann
parents: 24783
diff changeset
     9
imports Eval SystemClasses
644b62cf678f arbitrary is undefined
haftmann
parents: 24783
diff changeset
    10
begin
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    11
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    12
ML {* Syntax.ambiguity_level := 100000 *}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    13
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    14
consts
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    15
  list_name :: cname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    16
  append_name :: mname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    17
  val_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    18
  next_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    19
  l_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    20
  l1_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    21
  l2_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    22
  l3_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    23
  l4_nam :: vnam
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    24
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    25
constdefs
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    26
  val_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    27
  "val_name == VName val_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    28
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    29
  next_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    30
  "next_name == VName next_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    31
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    32
  l_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    33
  "l_name == VName l_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    34
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    35
  l1_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    36
  "l1_name == VName l1_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    37
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    38
  l2_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    39
  "l2_name == VName l2_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    40
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    41
  l3_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    42
  "l3_name == VName l3_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    43
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    44
  l4_name :: vname
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    45
  "l4_name == VName l4_nam"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    46
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    47
  list_class :: "java_mb class"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    48
  "list_class ==
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    49
    (Object,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    50
     [(val_name, PrimT Integer), (next_name, RefT (ClassT list_name))],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    51
     [((append_name, [RefT (ClassT list_name)]), PrimT Void,
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    52
      ([l_name], [],
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    53
       If(BinOp Eq ({list_name}(LAcc This)..next_name) (Lit Null))
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    54
         Expr ({list_name}(LAcc This)..next_name:=LAcc l_name)
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    55
       Else
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    56
         Expr ({list_name}({list_name}(LAcc This)..next_name)..
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    57
           append_name({[RefT (ClassT list_name)]}[LAcc l_name])), 
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    58
       Lit Unit))])"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    59
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    60
  example_prg :: "java_mb prog"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    61
  "example_prg == [ObjectC, (list_name, list_class)]"
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    62
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    63
types_code
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    64
  cname ("string")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    65
  vnam ("string")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    66
  mname ("string")
24783
5a3e336a2e37 avoid internal names;
wenzelm
parents: 24460
diff changeset
    67
  loc' ("int")
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    68
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    69
consts_code
16770
1f1b1fae30e4 Auxiliary functions to be used in generated code are now defined using "attach".
berghofe
parents: 16417
diff changeset
    70
  "new_Addr" ("\<module>new'_addr {* %x. case x of None => True | Some y => False *}/ {* None *} {* Loc *}")
1f1b1fae30e4 Auxiliary functions to be used in generated code are now defined using "attach".
berghofe
parents: 16417
diff changeset
    71
attach {*
1f1b1fae30e4 Auxiliary functions to be used in generated code are now defined using "attach".
berghofe
parents: 16417
diff changeset
    72
fun new_addr p none loc hp =
1f1b1fae30e4 Auxiliary functions to be used in generated code are now defined using "attach".
berghofe
parents: 16417
diff changeset
    73
  let fun nr i = if p (hp (loc i)) then (loc i, none) else nr (i+1);
1f1b1fae30e4 Auxiliary functions to be used in generated code are now defined using "attach".
berghofe
parents: 16417
diff changeset
    74
  in nr 0 end;
1f1b1fae30e4 Auxiliary functions to be used in generated code are now defined using "attach".
berghofe
parents: 16417
diff changeset
    75
*}
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    76
28524
644b62cf678f arbitrary is undefined
haftmann
parents: 24783
diff changeset
    77
  "undefined" ("(raise Match)")
644b62cf678f arbitrary is undefined
haftmann
parents: 24783
diff changeset
    78
  "undefined :: val" ("{* Unit *}")
644b62cf678f arbitrary is undefined
haftmann
parents: 24783
diff changeset
    79
  "undefined :: cname" ("\"\"")
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    80
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    81
  "Object" ("\"Object\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    82
  "list_name" ("\"list\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    83
  "append_name" ("\"append\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    84
  "val_nam" ("\"val\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    85
  "next_nam" ("\"next\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    86
  "l_nam" ("\"l\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    87
  "l1_nam" ("\"l1\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    88
  "l2_nam" ("\"l2\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    89
  "l3_nam" ("\"l3\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    90
  "l4_nam" ("\"l4\"")
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    91
17145
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
    92
code_module J
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
    93
contains
13890
90611b4e0054 Made empty a translation rather than a constant.
nipkow
parents: 13672
diff changeset
    94
  test = "example_prg\<turnstile>Norm (empty, empty)
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    95
    -(Expr (l1_name::=NewC list_name);;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    96
      Expr ({list_name}(LAcc l1_name)..val_name:=Lit (Intg 1));;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    97
      Expr (l2_name::=NewC list_name);;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    98
      Expr ({list_name}(LAcc l2_name)..val_name:=Lit (Intg 2));;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
    99
      Expr (l3_name::=NewC list_name);;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   100
      Expr ({list_name}(LAcc l3_name)..val_name:=Lit (Intg 3));;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   101
      Expr (l4_name::=NewC list_name);;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   102
      Expr ({list_name}(LAcc l4_name)..val_name:=Lit (Intg 4));;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   103
      Expr ({list_name}(LAcc l1_name)..
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   104
        append_name({[RefT (ClassT list_name)]}[LAcc l2_name]));;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   105
      Expr ({list_name}(LAcc l1_name)..
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   106
        append_name({[RefT (ClassT list_name)]}[LAcc l3_name]));;
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   107
      Expr ({list_name}(LAcc l1_name)..
12565
9df4b3934487 Eliminated "query" syntax.
berghofe
parents: 12558
diff changeset
   108
        append_name({[RefT (ClassT list_name)]}[LAcc l4_name])))-> _"
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   109
12911
704713ca07ea new document
kleing
parents: 12565
diff changeset
   110
section {* Big step execution *}
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   111
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   112
ML {*
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   113
24460
62b96cf2bebb Code generator now uses sequences with depth limit.
berghofe
parents: 22921
diff changeset
   114
val SOME ((_, (heap, locs)), _) = DSeq.pull J.test;
17145
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   115
locs J.l1_name;
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   116
locs J.l2_name;
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   117
locs J.l3_name;
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   118
locs J.l4_name;
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   119
snd (J.the (heap (J.Loc 0))) (J.val_name, "list");
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   120
snd (J.the (heap (J.Loc 0))) (J.next_name, "list");
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   121
snd (J.the (heap (J.Loc 1))) (J.val_name, "list");
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   122
snd (J.the (heap (J.Loc 1))) (J.next_name, "list");
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   123
snd (J.the (heap (J.Loc 2))) (J.val_name, "list");
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   124
snd (J.the (heap (J.Loc 2))) (J.next_name, "list");
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   125
snd (J.the (heap (J.Loc 3))) (J.val_name, "list");
e623e57b0f44 Adapted to new code generator syntax.
berghofe
parents: 16770
diff changeset
   126
snd (J.the (heap (J.Loc 3))) (J.next_name, "list");
12442
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   127
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   128
*}
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   129
0ecba8660de7 Example for code generator.
berghofe
parents:
diff changeset
   130
end