src/Tools/code/code_name.ML
author haftmann
Sun, 22 Mar 2009 11:56:32 +0100
changeset 30648 17365ef082f3
parent 30364 577edc39b501
child 31013 69a476d6fea6
permissions -rw-r--r--
clarified relationship of modules Code_Name and Code_Printer
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
     1
(*  Title:      Tools/code/code_name.ML
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
     2
    Author:     Florian Haftmann, TU Muenchen
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
     3
28663
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
     4
Some code generator infrastructure concerning names.
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
     5
*)
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
     6
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
     7
signature CODE_NAME =
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
     8
sig
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
     9
  val purify_var: string -> string
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    10
  val purify_tvar: string -> string
30648
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    11
  val purify_base: string -> string
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    12
  val check_modulename: string -> string
27103
d8549f4d900b major refactorings in code generator modules
haftmann
parents: 25999
diff changeset
    13
28663
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    14
  val read_const_exprs: theory -> string list -> string list * string list
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    15
end;
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    16
28054
2b84d34c5d02 restructured and split code serializer module
haftmann
parents: 28016
diff changeset
    17
structure Code_Name: CODE_NAME =
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    18
struct
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    19
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    20
(** purification **)
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    21
30648
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    22
fun purify_name upper =
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    23
  let
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    24
    fun is_valid s = Symbol.is_ascii_letter s orelse Symbol.is_ascii_digit s orelse s = "'";
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    25
    val is_junk = not o is_valid andf Symbol.is_regular;
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    26
    val junk = Scan.many is_junk;
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    27
    val scan_valids = Symbol.scanner "Malformed input"
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    28
      ((junk |--
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    29
        (Scan.optional (Scan.one Symbol.is_ascii_letter) "x" ^^ (Scan.many is_valid >> implode)
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    30
        --| junk))
25999
f8bcd311d501 added ::: / @@@ scanner combinators;
wenzelm
parents: 25597
diff changeset
    31
      ::: Scan.repeat ((Scan.many1 is_valid >> implode) --| junk));
25337
93da87a1d2b3 added purify_sym
haftmann
parents: 25313
diff changeset
    32
    fun upper_lower cs = if upper then nth_map 0 Symbol.to_ascii_upper cs
30648
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    33
      else (if forall Symbol.is_ascii_upper cs
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    34
        then map else nth_map 0) Symbol.to_ascii_lower cs;
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    35
  in
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    36
    explode
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    37
    #> scan_valids
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    38
    #> space_implode "_"
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    39
    #> explode
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    40
    #> upper_lower
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    41
    #> implode
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    42
  end;
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    43
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    44
fun purify_var "" = "x"
30648
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    45
  | purify_var v = purify_name false v;
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    46
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    47
fun purify_tvar "" = "'a"
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    48
  | purify_tvar v =
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    49
      (unprefix "'" #> explode #> filter Symbol.is_ascii_letter #> cons "'" #> implode) v;
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    50
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    51
val purify_prefix =
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    52
  explode
28663
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    53
  (*FIMXE should disappear as soon as hierarchical theory name spaces are available*)
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    54
  #> Symbol.scanner "Malformed name"
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    55
      (Scan.repeat ($$ "_" |-- $$ "_" >> (fn _ => ".") || Scan.one Symbol.is_regular))
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    56
  #> implode
30364
577edc39b501 moved basic algebra of long names from structure NameSpace to Long_Name;
wenzelm
parents: 30161
diff changeset
    57
  #> Long_Name.explode
30648
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    58
  #> map (purify_name true);
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    59
28663
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    60
(*FIMXE non-canonical function treating non-canonical names*)
30648
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    61
fun purify_base "op &" = "and"
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    62
  | purify_base "op |" = "or"
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    63
  | purify_base "op -->" = "implies"
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    64
  | purify_base "op :" = "member"
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    65
  | purify_base "*" = "product"
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    66
  | purify_base "+" = "sum"
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    67
  | purify_base s = if String.isPrefix "op =" s
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    68
      then "eq" ^ purify_name false s
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    69
      else purify_name false s;
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    70
28663
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    71
fun check_modulename mn =
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    72
  let
30364
577edc39b501 moved basic algebra of long names from structure NameSpace to Long_Name;
wenzelm
parents: 30161
diff changeset
    73
    val mns = Long_Name.explode mn;
30648
17365ef082f3 clarified relationship of modules Code_Name and Code_Printer
haftmann
parents: 30364
diff changeset
    74
    val mns' = map (purify_name true) mns;
28663
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    75
  in
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    76
    if mns' = mns then mn else error ("Invalid module name: " ^ quote mn ^ "\n"
30364
577edc39b501 moved basic algebra of long names from structure NameSpace to Long_Name;
wenzelm
parents: 30161
diff changeset
    77
      ^ "perhaps try " ^ quote (Long_Name.implode mns'))
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    78
  end;
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    79
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    80
28663
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    81
(** misc **)
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
    82
28663
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    83
fun read_const_exprs thy =
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    84
  let
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    85
    fun consts_of some_thyname =
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    86
      let
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    87
        val thy' = case some_thyname
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    88
         of SOME thyname => ThyInfo.the_theory thyname thy
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    89
          | NONE => thy;
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    90
        val cs = Symtab.fold (fn (c, (_, NONE)) => cons c | _ => I)
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    91
          ((snd o #constants o Consts.dest o #consts o Sign.rep_sg) thy') [];
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    92
        fun belongs_here c =
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    93
          not (exists (fn thy'' => Sign.declared_const thy'' c) (Theory.parents_of thy'))
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    94
      in case some_thyname
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    95
       of NONE => cs
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    96
        | SOME thyname => filter belongs_here cs
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    97
      end;
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    98
    fun read_const_expr "*" = ([], consts_of NONE)
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
    99
      | read_const_expr s = if String.isSuffix ".*" s
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
   100
          then ([], consts_of (SOME (unsuffix ".*" s)))
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
   101
          else ([Code_Unit.read_const thy s], []);
bd8438543bf2 code identifier namings are no longer imperative
haftmann
parents: 28346
diff changeset
   102
  in pairself flat o split_list o map read_const_expr end;
24219
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
   103
e558fe311376 new structure for code generator modules
haftmann
parents:
diff changeset
   104
end;