]> Joshua Wise's Git repositories - snipe.git/blame_incremental - parse/parse.sml
Code generation.
[snipe.git] / parse / parse.sml
... / ...
CommitLineData
1(* L5 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
20 structure L5LrVals = L5LrValsFn (structure Token = LrParser.Token)
21 structure L5Lex = L5LexFn (structure Tokens = L5LrVals.Tokens)
22 structure L5Parse = Join (structure ParserData = L5LrVals.ParserData
23 structure Lex = L5Lex
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 (L5Lex.makeLexer (fn _ => TextIO.input instream))
35 (* 0 = no error correction, 15 = reasonable lookahead for correction *)
36 val (absyn, _) = L5Parse.parse(0, lexer, parseerror, ())
37 val _ = if !ErrorMsg.anyErrors
38 then raise ErrorMsg.Error
39 else ()
40 in
41 absyn
42 end)
43 handle (*L5Lex.LexError => ( ErrorMsg.error NONE "lexer error" ;
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
49end
This page took 0.024901 seconds and 4 git commands to generate.