src/Pure/Syntax/parser.ML
changeset 80944 bbad381bc89a
parent 80943 258b76a8b099
child 80945 584828fa7a97
--- a/src/Pure/Syntax/parser.ML	Tue Sep 24 19:58:24 2024 +0200
+++ b/src/Pure/Syntax/parser.ML	Tue Sep 24 20:10:11 2024 +0200
@@ -560,18 +560,14 @@
       | SOME min => (fn p => p <= max andalso p > min));
   in filter (fn (_, Nonterminal (B, p) :: _, _) => A = B andalso prec p | _ => false) Si end;
 
-fun get_states stateset j A max_prec : state list =
-  filter
-    (fn (_, Nonterminal (B, prec) :: _, _) => A = B andalso prec <= max_prec | _ => false)
-    (Array.nth stateset j);
+fun get_states A max_prec =
+  filter (fn (_, Nonterminal (B, prec) :: _, _) => A = B andalso prec <= max_prec | _ => false);
 
 
 fun movedot_nonterm tt (info, Nonterminal _ :: sa, ts) : state = (info, sa, tt @ ts);
 
-fun movedot_lambda [] (_: state) : state list = []
-  | movedot_lambda ((t, k) :: rest) (state as (info, Nonterminal (_, p) :: sa, ts)) =
-      if p <= k then (info, sa, t @ ts) :: movedot_lambda rest state
-      else movedot_lambda rest state;
+fun movedot_lambda p ((info, sa, ts): state) =
+  map_filter (fn (t, k) => if p <= k then SOME (info, sa, t @ ts) else NONE);
 
 
 (*trigger value for warnings*)
@@ -595,20 +591,20 @@
     fun process _ [] (Si, Sii) = (Si, Sii)
       | process used (S :: States) (Si, Sii) =
           (case S of
-            (_, Nonterminal (nt, min_prec) :: _, _) =>
+            (info, Nonterminal (nt, min_prec) :: sa, ts) =>
               let (*predictor operation*)
                 val (used', new_states) =
                   (case Inttab.lookup used nt of
                     SOME (used_prec, l) => (*nonterminal has been processed*)
                       if used_prec <= min_prec then
                         (*wanted precedence has been processed*)
-                        (used, movedot_lambda l S)
+                        (used, movedot_lambda min_prec (info, sa, ts) l)
                       else (*wanted precedence hasn't been parsed yet*)
                         let
                           val tk_prods = prods_for gram c nt;
-                          val States' =
-                            mk_states i nt (get_RHS' min_prec used_prec tk_prods);
-                        in (update_prec (nt, min_prec) used, movedot_lambda l S @ States') end
+                          val States2 = mk_states i nt (get_RHS' min_prec used_prec tk_prods);
+                          val States1 = movedot_lambda min_prec (info, sa, ts) l;
+                        in (update_prec (nt, min_prec) used, States1 @ States2) end
                   | NONE => (*nonterminal is parsed for the first time*)
                       let
                         val tk_prods = prods_for gram c nt;
@@ -632,7 +628,7 @@
                   if j = i then (*lambda production?*)
                     let val (prec', used') = update_trees (A, (tt, prec)) used
                     in (used', get_states_lambda A prec prec' Si) end
-                  else (used, get_states stateset j A prec);
+                  else (used, get_states A prec (Array.nth stateset j));
                 val States' = map (movedot_nonterm tt) Slist;
               in process used' (States' @ States) (S :: Si, Sii) end)
   in process Inttab.empty states ([], []) end;