src/Pure/Syntax/parser.ML
changeset 33317 b4534348b8fd
parent 33063 4d462963a7db
child 37216 3165bc303f66
equal deleted inserted replaced
33316:6a72af4e84b8 33317:b4534348b8fd
   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