src/Pure/Syntax/parser.ML
changeset 42219 19c23372c686
parent 42218 8e0a4d500e5b
child 42220 db18095532d8
equal deleted inserted replaced
42218:8e0a4d500e5b 42219:19c23372c686
   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));