Import Upstream version 20180207
[hcoop/debian/mlton.git] / mlton / front-end / front-end.fun
1 (* Copyright (C) 2015 Matthew Fluet.
2 * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
5 *
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
8 *)
9
10 functor FrontEnd (S: FRONT_END_STRUCTS): FRONT_END =
11 struct
12
13 open S
14
15 structure LrVals = MLLrValsFun (structure Token = LrParser.Token
16 structure Ast = Ast)
17 structure Lex = MLLexFun (structure Tokens = LrVals.Tokens)
18 structure Parse = JoinWithArg (structure ParserData = LrVals.ParserData
19 structure Lex = Lex
20 structure LrParser = LrParser)
21
22 fun lexAndParse (source: Source.t, ins: In.t): Ast.Program.t =
23 let
24 val stream =
25 Parse.makeLexer (fn n => In.inputN (ins, n))
26 {source = source}
27 val lookahead = 30
28 val result =
29 (#1 (Parse.parse (lookahead, stream, fn (s, left, right) =>
30 Control.errorStr (Region.make {left = left,
31 right = right},
32 s),
33 ())))
34 handle _ =>
35 let
36 val i = Source.lineStart source
37 val _ =
38 Control.errorStr (Region.make {left = i, right = i},
39 "parse error")
40 in
41 Ast.Program.T []
42 end
43 val () = Ast.Program.checkSyntax result
44
45 (* Outputs AST to a file if Control.keepAST is true *)
46 val () =
47 if !Control.keepAST
48 then File.withAppend
49 (concat [!Control.inputFile, ".ast"], fn outputStream =>
50 (Out.outputl (outputStream, concat ["File: ", Source.name source]);
51 Layout.output (Ast.Program.layout result, outputStream);
52 Out.newline outputStream;
53 Out.newline outputStream))
54 else ()
55 in
56 result
57 end
58
59 fun lexAndParseFile (f: File.t) =
60 File.withIn
61 (f, fn ins => lexAndParse (Source.new f, ins))
62
63 val lexAndParseFile =
64 Trace.trace ("FrontEnd.lexAndParseFile", File.layout, Ast.Program.layout)
65 lexAndParseFile
66
67 end