src/Pure/Syntax/parser.ML
changeset 682 c36f49c76d22
parent 624 33b9b5da3e6f
child 697 40f72ab196f8
equal deleted inserted replaced
681:9b02474744ca 682:c36f49c76d22
    18     datatype parsetree =
    18     datatype parsetree =
    19       Node of string * parsetree list |
    19       Node of string * parsetree list |
    20       Tip of token
    20       Tip of token
    21     val parse: gram -> string -> token list -> parsetree list
    21     val parse: gram -> string -> token list -> parsetree list
    22   end
    22   end
       
    23   val branching_level: int ref;
    23 end;
    24 end;
    24 
    25 
    25 functor ParserFun(structure Symtab: SYMTAB and Lexicon: LEXICON
    26 functor ParserFun(structure Symtab: SYMTAB and Lexicon: LEXICON
    26   and SynExt: SYN_EXT): PARSER =
    27   and SynExt: SYN_EXT): PARSER =
    27 struct
    28 struct
   423         (B, j, tss @ t, sa, id, i) ::
   424         (B, j, tss @ t, sa, id, i) ::
   424           movedot_lambda (B, j, tss, Nonterm (A, k) :: sa, id, i) ts
   425           movedot_lambda (B, j, tss, Nonterm (A, k) :: sa, id, i) ts
   425       else movedot_lambda (B, j, tss, Nonterm (A, k) :: sa, id, i) ts;
   426       else movedot_lambda (B, j, tss, Nonterm (A, k) :: sa, id, i) ts;
   426 
   427 
   427 
   428 
       
   429 val warned = ref false;  (*flag for warning message*)
       
   430 val branching_level = ref 100;  (*trigger value for warnings*)
   428 
   431 
   429 fun PROCESSS Estate i c states =
   432 fun PROCESSS Estate i c states =
   430 let
   433 let
   431 fun get_lookahead rhss_ref = token_assoc (!rhss_ref, c);
   434 fun get_lookahead rhss_ref = token_assoc (!rhss_ref, c);
   432 
   435 
   433 fun processS used [] (Si, Sii) = (Si, Sii)
   436 fun processS used [] (Si, Sii) = (Si, Sii)
   434   | processS used (S :: States) (Si, Sii) =
   437   | processS used (S :: States) (Si, Sii) =
   435       (case S of
   438       (case S of
   436         (_, _, _, Nonterm (rhss_ref, minPrec) :: _, _, _) =>
   439         (_, _, _, Nonterm (rhss_ref, minPrec) :: _, _, _) =>
   437           let                                       (*predictor operation*)
   440           let                                       (*predictor operation*)
   438             val (used_new, States_new) =
   441             val (used_new, new_states) =
   439               (case assoc (used, rhss_ref) of
   442               (case assoc (used, rhss_ref) of
   440                 Some (usedPrec, l) =>       (*nonterminal has been processed*)
   443                 Some (usedPrec, l) =>       (*nonterminal has been processed*)
   441                   if usedPrec <= minPrec then
   444                   if usedPrec <= minPrec then
   442                                       (*wanted precedence has been processed*)
   445                                       (*wanted precedence has been processed*)
   443                     (used, movedot_lambda S l)
   446                     (used, movedot_lambda S l)
   453                   let val rhss = get_lookahead rhss_ref;
   456                   let val rhss = get_lookahead rhss_ref;
   454                       val States' = mkStates i minPrec rhss_ref
   457                       val States' = mkStates i minPrec rhss_ref
   455                                       (getRHS minPrec rhss);
   458                                       (getRHS minPrec rhss);
   456                   in ((rhss_ref, (minPrec, [])) :: used, States') end)
   459                   in ((rhss_ref, (minPrec, [])) :: used, States') end)
   457           in
   460           in
   458             processS used_new (States_new @ States) (S :: Si, Sii)
   461             processS used_new (new_states @ States) (S :: Si, Sii)
   459           end
   462           end
   460       | (_, _, _, Term a :: _, _, _) =>               (*scanner operation*)
   463       | (_, _, _, Term a :: _, _, _) =>               (*scanner operation*)
   461           processS used States
   464           processS used States
   462             (S :: Si,
   465             (S :: Si,
   463               if matching_tokens (a, c) then movedot_term S c :: Sii else Sii)
   466               if matching_tokens (a, c) then movedot_term S c :: Sii else Sii)
   464 
       
   465       | (A, prec, ts, [], id, j) =>                   (*completer operation*)
   467       | (A, prec, ts, [], id, j) =>                   (*completer operation*)
   466           let
   468           let
       
   469             fun check_branching len =
       
   470               if not (!warned) andalso len > (!branching_level) then
       
   471                 (writeln "Warning: Currently parsed expression could be \
       
   472                          \extremely ambiguous.";
       
   473                  warned := true)
       
   474               else ();
       
   475 
   467             val tt = if id = "" then ts else [Node (id, ts)]
   476             val tt = if id = "" then ts else [Node (id, ts)]
   468           in
   477           in
   469             if j = i then                             (*lambda production?*)
   478             if j = i then                             (*lambda production?*)
   470               let
   479               let
   471                 val (used', O) = update_tree used (A, (tt, prec));
   480                 val (used', O) = update_tree used (A, (tt, prec));
   472               in
   481               in
   473                 (case O of
   482                 (case O of
   474                   None =>
   483                   None =>
   475                     let
   484                     let
   476                       val Slist = getS A prec Si;
   485                       val Slist = getS A prec Si;
       
   486                       val _ = check_branching (length Slist);
   477                       val States' = map (movedot_nonterm tt) Slist;
   487                       val States' = map (movedot_nonterm tt) Slist;
   478                     in
   488                     in
   479                       processS used' (States' @ States) (S :: Si, Sii)
   489                       processS used' (States' @ States) (S :: Si, Sii)
   480                     end
   490                     end
   481                 | Some n =>
   491                 | Some n =>
   482                     if n >= prec then
   492                     if n >= prec then
   483                       processS used' States (S :: Si, Sii)
   493                       processS used' States (S :: Si, Sii)
   484                     else
   494                     else
   485                       let
   495                       let
   486                         val Slist = getS' A prec n Si;
   496                         val Slist = getS' A prec n Si;
       
   497                         val _ = check_branching (length Slist);
   487                         val States' = map (movedot_nonterm tt) Slist;
   498                         val States' = map (movedot_nonterm tt) Slist;
   488                       in
   499                       in
   489                         processS used' (States' @ States) (S :: Si, Sii)
   500                        processS used' (States' @ States) (S :: Si, Sii)
   490                       end)
   501                       end)
   491               end 
   502               end 
   492             else
   503             else
   493               processS used
   504               let val Slist = getStates Estate i j A prec;
   494                 (map (movedot_nonterm tt) (getStates Estate i j A prec) @ States)
   505                   val _ = check_branching (length Slist);
   495                 (S :: Si, Sii)
   506               in processS used (map (movedot_nonterm tt) Slist @ States)
       
   507                    (S :: Si, Sii)
       
   508               end
   496           end)
   509           end)
   497 in
   510 in processS [] states ([], []) end;
   498   processS [] states ([], [])
       
   499 end;
       
   500 
       
   501 
   511 
   502 
   512 
   503 fun syntax_error toks allowed =
   513 fun syntax_error toks allowed =
   504   error 
   514   error 
   505   ((if toks = [] then
   515   ((if toks = [] then
   590     val s = length indata + 1;
   600     val s = length indata + 1;
   591     val Estate = Array.array (s, []);
   601     val Estate = Array.array (s, []);
   592   in
   602   in
   593     Array.update (Estate, 0, S0);
   603     Array.update (Estate, 0, S0);
   594     let
   604     let
   595       val l = produce Estate 0 indata EndToken(*dummy*);
   605       val l = (warned := false; produce Estate 0 indata EndToken(*dummy*));
   596 
   606 
   597       val p_trees = get_trees l;
   607       val p_trees = get_trees l;
   598     in p_trees end
   608     in p_trees end
   599   end;
   609   end;
   600 
   610