Template language overhaul & misc. improvements
[bpt/mlt.git] / src / parse.sml
1 (*
2 * Dynamic web page generation with Standard ML
3 * Copyright (C) 2003 Adam Chlipala
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *)
19
20 (* Template language parser *)
21
22 signature PARSE =
23 sig
24 val parse : string -> Tree.block
25 end
26
27 structure Parse :> PARSE =
28 struct
29
30 structure MltLrVals = MltLrValsFn(structure Token = LrParser.Token)
31 structure Lex = MltLexFn(structure Tokens = MltLrVals.Tokens)
32 structure MltP = Join(structure ParserData = MltLrVals.ParserData
33 structure Lex = Lex
34 structure LrParser = LrParser)
35
36 (* The main parsing routine *)
37 fun parse filename =
38 let val _ = (ErrorMsg.reset(); ErrorMsg.fileName := filename)
39 val file = TextIO.openIn filename
40 fun get _ = TextIO.input file
41 fun parseerror(s,p1,p2) = ErrorMsg.error (SOME (p1,p2)) s
42 val lexer = LrParser.Stream.streamify (Lex.makeLexer get)
43 val (absyn, _) = MltP.parse(30,lexer, parseerror, ())
44 in
45 TextIO.closeIn file;
46 absyn
47 end
48 handle LrParser.ParseError => raise ErrorMsg.Error
49 end