258 |
258 |
259 val empty_gram = mk_gram []; |
259 val empty_gram = mk_gram []; |
260 |
260 |
261 fun extend_gram (gram1 as Gram (prods1, _)) roots xprods2 = |
261 fun extend_gram (gram1 as Gram (prods1, _)) roots xprods2 = |
262 let |
262 let |
263 fun simplify preserve s = |
263 fun symb_of (Delim s) = Some (Terminal (Token s)) |
264 if preserve then |
264 | symb_of (Argument (s, p)) = |
265 (if s mem (roots \\ ["type", "prop", "any"]) then "logic" else s) |
|
266 else (if s = "prop" then "@prop_H" else |
|
267 (if s mem (roots \\ ["type", "prop", "any"]) then |
|
268 "@logic_H" |
|
269 else s)); |
|
270 |
|
271 fun not_delim (Delim _) = false |
|
272 | not_delim _ = true |
|
273 |
|
274 fun symb_of _ (Delim s) = Some (Terminal (Token s)) |
|
275 | symb_of preserve (Argument (s, p)) = |
|
276 (case predef_term s of |
265 (case predef_term s of |
277 None => Some (Nonterminal (simplify preserve s, p)) |
266 None => Some (Nonterminal (s, p)) |
278 | Some tk => Some (Terminal tk)) |
267 | Some tk => Some (Terminal tk)) |
279 | symb_of _ _ = None; |
268 | symb_of _ = None; |
280 |
269 |
281 fun prod_of (XProd (lhs, xsymbs, const, pri)) = |
270 fun prod_of (XProd (lhs, xsymbs, const, pri)) = |
282 let val copy_prod = (lhs = "prop" andalso forall not_delim xsymbs andalso |
271 (lhs, (mapfilter symb_of xsymbs, const, pri)); |
283 const <> ""); |
|
284 |
|
285 val preserve = copy_prod |
|
286 orelse pri = chain_pri andalso lhs = "logic" |
|
287 orelse lhs mem ["@prop_H", "@logic_H", "any"]; |
|
288 |
|
289 val lhs' = if copy_prod then "@prop_H" else |
|
290 if lhs = "logic" andalso pri = chain_pri |
|
291 then "@logic_H" |
|
292 else if lhs mem ("logic1" :: (roots \\ ["type", "prop"])) |
|
293 then "logic" |
|
294 else lhs; |
|
295 in (lhs', (mapfilter (symb_of preserve) xsymbs, const, pri)) |
|
296 end; |
|
297 |
272 |
298 val prods2 = distinct (map prod_of xprods2); |
273 val prods2 = distinct (map prod_of xprods2); |
299 in |
274 in |
300 if prods2 subset prods1 then gram1 |
275 if prods2 subset prods1 then gram1 |
301 else (writeln "Building new grammar..."; |
276 else (writeln "Building new grammar..."; |
581 val get_trees = mapfilter (fn (_, _, [pt], _, _, _) => Some pt | _ => None); |
556 val get_trees = mapfilter (fn (_, _, [pt], _, _, _) => Some pt | _ => None); |
582 |
557 |
583 |
558 |
584 fun earley grammar startsymbol indata = |
559 fun earley grammar startsymbol indata = |
585 let |
560 let |
586 val startsymbol' = case startsymbol of |
|
587 "logic" => "@logic_H" |
|
588 | "prop" => "@prop_H" |
|
589 | other => other; |
|
590 val rhss_ref = case assoc (grammar, startsymbol) of |
561 val rhss_ref = case assoc (grammar, startsymbol) of |
591 Some r => r |
562 Some r => r |
592 | None => error ("parse: Unknown startsymbol " ^ |
563 | None => error ("parse: Unknown startsymbol " ^ |
593 quote startsymbol); |
564 quote startsymbol); |
594 val S0 = [(ref [], 0, [], [Nonterm (rhss_ref, 0), Term EndToken], "", 0)]; |
565 val S0 = [(ref [], 0, [], [Nonterm (rhss_ref, 0), Term EndToken], "", 0)]; |