]> Joshua Wise's Git repositories - snipe.git/blob - parse/parse.sml
1fc612f9727fba19963e2f91548cbb76a0cd9e0a
[snipe.git] / parse / parse.sml
1 (* L1 Compiler
2  * Parsing
3  * Author: Kaustuv Chaudhuri <kaustuv+@cs.cmu.edu>
4  * Modified: Frank Pfenning <fp@cs.cmu.edu>
5  *
6  * Glueing together the pieces produced by ML-Lex and ML-Yacc
7  *)
8
9 signature PARSE =
10 sig
11   (* parse filename = ast
12    * will raise ErrorMsg.Error in case of lexing or parsing error
13    *)
14   val parse : string -> Ast.program
15 end
16
17 structure Parse :> PARSE =
18 struct 
19
20   structure L2LrVals = L2LrValsFn (structure Token = LrParser.Token)
21   structure L2Lex = L2LexFn (structure Tokens = L2LrVals.Tokens)
22   structure L2Parse = Join (structure ParserData = L2LrVals.ParserData
23                             structure Lex = L2Lex
24                             structure LrParser = LrParser)
25
26   (* Main parsing function *)
27   fun parse filename =
28       SafeIO.withOpenIn filename (fn instream =>
29         let 
30           val _ = ErrorMsg.reset() (* no errors, no messages so far *)
31           val _ = ParseState.setfile filename (* start at position 0 in filename *)
32           fun parseerror (s, p1, p2) = ErrorMsg.error (ParseState.ext (p1,p2)) s
33           val lexer = LrParser.Stream.streamify
34                           (L2Lex.makeLexer (fn _ => TextIO.input instream))
35           (* 0 = no error correction, 15 = reasonable lookahead for correction *)
36           val (absyn, _) = L2Parse.parse(0, lexer, parseerror, ())
37           val _ = if !ErrorMsg.anyErrors
38                   then raise ErrorMsg.Error
39                   else ()
40         in
41           absyn
42         end)
43       handle Fail s => ( ErrorMsg.error NONE ("lexer error: "^s) ;
44                          raise ErrorMsg.Error )
45            | LrParser.ParseError => raise ErrorMsg.Error (* always preceded by msg *)
46            | e as IO.Io _ => ( ErrorMsg.error NONE (exnMessage e);
47                                raise ErrorMsg.Error )
48
49 end
This page took 0.021702 seconds and 2 git commands to generate.