diff -r 258b76a8b099 -r bbad381bc89a src/Pure/Syntax/parser.ML --- 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;