src/Pure/Syntax/extension.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/extension
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
Syntax definition (internal interface)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
signature EXTENSION0 =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
  val typeT: typ
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
  val constrainC: string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
signature EXTENSION =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
  include EXTENSION0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
  structure XGram: XGRAM
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
  local open XGram XGram.Ast in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
    datatype mfix = Mfix of string * typ * string * int list * int
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
    datatype ext =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
      Ext of {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
        roots: string list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
        mfix: mfix list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
        extra_consts: string list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
        parse_ast_translation: (string * (ast list -> ast)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
        parse_preproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
        parse_postproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
        parse_translation: (string * (term list -> term)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
        print_translation: (string * (term list -> term)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
        print_preproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
        print_postproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
        print_ast_translation: (string * (ast list -> ast)) list}
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
    datatype synrules =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
      SynRules of {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
        parse_rules: (ast * ast) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
        print_rules: (ast * ast) list}
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
    val max_pri: int
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
    val logic: string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
    val id: string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
    val idT: typ
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
    val var: string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
    val varT: typ
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
    val tfree: string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
    val tfreeT: typ
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
    val tvar: string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
    val tvarT: typ
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
    val typ_to_nt: typ -> string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
    val applC: string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
    val args: string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
    val empty_synrules: synrules
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
    val empty: string xgram
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
    val extend: string xgram -> (ext * synrules) -> string xgram
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
  end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
functor ExtensionFun(XGram: XGRAM): EXTENSION =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
structure XGram = XGram;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
open XGram XGram.Ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
(** datatype ext **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
(* Mfix (sy, ty, c, pl, p):
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
    sy: production as symbolic string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
    ty: type description of production
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
    c: corresponding Isabelle Const
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
    pl: priorities of nonterminals in sy
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
    p: priority of production
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
datatype mfix = Mfix of string * typ * string * int list * int;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
datatype ext =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
  Ext of {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
    roots: string list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
    mfix: mfix list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
    extra_consts: string list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
    parse_ast_translation: (string * (ast list -> ast)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
    parse_preproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
    parse_postproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
    parse_translation: (string * (term list -> term)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
    print_translation: (string * (term list -> term)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
    print_preproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
    print_postproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
    print_ast_translation: (string * (ast list -> ast)) list};
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
datatype synrules =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
  SynRules of {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
    parse_rules: (ast * ast) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
    print_rules: (ast * ast) list};
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
(* empty_synrules *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
val empty_synrules = SynRules {parse_rules = [], print_rules = []};
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
(* empty xgram *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
val empty =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
  XGram {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
    roots = [], prods = [], consts = [],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
    parse_ast_translation = [],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
    parse_preproc = None,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
    parse_rules = [],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
    parse_postproc = None,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
    parse_translation = [],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
    print_translation = [],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
    print_preproc = None,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
    print_rules = [],
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
    print_postproc = None,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
    print_ast_translation = []};
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
(** syntactic constants etc. **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
val max_pri = 1000;   (*maximum legal priority*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
val logic = "logic";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
val logicT = Type (logic, []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
val logic1 = "logic1";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
val logic1T = Type (logic1, []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
val funT = Type ("fun", []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
(* terminals *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
val id = "id";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
val idT = Type (id, []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
val var = "var";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
val varT = Type (var, []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
val tfree = "tfree";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
val tfreeT = Type (tfree, []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
val tvar = "tvar";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
val tvarT = Type (tvar, []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
val terminalTs = [idT, varT, tfreeT, tvarT];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
val args = "args";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
val argsT = Type (args, []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
val typeT = Type ("type", []);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
val applC = "_appl";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
val constrainC = "_constrain";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
fun typ_to_nt (Type (c, _)) = c
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
  | typ_to_nt _ = logic;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
(** extend xgram **)    (* FIXME clean *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
fun nonts syn = foldl (fn (i, "_") => i + 1 | (i, _) => i) (0, explode syn);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
val meta_chs = ["(", ")", "/", "_"];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
fun mk_term(pref, []) = (pref, [])
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
  | mk_term(pref, "'"::c::cl) = mk_term(pref^c, cl)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
  | mk_term(pref, l as c::cl) = if is_blank(c) orelse c mem meta_chs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
        then (pref, l) else mk_term(pref^c, cl);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
fun mk_space(sp, []) = (sp, []) |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
    mk_space(sp, cl as c::cl') =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
      if is_blank(c) then mk_space(sp^c, cl') else (sp, cl);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
exception ARG_EXN;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
exception BLOCK_EXN;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
fun mk_syntax([], ar, _, b, sy) = if b=0 then (sy, ar) else raise BLOCK_EXN
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
  | mk_syntax("_"::cs, Type("fun", [ar, ar']), [], b, sy) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
        mk_syntax(cs, ar', [], b, sy@[Nonterminal(typ_to_nt ar, 0)])
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
  | mk_syntax("_"::cs, Type("fun", [ar, ar']), p::pl, b, sy) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
        mk_syntax(cs, ar', pl, b, sy@[Nonterminal(typ_to_nt ar, p)])
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
  | mk_syntax("_"::cs, _, _, _, _) = raise ARG_EXN
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
  | mk_syntax("("::cs, ar, pl, b, sy) = let val (i, cs') = scan_int cs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
        in mk_syntax(cs', ar, pl, b+1, sy@[Bg(i)]) end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
  | mk_syntax(")"::cs, ar, pl, b, sy) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
        if b>0 then mk_syntax(cs, ar, pl, b-1, sy@[En]) else raise BLOCK_EXN
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
  | mk_syntax("/"::cs, ar, pl, b, sy) = let val (sp, cs') = take_prefix is_blank cs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
        in mk_syntax(cs', ar, pl, b, sy@[Brk(length sp)]) end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
  | mk_syntax(c::cs, ar, pl, b, sy) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
        let val (term, rest) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
           if is_blank(c)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
           then let val (sp, cs') = mk_space(c, cs) in (Space(sp), cs') end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
           else let val (tk, cs') = mk_term("", c::cs) in(Terminal(tk), cs') end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
        in mk_syntax(rest, ar, pl, b, sy@[term]) end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   199
fun pri_test1 p = if 0 <= p andalso p <= max_pri then ()
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   200
        else error("Priority out of range: " ^ string_of_int p)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   201
fun pri_test(pl, p) = (pri_test1 p; seq pri_test1 pl);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   202
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   203
fun mk_prod2(sy, T, opn, pl, p) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
let val (syn, T') = mk_syntax(explode sy, T, pl, 0, []) handle
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
        ARG_EXN =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
        error("More arguments in "^sy^" than in corresponding type") |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   207
        BLOCK_EXN => error("Unbalanced block parantheses in "^sy);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   208
    val nt = case T' of Type(c, _) => c | _ => logic1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
in Prod(nt, syn, opn, p) end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   210
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   211
fun mk_prod1(sy, T, opn, pl, p) = (pri_test(pl, p); mk_prod2(sy, T, opn, pl, p));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
fun terminal1(T as Type("fun", _)) = hd(binder_types T) mem terminalTs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   215
  | terminal1 _ = false;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   216
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   217
fun mk_prod(Mfix(sy, T, "", pl, p)) = if nonts sy <> 1
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
        then error"Copy op must have exactly one argument" else
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
        if filter_out is_blank (explode sy) = ["_"] andalso
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
           not(terminal1 T)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
        then mk_prod2(sy, T, "", [copy_pri], copy_pri)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
        else mk_prod1(sy, T, "", pl, p)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
  | mk_prod(Mfix(sy, T, const, pl, p)) = mk_prod1(sy, T, const, pl, p)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
fun extend (XGram xgram) (Ext ext, SynRules rules) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
  let
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   229
    infix oo;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
    fun None oo None = None
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
      | (Some f) oo None = Some f
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
      | None oo (Some g) = Some g
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   234
      | (Some f) oo (Some g) = Some (f o g);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
    fun descend (from, to) = Mfix ("_", to --> from, "", [0], 0);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
    fun parents T = Mfix ("(1'(_'))", T --> T, "", [0], max_pri);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   240
    fun mkappl T =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
      Mfix ("_(1'(_'))", [funT, argsT] ---> T, applC, [max_pri, 0], max_pri);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   242
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   243
    fun mkid T = Mfix ("_", idT --> T, "", [], max_pri);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   244
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   245
    fun mkvar T = Mfix ("_", varT --> T, "", [], max_pri);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
    fun constrain T =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   248
      Mfix ("_::_", [T, typeT]--->T, constrainC, [max_pri, 0], max_pri - 1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   249
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   250
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   251
    val {roots = roots1, prods, consts,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   252
      parse_ast_translation = parse_ast_translation1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   253
      parse_preproc = parse_preproc1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   254
      parse_rules = parse_rules1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   255
      parse_postproc = parse_postproc1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   256
      parse_translation = parse_translation1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   257
      print_translation = print_translation1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   258
      print_preproc = print_preproc1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   259
      print_rules = print_rules1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   260
      print_postproc = print_postproc1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   261
      print_ast_translation = print_ast_translation1} = xgram;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   262
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   263
    val {roots = roots2, mfix, extra_consts,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   264
      parse_ast_translation = parse_ast_translation2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   265
      parse_preproc = parse_preproc2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   266
      parse_postproc = parse_postproc2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   267
      parse_translation = parse_translation2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   268
      print_translation = print_translation2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   269
      print_preproc = print_preproc2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   270
      print_postproc = print_postproc2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   271
      print_ast_translation = print_ast_translation2} = ext;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   272
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   273
    val {parse_rules = parse_rules2, print_rules = print_rules2} = rules;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   274
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   275
    val Troots = map (apr (Type, [])) (roots2 \\ roots1);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   276
    val Troots' = Troots \\ [typeT, propT, logicT];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   277
    val mfix' = mfix @ map parents (Troots \ logicT) @ map mkappl Troots' @
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   278
      map mkid Troots' @ map mkvar Troots' @ map constrain Troots' @
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   279
      map (apl (logicT, descend)) (Troots \\ [typeT, logicT]) @
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   280
      map (apr (descend, logic1T)) Troots';
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   281
  in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   282
    XGram {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   283
      roots = distinct (roots1 @ roots2),
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   284
(*      roots = roots1 union roots2,  *)    (* FIXME remove *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   285
      prods = prods @ map mk_prod mfix',
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   286
      consts = consts union extra_consts,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   287
      parse_ast_translation = parse_ast_translation1 @ parse_ast_translation2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   288
      parse_preproc = parse_preproc1 oo parse_preproc2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   289
      parse_rules = parse_rules1 @ parse_rules2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   290
      parse_postproc = parse_postproc2 oo parse_postproc1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   291
      parse_translation = parse_translation1 @ parse_translation2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   292
      print_translation = print_translation1 @ print_translation2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   293
      print_preproc = print_preproc1 oo print_preproc2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   294
      print_rules = print_rules1 @ print_rules2,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   295
      print_postproc = print_postproc2 oo print_postproc1,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   296
      print_ast_translation = print_ast_translation1 @ print_ast_translation2}
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   297
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   298
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   299
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   300
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   301