613 string * (*name of production*) |
613 string * (*name of production*) |
614 int; (*index for previous state list*) |
614 int; (*index for previous state list*) |
615 |
615 |
616 |
616 |
617 (*Get all rhss with precedence >= minPrec*) |
617 (*Get all rhss with precedence >= minPrec*) |
618 fun getRHS minPrec = List.filter (fn (_, _, prec:int) => prec >= minPrec); |
618 fun getRHS minPrec = filter (fn (_, _, prec:int) => prec >= minPrec); |
619 |
619 |
620 (*Get all rhss with precedence >= minPrec and < maxPrec*) |
620 (*Get all rhss with precedence >= minPrec and < maxPrec*) |
621 fun getRHS' minPrec maxPrec = |
621 fun getRHS' minPrec maxPrec = |
622 List.filter (fn (_, _, prec:int) => prec >= minPrec andalso prec < maxPrec); |
622 filter (fn (_, _, prec:int) => prec >= minPrec andalso prec < maxPrec); |
623 |
623 |
624 (*Make states using a list of rhss*) |
624 (*Make states using a list of rhss*) |
625 fun mkStates i minPrec lhsID rhss = |
625 fun mkStates i minPrec lhsID rhss = |
626 let fun mkState (rhs, id, prodPrec) = (lhsID, prodPrec, [], rhs, id, i); |
626 let fun mkState (rhs, id, prodPrec) = (lhsID, prodPrec, [], rhs, id, i); |
627 in map mkState rhss end; |
627 in map mkState rhss end; |
653 then used' @ ((A, (prec, ts)) :: used) |
653 then used' @ ((A, (prec, ts)) :: used) |
654 else update (used, hd :: used') |
654 else update (used, hd :: used') |
655 in update (used, []) end; |
655 in update (used, []) end; |
656 |
656 |
657 fun getS A maxPrec Si = |
657 fun getS A maxPrec Si = |
658 List.filter |
658 filter |
659 (fn (_, _, _, Nonterminal (B, prec) :: _, _, _) |
659 (fn (_, _, _, Nonterminal (B, prec) :: _, _, _) |
660 => A = B andalso prec <= maxPrec |
660 => A = B andalso prec <= maxPrec |
661 | _ => false) Si; |
661 | _ => false) Si; |
662 |
662 |
663 fun getS' A maxPrec minPrec Si = |
663 fun getS' A maxPrec minPrec Si = |
664 List.filter |
664 filter |
665 (fn (_, _, _, Nonterminal (B, prec) :: _, _, _) |
665 (fn (_, _, _, Nonterminal (B, prec) :: _, _, _) |
666 => A = B andalso prec > minPrec andalso prec <= maxPrec |
666 => A = B andalso prec > minPrec andalso prec <= maxPrec |
667 | _ => false) Si; |
667 | _ => false) Si; |
668 |
668 |
669 fun getStates Estate i ii A maxPrec = |
669 fun getStates Estate i ii A maxPrec = |
670 List.filter |
670 filter |
671 (fn (_, _, _, Nonterminal (B, prec) :: _, _, _) |
671 (fn (_, _, _, Nonterminal (B, prec) :: _, _, _) |
672 => A = B andalso prec <= maxPrec |
672 => A = B andalso prec <= maxPrec |
673 | _ => false) |
673 | _ => false) |
674 (Array.sub (Estate, ii)); |
674 (Array.sub (Estate, ii)); |
675 |
675 |