src/Pure/Syntax/parser.ML
changeset 764 b60e77395d1a
parent 697 40f72ab196f8
child 844 5e59370243fa
equal deleted inserted replaced
763:d5a626aacdd3 764:b60e77395d1a
   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)];