src/Pure/Syntax/xgram.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/xgram
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
External Grammar Representation
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
Changes:
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
  XGRAM: added Ast, changed XGram,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
    renamed (XSymb, Prod, XGram) to (xsymb, prod, xgram)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
  removed Symtab
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
TODO:
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
  prod, xsymb, xgram: 'a -> string (?)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
signature XGRAM =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
  structure Ast: AST
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
  datatype 'a xsymb =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
    Terminal of 'a |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
    Nonterminal of string * int |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
    Space of string |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
    Bg of int | Brk of int | En
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
  datatype 'a prod = Prod of string * ('a xsymb list) * string * int
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
  local open Ast in
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
    datatype 'a xgram =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
      XGram of {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
        roots: string list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
        prods: 'a prod list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
        consts: string list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
        parse_ast_translation: (string * (ast list -> ast)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
        parse_preproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
        parse_rules: (ast * ast) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
        parse_postproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
        parse_translation: (string * (term list -> term)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
        print_translation: (string * (term list -> term)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
        print_preproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
        print_rules: (ast * ast) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
        print_postproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
        print_ast_translation: (string * (ast list -> ast)) list}
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
  end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
  val copy_pri: int
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
  val terminals: 'a xsymb list -> 'a list
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
  val nonterminals: 'a xsymb list -> string list
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
  val translate: ('a -> 'b) -> 'a xsymb list -> 'b xsymb list
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
functor XGramFun(Ast: AST)(*: XGRAM*) =  (* FIXME *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
structure Ast = Ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
open Ast;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
(** datatype 'a xgram **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
(* Terminal a: terminal a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
   Nonterminal (s, p): nonterminal named s, require priority >= p
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
   Space s: some white space for printing
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
   Bg, Brk, En: see resp. routines in Pretty *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
datatype 'a xsymb =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
  Terminal of 'a |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
  Nonterminal of string * int |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
  Space of string |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
  Bg of int | Brk of int | En;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
(* Prod (lhs, rhs, opn, p):
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
    lhs: name of nonterminal on the lhs of the production
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
    rhs: list of symbols on the rhs of the production
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
    opn: name of the corresponding Isabelle Const
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
    p: priority of this production, 0 <= p <= max_pri *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
datatype 'a prod = Prod of string * ('a xsymb list) * string * int;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
datatype 'a xgram =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
  XGram of {
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
    roots: string list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
    prods: 'a prod list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
    consts: string list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
    parse_ast_translation: (string * (ast list -> ast)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
    parse_preproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
    parse_rules: (ast * ast) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
    parse_postproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
    parse_translation: (string * (term list -> term)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
    print_translation: (string * (term list -> term)) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
    print_preproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
    print_rules: (ast * ast) list,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
    print_postproc: (ast -> ast) option,
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
    print_ast_translation: (string * (ast list -> ast)) list};
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
(** misc stuff **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
val copy_pri = ~1;  (* must be < all legal priorities, i.e. 0 *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
fun terminals [] = []
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
  | terminals (Terminal s :: sl) = s :: terminals sl
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
  | terminals (_ :: sl) = terminals sl;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
fun nonterminals [] = []
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
  | nonterminals (Nonterminal (s, _) :: sl) = s :: nonterminals sl
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
  | nonterminals (_ :: sl) = nonterminals sl;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
fun translate trfn =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
  map
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
    (fn Terminal t => Terminal (trfn t)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
      | Nonterminal s => Nonterminal s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
      | Space s => Space s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
      | Bg i => Bg i
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
      | Brk i => Brk i
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
      | En => En);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117