src/Pure/Syntax/syntax.ML
author clasohm
Thu, 16 Sep 1993 12:20:38 +0200
changeset 0 a5a9c433f639
child 18 c9ec452ff08f
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title:      Pure/Syntax/syntax
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author:     Tobias Nipkow and Markus Wenzel, TU Muenchen
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
signature SYNTAX =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
  (* FIXME include AST0 (?) *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
  include LEXICON0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
  include EXTENSION0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
  include TYPE_EXT0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
  include SEXTENSION1
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
  include PRINTER0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
  structure Extension: EXTENSION
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
  structure Pretty: PRETTY
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
  local open Extension.XGram Extension.XGram.Ast in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
    type syntax
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
    val print_gram: syntax -> unit
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
    val print_trans: syntax -> unit
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
    val print_syntax: syntax -> unit
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
    val read_ast: syntax -> string * string -> ast
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
    val read: syntax -> typ -> string -> term
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
    val pretty_term: syntax -> term -> Pretty.T
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
    val pretty_typ: syntax -> typ -> Pretty.T
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
    val string_of_term: syntax -> term -> string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
    val string_of_typ: syntax -> typ -> string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
    val type_syn: syntax
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
    val extend: syntax * (indexname -> sort) -> string list * string list * sext
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
      -> syntax
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
    val merge: syntax * syntax -> syntax
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
  end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
functor SyntaxFun(structure Symtab: SYMTAB and TypeExt: TYPE_EXT
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
  and Parser: PARSER and SExtension: SEXTENSION and Printer: PRINTER
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
  sharing TypeExt.Extension.XGram = Parser.XGram = Printer.XGram
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
  and TypeExt.Extension = SExtension.Extension
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
  and Parser.ParseTree.Ast = Parser.XGram.Ast)(*: SYNTAX *) = (* FIXME *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
structure Extension = TypeExt.Extension;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
structure XGram = Extension.XGram;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
structure Lexicon = Parser.ParseTree.Lexicon;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
open Lexicon Extension TypeExt SExtension Printer XGram XGram.Ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
fun lookup tab a = Symtab.lookup (tab, a);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
(** datatype syntax **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
datatype tables =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
  Tab of {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
    gram: Parser.Gram,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
    lexicon: Lexicon,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
    const_tab: unit Symtab.table,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
    parse_ast_trtab: (ast list -> ast) Symtab.table,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
    parse_preproc: ast -> ast,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
    parse_ruletab: (ast * ast) list Symtab.table,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
    parse_postproc: ast -> ast,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
    parse_trtab: (term list -> term) Symtab.table,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
    print_trtab: (term list -> term) Symtab.table,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
    print_preproc: ast -> ast,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
    print_ruletab: (ast * ast) list Symtab.table,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
    print_postproc: ast -> ast,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
    print_tab: Printer.tab};
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
datatype gramgraph =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
  EmptyGG |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
  ExtGG of gramgraph ref * (ext * synrules) |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
  MergeGG of gramgraph ref * gramgraph ref;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
datatype syntax = Syntax of gramgraph ref * tables;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
(*** compile syntax ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
(* ggr_to_xgram *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
fun ggr_to_xgram ggr =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
    fun flatGG ggr (xg, v) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
      if ggr mem v then (xg, v) else flatGG' ggr (xg, ggr :: v)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
    and flatGG' (ref EmptyGG) xgv = xgv
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
      | flatGG' (ref (ExtGG (ggr, ext))) xgv =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
          let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
            val (xg', v') = flatGG ggr xgv
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
          in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
            (Extension.extend xg' ext, v')
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
          end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
      | flatGG' (ref (MergeGG (ggr1, ggr2))) xgv =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
          flatGG ggr1 (flatGG ggr2 xgv);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
    fst (flatGG ggr (Extension.empty, []))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
(* mk_ruletab *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
fun mk_ruletab rules =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
    fun add_rule (r, tab) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
      let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
        val a = head_of_rule r
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
      in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
        case lookup tab a of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
          None => Symtab.update ((a, [r]), tab)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
        | Some rs => Symtab.update ((a, r :: rs), tab)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
      end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
    Symtab.balance (foldr add_rule (rules, Symtab.null))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
(* make_syntax *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
fun make_syntax ggr =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
    fun mk_const_tab cs =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
      Symtab.balance
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
        (Symtab.st_of_alist ((map (fn c => (c, ())) cs), Symtab.null));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
    fun mk_trtab alst name =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
      Symtab.balance (Symtab.st_of_alist (alst, Symtab.null))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
        handle Symtab.DUPLICATE s => error ("More than one " ^ name ^ " for " ^ quote s);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
    fun mk_proc (Some f) = f
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
      | mk_proc None = I;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
    fun all_strings (opl: string prod list): string list =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
        flat (map (fn Prod (_, syn, _, _) => terminals syn) opl);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
    fun str_to_tok (opl: string prod list, lex: Lexicon): Token prod list =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
      map
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
        (fn Prod (t, syn, s, pa) =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
          Prod (t, translate (hd o tokenize lex) syn, s, pa))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
        opl;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
    fun xgram_to_tables (XGram xgram) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
      let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
        val {roots, prods, consts, parse_ast_translation, parse_preproc, parse_rules,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
          parse_postproc, parse_translation, print_translation, print_preproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
          print_rules, print_postproc, print_ast_translation} = xgram;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
        val lexicon = mk_lexicon (all_strings prods);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
      in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
        Tab {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
          gram = Parser.compile_xgram (roots, str_to_tok (prods, lexicon)),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
          lexicon = lexicon,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
          const_tab = mk_const_tab consts,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
          parse_ast_trtab = mk_trtab parse_ast_translation "parse ast translation",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
          parse_preproc = mk_proc parse_preproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
          parse_ruletab = mk_ruletab parse_rules,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
          parse_postproc = mk_proc parse_postproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
          parse_trtab = mk_trtab parse_translation "parse translation",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
          print_trtab = mk_trtab print_translation "print translation",
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
          print_preproc = mk_proc print_preproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
          print_ruletab = mk_ruletab print_rules,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
          print_postproc = mk_proc print_postproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
          print_tab = mk_print_tab prods
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
            (mk_trtab print_ast_translation "print ast translation")}
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
      end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
    Syntax (ggr, xgram_to_tables (ggr_to_xgram ggr))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
(* add_synrules *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
fun add_synrules (Tab tabs) (SynRules rules) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
    val {gram, lexicon, const_tab, parse_ast_trtab, parse_preproc, parse_ruletab,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
      parse_postproc, parse_trtab, print_trtab, print_preproc, print_ruletab,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
      print_postproc, print_tab} = tabs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
    val {parse_rules, print_rules} = rules;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
    val parse_rs = flat (map snd (Symtab.alist_of parse_ruletab)) @ parse_rules;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
    val print_rs = flat (map snd (Symtab.alist_of print_ruletab)) @ print_rules;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
    Tab {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
      gram = gram, lexicon = lexicon, const_tab = const_tab,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
      parse_ast_trtab = parse_ast_trtab,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
      parse_preproc = parse_preproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
      parse_ruletab = mk_ruletab parse_rs,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
      parse_postproc = parse_postproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
      parse_trtab = parse_trtab,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
      print_trtab = print_trtab,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
      print_preproc = print_preproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
      print_ruletab = mk_ruletab print_rs,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
      print_postproc = print_postproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
      print_tab = print_tab}
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
(*** inspect syntax ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
(* print_syntax_old *) (* FIXME remove *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   199
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   200
fun print_syntax_old (Syntax (_, Tab {gram, lexicon, ...})) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   201
  Parser.print_gram (gram, lexicon);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   202
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   203
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
fun xgram_of (Syntax (ggr, _)) = ggr_to_xgram ggr;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   207
fun string_of_big_list name prts =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   208
  Pretty.string_of (Pretty.blk (2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
    separate Pretty.fbrk (Pretty.str name :: prts)));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   210
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   211
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
(* print_gram *)    (* FIXME check *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
fun prt_gram (XGram {roots, prods, ...}) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   215
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   216
    fun pretty_name name = [Pretty.str (name ^ " ="), Pretty.brk 1];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   217
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
    fun pretty_xsymbs (Terminal s :: xs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
          Pretty.str (quote s) :: Pretty.brk 1 :: pretty_xsymbs xs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
      | pretty_xsymbs (Nonterminal (s, p) :: xs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
          (if is_terminal s then Pretty.str s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
          else Pretty.str (s ^ "[" ^ string_of_int p ^ "]"))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
            :: Pretty.brk 1 :: pretty_xsymbs xs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
      | pretty_xsymbs (_ :: xs) = pretty_xsymbs xs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
      | pretty_xsymbs [] = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
    fun pretty_const "" = [Pretty.brk 1]
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
      | pretty_const c = [Pretty.str (" => " ^ quote c), Pretty.brk 1];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   229
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
    fun pretty_pri p = [Pretty.str ("(" ^ string_of_int p ^ ")")];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
    fun pretty_prod (Prod (name, xsymbs, const, pri)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
      Pretty.blk (2, pretty_name name @ pretty_xsymbs xsymbs @
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   234
        pretty_const const @ pretty_pri pri);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
    writeln (Pretty.string_of (Pretty.blk (2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
      separate (Pretty.brk 1) (map Pretty.str ("roots:" :: roots)))));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
    writeln (string_of_big_list "prods:" (map pretty_prod prods))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   240
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   242
val print_gram = prt_gram o xgram_of;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   243
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   244
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   245
(* print_trans *)   (* FIXME check *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
fun prt_trans (XGram xgram) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   248
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   249
    fun string_of_strings name strs =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   250
      Pretty.string_of (Pretty.blk (2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   251
        separate (Pretty.brk 1) (map Pretty.str (name :: map quote strs))));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   252
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   253
    fun string_of_trs name trs = string_of_strings name (map fst trs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   254
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   255
    fun string_of_proc name proc =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   256
      Pretty.string_of (Pretty.blk (2, [Pretty.str name, Pretty.brk 1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   257
        Pretty.str (if is_none proc then "None" else "Some fn")]));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   258
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   259
    fun string_of_rules name rules =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   260
      string_of_big_list name (map pretty_rule rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   261
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   262
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   263
    val {consts, parse_ast_translation, parse_preproc, parse_rules,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   264
      parse_postproc, parse_translation, print_translation, print_preproc,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   265
      print_rules, print_postproc, print_ast_translation, ...} = xgram;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   266
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   267
    writeln (string_of_strings "consts:" consts);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   268
    writeln (string_of_trs "parse_ast_translation:" parse_ast_translation);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   269
    writeln (string_of_proc "parse_preproc:" parse_preproc);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   270
    writeln (string_of_rules "parse_rules:" parse_rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   271
    writeln (string_of_proc "parse_postproc:" parse_postproc);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   272
    writeln (string_of_trs "parse_translation:" parse_translation);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   273
    writeln (string_of_trs "print_translation:" print_translation);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   274
    writeln (string_of_proc "print_preproc:" print_preproc);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   275
    writeln (string_of_rules "print_rules:" print_rules);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   276
    writeln (string_of_proc "print_postproc:" print_postproc);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   277
    writeln (string_of_trs "print_ast_translation:" print_ast_translation)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   278
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   279
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   280
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   281
val print_trans = prt_trans o xgram_of;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   282
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   283
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   284
(* print_syntax *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   285
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   286
fun print_syntax syn =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   287
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   288
    val xgram = xgram_of syn;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   289
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   290
    prt_gram xgram; prt_trans xgram
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   291
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   292
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   293
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   294
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   295
(*** parsing and printing ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   296
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   297
(* read_ast *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   298
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   299
fun read_ast syn (root, s) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   300
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   301
    val Syntax (_, Tab {gram, lexicon, parse_ast_trtab, ...}) = syn;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   302
    val root = if Parser.parsable (gram, root) then root else error ("Unparsable root " ^ root) (* Extension.logic *);    (* FIXME *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   303
    fun syn_err toks =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   304
      error ("Syntax error at\n" ^ space_implode " " (map token_to_string toks));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   305
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   306
    Parser.ParseTree.pt_to_ast (lookup parse_ast_trtab)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   307
      (Parser.parse (gram, root, tokenize lexicon s))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   308
        handle Parser.SYNTAX_ERR toks => syn_err toks
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   309
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   310
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   311
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   312
(* norm_ast *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   313
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   314
fun norm_ast ruletab ast =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   315
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   316
    fun get_rules a =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   317
      (case lookup ruletab a of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   318
        Some rules => rules
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   319
      | None => []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   320
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   321
    normalize (if Symtab.is_null ruletab then None else Some get_rules) ast
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   322
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   323
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   324
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   325
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   326
(** read **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   327
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   328
fun read (syn as Syntax (_, Tab tabs)) ty s =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   329
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   330
    val {parse_preproc, parse_ruletab, parse_postproc, parse_trtab, ...} = tabs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   331
    val ast = read_ast syn (typ_to_nt ty, s);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   332
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   333
    ast_to_term (lookup parse_trtab)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   334
      (parse_postproc (norm_ast parse_ruletab (parse_preproc ast)))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   335
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   336
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   337
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   338
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   339
(** pprint_ast **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   340
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   341
val pprint_ast = Pretty.pprint o pretty_ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   342
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   343
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   344
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   345
(** pretty term, typ **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   346
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   347
fun pretty_t t_to_ast pretty_t (syn as Syntax (_, Tab tabs)) t =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   348
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   349
    val {print_trtab, print_preproc, print_ruletab, print_postproc, print_tab, ...} = tabs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   350
    val ast = t_to_ast (lookup print_trtab) t;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   351
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   352
    pretty_t print_tab
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   353
      (print_postproc (norm_ast print_ruletab (print_preproc ast)))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   354
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   355
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   356
val pretty_term = pretty_t term_to_ast pretty_term_ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   357
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   358
val pretty_typ = pretty_t typ_to_ast pretty_typ_ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   359
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   360
fun string_of_term syn t = Pretty.string_of (pretty_term syn t);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   361
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   362
fun string_of_typ syn ty = Pretty.string_of (pretty_typ syn ty);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   363
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   364
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   365
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   366
(*** build syntax ***)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   367
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   368
(* type_syn *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   369
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   370
val type_syn = make_syntax (ref (ExtGG (ref EmptyGG, (type_ext, empty_synrules))));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   371
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   372
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   373
(* extend *)  (* FIXME check *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   374
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   375
fun extend (old_syn as Syntax (ggr, _), def_sort) (roots, xconsts, sext) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   376
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   377
    fun read_typ s = typ_of_term def_sort (read old_syn typeT s);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   378
    val ext = ext_of_sext roots xconsts read_typ sext;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   379
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   380
    fun right_rule (xpat1 |-> xpat2) = Some (xpat1, xpat2)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   381
      | right_rule (xpat1 <-| xpat2) = None
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   382
      | right_rule (xpat1 <-> xpat2) = Some (xpat1, xpat2);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   383
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   384
    fun left_rule (xpat1 |-> xpat2) = None
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   385
      | left_rule (xpat1 <-| xpat2) = Some (xpat2, xpat1)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   386
      | left_rule (xpat1 <-> xpat2) = Some (xpat2, xpat1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   387
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   388
    val (tmp_syn as Syntax (_, tmp_tabs)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   389
      make_syntax (ref (ExtGG (ggr, (ext, empty_synrules))));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   390
    val Syntax (_, Tab {const_tab, ...}) = tmp_syn;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   391
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   392
    fun constantify (ast as (Constant _)) = ast
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   393
      | constantify (ast as (Variable x)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   394
          if is_some (lookup const_tab x) then Constant x else ast
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   395
      | constantify (Appl asts) = Appl (map constantify asts);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   396
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   397
    fun read_pat (r_s as (root, s)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   398
      constantify ((read_ast tmp_syn r_s)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   399
        handle ERROR => error ("The error above occurred in " ^ quote s));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   400
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   401
    fun read_rule (xrule as ((_, lhs_src), (_, rhs_src))) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   402
      let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   403
        val rule as (lhs, rhs) = (pairself read_pat) xrule;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   404
      in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   405
        case rule_error rule of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   406
          Some msg =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   407
            error ("Error in syntax translation rule: " ^ msg ^
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   408
              "\nexternal: " ^ quote lhs_src ^ "  ->  " ^ quote rhs_src ^
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   409
              "\ninternal: " ^ str_of_ast lhs ^ "  ->  " ^ str_of_ast rhs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   410
        | None => rule
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   411
      end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   412
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   413
    val xrules = xrules_of sext;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   414
    val new_rules =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   415
      SynRules {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   416
        parse_rules = map read_rule (mapfilter right_rule xrules),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   417
        print_rules = map read_rule (mapfilter left_rule xrules)};
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   418
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   419
    Syntax (ref (ExtGG (ggr, (ext, new_rules))), add_synrules tmp_tabs new_rules)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   420
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   421
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   422
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   423
(* merge *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   424
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   425
fun merge (Syntax (ggr1, _), Syntax (ggr2, _)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   426
  make_syntax (ref (MergeGG (ggr1, ggr2)));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   427
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   428
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   429
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   430