]> Joshua Wise's Git repositories - snipe.git/blame - parse/parse.sml
Initial import of l2c
[snipe.git] / parse / parse.sml
CommitLineData
12aa4087
JW
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
9signature PARSE =
10sig
11 (* parse filename = ast
12 * will raise ErrorMsg.Error in case of lexing or parsing error
13 *)
14 val parse : string -> Ast.program
15end
16
17structure Parse :> PARSE =
18struct
19
0a24e44d
JW
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
12aa4087
JW
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
0a24e44d 34 (L2Lex.makeLexer (fn _ => TextIO.input instream))
12aa4087 35 (* 0 = no error correction, 15 = reasonable lookahead for correction *)
0a24e44d 36 val (absyn, _) = L2Parse.parse(0, lexer, parseerror, ())
12aa4087
JW
37 val _ = if !ErrorMsg.anyErrors
38 then raise ErrorMsg.Error
39 else ()
40 in
41 absyn
42 end)
0a24e44d
JW
43 handle Fail s => ( ErrorMsg.error NONE ("lexer error: "^s) ;
44 raise ErrorMsg.Error )
12aa4087
JW
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
49end
This page took 0.026212 seconds and 4 git commands to generate.