(* File GRPRN.RF *) (* Project: GR *) fun print_set (s, tks) = let fun print_set_rest [] = () | print_set_rest (s1::rest) = (output(s, s1); if null rest then () else (output(s, " | "); print_set_rest rest)) fun print_set_loop rest = case rest of s1::s2::s3::s4::s5::rest' => (output(s, s1); output(s, " | "); output(s, s2); output(s, " | "); output(s, s3); output(s, " | "); output(s, s4); output(s, " | "); output(s, s5); if null rest' then () else (output(s, " |\n "); print_set_loop rest')) | _ => print_set_rest rest in output(s, "("); print_set_loop tks; output(s, ")") end; fun print_grammar (s, Grammar (tokens, rules)) = let fun print_rhs [] = output(s, "/* empty */") | print_rhs rhs = foreach (fn (N n) => (output(s, n); output(s, " ")) | (T t) => (output(s, t); output(s, " "))) rhs fun print_rhss (p, []) = output(s, " ;\n\n") | print_rhss (p, (Rhs rhs)::rest) = (output(s, " "); output(s, p); output(s, " "); print_rhs rhs; output(s, "\n"); print_rhss ("|", rest)) fun print_rules (s, rules) = (foreach (fn Group (n, rhss) => (output(s, n); output(s, "\n"); print_rhss (":", rhss))) rules; output(s, "\n")) in output(s, "%token\n"); print_set(s, tokens); output(s, "\n%%\n\n"); print_rules(s, rules) end;