(* Chris's original routines just parsed the first declaration, * but some files of test cases contain sequences of top-level * declarations. So I provide the option... * * Also pulled out code to get source for parsing. * * 7/31/2003, A. Dimock *) structure ParserInterface = struct (* Get source from stdin or from named file *) fun whichSource NONE = Source.newSource ("stdIn", 1, TextIO.stdIn, true, ErrorMsg.defaultConsumer()) | whichSource (SOME(str)) = Source.newSource (str, 1, TextIO.openIn str, false, ErrorMsg.defaultConsumer()) (* Parse one declaration *) fun parseOne source = let val parser = MLParser.parse source in case parser () of MLParser.PARSE ast => ast | x => raise PEUtil.BadParseResult x end (* Parse all declarations to EOF. *) fun parseAll source = let val parser = MLParser.parse source fun loop asts = case parser () of MLParser.EOF => Ast.SeqDec (rev asts) | MLParser.PARSE ast => loop (ast :: asts) | x => raise PEUtil.BadParseResult x in loop [] end end