705 (fn (_, _, _, Nonterminal (B, prec) :: _, _, _) => A = B andalso prec <= max_prec |
705 (fn (_, _, _, Nonterminal (B, prec) :: _, _, _) => A = B andalso prec <= max_prec |
706 | _ => false) |
706 | _ => false) |
707 (Array.sub (Estate, ii)); |
707 (Array.sub (Estate, ii)); |
708 |
708 |
709 |
709 |
710 fun movedot_term (A, j, ts, Terminal a :: sa, id, i) c = |
710 fun movedot_term c (A, j, ts, Terminal a :: sa, id, i) = |
711 if Lexicon.valued_token c then (A, j, ts @ [Tip c], sa, id, i) |
711 if Lexicon.valued_token c then (A, j, ts @ [Tip c], sa, id, i) |
712 else (A, j, ts, sa, id, i); |
712 else (A, j, ts, sa, id, i); |
713 |
713 |
714 fun movedot_nonterm ts (A, j, tss, Nonterminal _ :: sa, id, i) = |
714 fun movedot_nonterm tt (A, j, ts, Nonterminal _ :: sa, id, i) = |
715 (A, j, tss @ ts, sa, id, i); |
715 (A, j, ts @ tt, sa, id, i); |
716 |
716 |
717 fun movedot_lambda _ [] = [] |
717 fun movedot_lambda [] _ = [] |
718 | movedot_lambda (B, j, tss, Nonterminal (A, k) :: sa, id, i) ((t, ki) :: ts) = |
718 | movedot_lambda ((t, ki) :: ts) (B, j, tss, Nonterminal (A, k) :: sa, id, i) = |
719 if k <= ki then |
719 if k <= ki then |
720 (B, j, tss @ t, sa, id, i) :: |
720 (B, j, tss @ t, sa, id, i) :: |
721 movedot_lambda (B, j, tss, Nonterminal (A, k) :: sa, id, i) ts |
721 movedot_lambda ts (B, j, tss, Nonterminal (A, k) :: sa, id, i) |
722 else movedot_lambda (B, j, tss, Nonterminal (A, k) :: sa, id, i) ts; |
722 else movedot_lambda ts (B, j, tss, Nonterminal (A, k) :: sa, id, i); |
723 |
723 |
724 |
724 |
725 (*trigger value for warnings*) |
725 (*trigger value for warnings*) |
726 val branching_level = Config.int (Config.declare "syntax_branching_level" (fn _ => Config.Int 600)); |
726 val branching_level = Config.int (Config.declare "syntax_branching_level" (fn _ => Config.Int 600)); |
727 |
727 |
758 val (used', new_states) = |
758 val (used', new_states) = |
759 (case AList.lookup (op =) used nt of |
759 (case AList.lookup (op =) used nt of |
760 SOME (used_prec, l) => (*nonterminal has been processed*) |
760 SOME (used_prec, l) => (*nonterminal has been processed*) |
761 if used_prec <= min_prec then |
761 if used_prec <= min_prec then |
762 (*wanted precedence has been processed*) |
762 (*wanted precedence has been processed*) |
763 (used, movedot_lambda S l) |
763 (used, movedot_lambda l S) |
764 else (*wanted precedence hasn't been parsed yet*) |
764 else (*wanted precedence hasn't been parsed yet*) |
765 let |
765 let |
766 val tk_prods = all_prods_for nt; |
766 val tk_prods = all_prods_for nt; |
767 val States' = |
767 val States' = |
768 mk_states i min_prec nt (get_RHS' min_prec used_prec tk_prods); |
768 mk_states i min_prec nt (get_RHS' min_prec used_prec tk_prods); |
769 in (update_prec (nt, min_prec) used, movedot_lambda S l @ States') end |
769 in (update_prec (nt, min_prec) used, movedot_lambda l S @ States') end |
770 | NONE => (*nonterminal is parsed for the first time*) |
770 | NONE => (*nonterminal is parsed for the first time*) |
771 let |
771 let |
772 val tk_prods = all_prods_for nt; |
772 val tk_prods = all_prods_for nt; |
773 val States' = mk_states i min_prec nt (get_RHS min_prec tk_prods); |
773 val States' = mk_states i min_prec nt (get_RHS min_prec tk_prods); |
774 in ((nt, (min_prec, [])) :: used, States') end); |
774 in ((nt, (min_prec, [])) :: used, States') end); |
784 processS used' (new_states @ States) (S :: Si, Sii) |
784 processS used' (new_states @ States) (S :: Si, Sii) |
785 end |
785 end |
786 | (_, _, _, Terminal a :: _, _, _) => (*scanner operation*) |
786 | (_, _, _, Terminal a :: _, _, _) => (*scanner operation*) |
787 processS used States |
787 processS used States |
788 (S :: Si, |
788 (S :: Si, |
789 if Lexicon.matching_tokens (a, c) then movedot_term S c :: Sii else Sii) |
789 if Lexicon.matching_tokens (a, c) then movedot_term c S :: Sii else Sii) |
790 | (A, prec, ts, [], id, j) => (*completer operation*) |
790 | (A, prec, ts, [], id, j) => (*completer operation*) |
791 let val tt = if id = "" then ts else [Node (id, ts)] in |
791 let val tt = if id = "" then ts else [Node (id, ts)] in |
792 if j = i then (*lambda production?*) |
792 if j = i then (*lambda production?*) |
793 let |
793 let |
794 val (used', O) = update_trees used (A, (tt, prec)); |
794 val (used', O) = update_trees used (A, (tt, prec)); |