(* File: GRPRS.ML *) (* Project: GR *) exception SynError of string; (* Phrase consisting of the keyword 'a' *) fun $a (Key b :: toks) = if a=b then (a, toks) else raise SynError a | $a _ = raise SynError "Symbol expected"; fun id (Name a :: toks) = (a, toks) | id toks = raise SynError "Identifier expected"; fun >> (ph, f) toks = let val (x, toks') = ph toks in (f x, toks') end; infix 3 >>; fun || (ph1, ph2) toks = ph1 toks handle SynError _ => ph2 toks; infix 0 ||; fun ~~ (ph1, ph2) toks = let val (x, toks1) = ph1 toks val (y, toks2) = ph2 toks1 in ((x,y), toks2) end; infix 5 ~~; fun empty toks = ([], toks); fun many ph toks = ( ph ~~ many ph >> (op ::) || empty ) toks fun many_sep ph sep toks = ( ph ~~ ( (sep ~~ many_sep ph sep >> snd) || empty ) >> (op ::) ) toks; fun parser ph toks = (case ph toks of (x, []) => x | (_, _::_) => raise SynError "Extra characters in phrase" );