src/Pure/Syntax/parser.ML
author wenzelm
Fri, 08 Oct 1993 14:29:55 +0100
changeset 46 f0f4978af183
parent 18 c9ec452ff08f
child 237 a7d3e712767a
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Syntax/parser.ML
46
f0f4978af183 *** empty log message ***
wenzelm
parents: 18
diff changeset
     2
    ID:         $Id$
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
     3
    Author:     Sonia Mahjoub and Markus Wenzel, TU Muenchen
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
     4
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
     5
Isabelle's main parser (used for terms and typs).
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
     6
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
     7
TODO:
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
     8
  ~1 --> chain_pri
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
     9
  rename T, NT
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    10
  improve syntax error
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    11
  fix ambiguous grammar problem
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    12
*)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    13
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    14
signature PARSER =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    15
sig
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    16
  structure XGram: XGRAM
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    17
  structure ParseTree: PARSE_TREE
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    18
  local open XGram ParseTree ParseTree.Lexicon in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    19
    type gram
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    20
    val empty_gram: gram
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    21
    val extend_gram: gram -> string list -> string prod list -> gram
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    22
    val mk_gram: string list -> string prod list -> gram
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    23
    val parse: gram -> string -> token list -> parsetree
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    24
  end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    25
end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    26
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    27
functor ParserFun(structure Symtab: SYMTAB and XGram: XGRAM
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    28
  and ParseTree: PARSE_TREE)(*: PARSER *) =  (* FIXME *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    29
struct
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    30
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    31
structure XGram = XGram;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    32
structure ParseTree = ParseTree;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    33
structure Lexicon = ParseTree.Lexicon;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    34
open XGram ParseTree Lexicon;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    35
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    36
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    37
(** datatype gram **)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    38
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    39
datatype symb = T of token | NT of string * int;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    40
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    41
datatype gram =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    42
  Gram of string list * (symb list * string * int) list Symtab.table;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    43
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    44
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    45
(* empty_gram *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    46
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    47
val empty_gram = Gram ([], Symtab.null);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    48
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    49
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    50
(* extend_gram *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    51
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    52
(*prods are stored in reverse order*)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    53
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    54
fun extend_gram (Gram (roots, tab)) new_roots xprods =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    55
  let
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    56
    fun symb_of (Terminal s) = Some (T (Token s))
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    57
      | symb_of (Nonterminal (s, p)) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    58
          (case predef_term s of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    59
            EndToken => Some (NT (s, p))
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    60
          | tk => Some (T tk))
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    61
      | symb_of _ = None;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    62
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    63
    fun prod_of (Prod (s, xsyms, c, p)) = (s, mapfilter symb_of xsyms, c, p);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    64
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    65
    fun add_prod (tab, (s, syms, c, p)) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    66
      (case Symtab.lookup (tab, s) of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    67
        None => Symtab.update ((s, [(syms, c, p)]), tab)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    68
      | Some prods => Symtab.update ((s, (syms, c, p) :: prods), tab));
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    69
  in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    70
    Gram (new_roots union roots,
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    71
      Symtab.balance (foldl add_prod (tab, map prod_of xprods)))
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    72
  end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    73
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    74
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    75
(* mk_gram *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    76
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    77
val mk_gram = extend_gram empty_gram;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    78
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    79
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    80
(* get_prods *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    81
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    82
fun get_prods tab s pred =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    83
  let
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    84
    fun rfilter [] ys = ys
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    85
      | rfilter (x :: xs) ys = rfilter xs (if pred x then x :: ys else ys);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    86
  in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    87
    (case Symtab.lookup (tab, s) of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    88
      Some prods => rfilter prods []
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    89
    | None => [])
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    90
  end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    91
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    92
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    93
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    94
(** parse **)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    95
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    96
type state =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    97
  string * int
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    98
    * parsetree list    (*before point*)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
    99
    * symb list         (*after point*)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   100
    * string * int;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   101
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   102
type earleystate = state list Array.array;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   103
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   104
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   105
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   106
fun getProductions tab A i =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   107
  get_prods tab A (fn (_, _, j) => j >= i orelse j = ~1);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   108
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   109
fun getProductions' tab A i k =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   110
  get_prods tab A (fn (_, _, j) => (j >= i andalso j < k) orelse j = ~1);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   111
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   112
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   113
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   114
fun mkState i jj A ([NT(B,~1)],id,~1) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   115
                     (A,max_pri,[],[NT (B,jj)],id,i)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   116
  | mkState i jj A (ss,id,j) = (A,j,[],ss,id,i) ;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   117
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   118
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   119
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   120
fun conc (t,(k:int)) [] = (None, [(t,k)])
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   121
  | conc (t,k) ((t',k')::ts) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   122
      if (t = t')
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   123
      then (Some k', ( if k' >= k
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   124
                       then (t',k')::ts
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   125
                       else (t,k)::ts )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   126
           )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   127
      else let val (n, ts') = conc (t,k) ts
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   128
           in (n, (t',k')::ts')
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   129
           end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   130
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   131
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   132
fun update_tree ((B,(i,ts))::used) (A,t) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   133
      if   (A = B)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   134
      then
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   135
          let val (n,ts') = conc t ts
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   136
          in  ((A,(i,ts'))::used, n)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   137
          end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   138
      else
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   139
          let val (used', n) = update_tree used (A,t)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   140
          in  ((B,(i,ts)) :: used', n)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   141
          end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   142
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   143
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   144
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   145
fun update_index ((B,(i,ts))::used) (A,j) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   146
      if   (A = B)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   147
      then (A,(j,ts)) :: used
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   148
      else (B,(i,ts)) :: (update_index used (A,j));
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   149
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   150
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   151
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   152
fun getS A i Si =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   153
       filter (fn (_,_,_,(NT(B,j))::_,_,_)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   154
                                    => (A=B andalso j<=i)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   155
               |      _             => false
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   156
              ) Si;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   157
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   158
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   159
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   160
fun getS' A k n Si =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   161
       filter (fn (_,_,_,(NT(B,j))::_,_,_) => (A=B andalso
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   162
                                               j<=k andalso
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   163
                                               j>n )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   164
               |      _                    => false
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   165
              ) Si;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   166
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   167
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   168
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   169
fun getStates Estate i ii A k =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   170
       filter (fn (_,_,_,(NT(B,j))::_,_,_)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   171
                                    => (A=B andalso j<=k)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   172
               |      _             => false
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   173
              )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   174
              (Array.sub (Estate, ii))
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   175
;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   176
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   177
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   178
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   179
(* MMW *)(* FIXME *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   180
fun movedot_term (A,j,ts,T a::sa,id,i) c =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   181
                   if (valued_token c)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   182
                   then (A,j,(ts@[Tip c]),sa,id,i)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   183
                   else (A,j,ts,sa,id,i) ;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   184
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   185
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   186
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   187
fun movedot_nonterm ts  (A,j,tss,NT(B,k) ::sa,id,i) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   188
                         (A,j,tss@ts,sa,id,i) ;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   189
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   190
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   191
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   192
fun movedot_lambda  _  [] = []
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   193
  | movedot_lambda (B,j,tss,(NT(A,k))::sa,id,i) ((t,ki)::ts) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   194
    if k <= ki
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   195
    then (B,j,tss@t,sa,id,i) ::
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   196
         (movedot_lambda (B,j,tss,(NT(A,k))::sa,id,i) ts)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   197
    else movedot_lambda (B,j,tss,(NT(A,k))::sa,id,i) ts
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   198
  ;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   199
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   200
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   201
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   202
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   203
fun PROCESSS Estate grammar i c states =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   204
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   205
let
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   206
fun processS used [] (Si,Sii) = (Si,Sii)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   207
 |  processS used (S::States) (Si,Sii) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   208
     ( case S of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   209
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   210
        (_,_,_,(NT (A,j))::_,_,_)  =>
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   211
          let
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   212
            val (used_neu, States_neu) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   213
              ( case assoc (used, A) of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   214
                 Some (k,l) =>         (* A gehoert zu used *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   215
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   216
                   if (k <= j)          (* Prioritaet wurde
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   217
                                           behandelt  *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   218
                   then
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   219
                        (used, movedot_lambda S l)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   220
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   221
                   else         (* Prioritaet wurde noch nicht
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   222
                                        behandelt  *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   223
                        let val L =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   224
                                getProductions' grammar A j k
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   225
                            val States' = map (mkState i j A) L
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   226
                        in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   227
                            (update_index used (A,j),
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   228
                             States'@ movedot_lambda S l
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   229
                            )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   230
                        end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   231
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   232
                | None =>       (* A gehoert nicht zu used *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   233
                      let val L = getProductions grammar A j
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   234
                          val States' = map (mkState i j A) L
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   235
                      in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   236
                          ((A,(j,[]))::used, States')
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   237
                      end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   238
              )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   239
          in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   240
             processS used_neu (States @ States_neu) (S::Si,Sii)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   241
          end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   242
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   243
     |  (_,_,_,(T a)::_,_,_)  =>
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   244
                processS used States
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   245
                    (S::Si, if (matching_tokens (a, c))
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   246
                            then  (movedot_term S c)::Sii   (* MMW *)(* FIXME *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   247
                            else Sii
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   248
                    )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   249
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   250
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   251
     |  (A,k,ts,[],id,j) =>
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   252
          let val tt = if id = ""
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   253
                       then ts
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   254
                       else [Node(id,ts)]
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   255
          in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   256
             if (j = i)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   257
             then
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   258
                let val (used',O) = update_tree used (A,(tt,k))
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   259
                in ( case O of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   260
                      None =>
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   261
                         let val Slist = getS A k Si
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   262
                             val States' =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   263
                              map (movedot_nonterm tt ) Slist
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   264
                         in  processS used'
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   265
                             (States @ States') (S::Si,Sii)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   266
                         end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   267
                   |  Some n =>
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   268
                         if (n >= k)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   269
                         then
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   270
                            processS used' States (S::Si,Sii)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   271
                         else
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   272
                            let val Slist = getS' A k n Si
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   273
                                val States' =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   274
                              map (movedot_nonterm tt ) Slist
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   275
                            in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   276
                              processS used'
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   277
                              (States @ States') (S::Si,Sii)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   278
                            end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   279
                   )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   280
                end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   281
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   282
              else
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   283
                processS used (States @
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   284
                               map (movedot_nonterm tt)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   285
                               (getStates Estate i j A k))
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   286
                (S::Si,Sii)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   287
           end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   288
     )
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   289
in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   290
   processS [] states ([],[])
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   291
end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   292
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   293
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   294
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   295
fun syntax_error toks =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   296
  error ("Syntax error at: " ^ space_implode " " (map str_of_token toks));
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   297
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   298
fun Produce grammar stateset i indata =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   299
      case (Array.sub (stateset,i)) of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   300
         [] => syntax_error indata (* MMW *)(* FIXME *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   301
      |  s  =>
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   302
           (case indata of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   303
                []  => Array.sub (stateset,i)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   304
             |  (c::cs) =>
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   305
                       let val (si,sii) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   306
                           PROCESSS stateset grammar i c s
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   307
                       in
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   308
                           Array.update (stateset,i,si);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   309
                           Array.update (stateset,i+1,sii);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   310
                           Produce grammar stateset (i+1) cs
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   311
                       end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   312
           );
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   313
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   314
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   315
fun get_trees [] = []
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   316
  | get_trees ((_,_,pt_lst,_,_,_) :: stateset) =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   317
       let val l = get_trees stateset
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   318
       in case pt_lst of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   319
            [ptree] => ptree :: l
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   320
          |   _     => l
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   321
       end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   322
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   323
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   324
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   325
fun earley grammar startsymbol indata =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   326
   let  val S0 =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   327
       [("S'",0,[],[NT (startsymbol,0), T EndToken],"",0)]
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   328
        val s = length indata + 1     (* MMW *)(* FIXME was .. + 2 *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   329
        val Estate = Array.array (s, [])
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   330
   in   Array.update (Estate,0,S0);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   331
        let val l = Produce grammar Estate 0 indata    (* MMW *)(* FIXME was .. @ [EndToken] *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   332
            val p_trees = get_trees l
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   333
        in p_trees
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   334
        end
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   335
   end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   336
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   337
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   338
(* FIXME demo *)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   339
fun parse (Gram (roots, prod_tab)) root toks =
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   340
  if root mem roots then
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   341
    (case earley prod_tab root toks of
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   342
      [] => error "parse: no parse trees"
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   343
    | pt :: _ => pt)
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   344
  else error ("Unparsable category: " ^ root);
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   345
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   346
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   347
end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents:
diff changeset
   348