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 |