Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/vis15/src/compiler/driver/main.sml
ViewVC logotype

Annotation of /branches/vis15/src/compiler/driver/main.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3417 - (view) (download)

1 : jhr 3394 (* main.sml
2 :     *
3 :     * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     *
5 :     * COPYRIGHT (c) 2015 The University of Chicago
6 :     * All rights reserved.
7 :     *)
8 :    
9 :     structure Main : sig
10 :    
11 :     val main : (string * string list) -> OS.Process.status
12 :    
13 :     end = struct
14 :    
15 :     fun err s = TextIO.output (TextIO.stdErr, s)
16 :     fun err1 c = TextIO.output1 (TextIO.stdErr, c)
17 :     fun errnl s = (err s; err1 #"\n")
18 :    
19 :     exception ERROR
20 :    
21 :     fun quitWithError srcFile = raise ERROR
22 :    
23 :     (* check for errors and report them if there are any *)
24 :     fun checkForErrors errStrm =
25 :     if Error.anyErrors errStrm
26 :     then (
27 :     Error.report (TextIO.stdErr, errStrm);
28 :     quitWithError (Error.sourceFile errStrm))
29 :     else ()
30 :    
31 :     (* compiler front end (parsing, typechecking, and simplification *)
32 :     fun frontEnd filename = let
33 :     val errStrm = Error.mkErrStream filename
34 :     val _ = if OS.FileSys.access(filename, [OS.FileSys.A_READ])
35 :     then ()
36 :     else (
37 :     err(concat["source file \"", filename, "\" does not exist or is not readable\n"]);
38 :     raise ERROR)
39 :     (***** PARSING *****)
40 :     val parseTree = PhaseTimer.withTimer Timers.timeParser (fn () => let
41 :     val inS = TextIO.openIn filename
42 :     val pt = Parser.parseFile (errStrm, inS)
43 :     in
44 :     TextIO.closeIn inS;
45 :     checkForErrors errStrm;
46 :     valOf pt
47 :     end) ()
48 :     (***** TYPECHECKING *****)
49 :     val _ = PhaseTimer.start Timers.timeTypechecker
50 :     val ast = (Typechecker.check errStrm parseTree)
51 :     val _ = PhaseTimer.stop Timers.timeTypechecker
52 :     val _ = checkForErrors errStrm
53 : jhr 3417 (* TODO: check AST for consistency *)
54 :     val _ = if Controls.get Ctl.dumpAST
55 :     then ASTPP.output (Log.logFile(), ast)
56 :     else ()
57 : jhr 3394 (***** SIMPLIFY *****)
58 :     (* TODO *)
59 :     in
60 :     (* check for warnings and report if necessary *)
61 :     if Error.anyWarnings errStrm
62 :     then Error.report (TextIO.stdErr, errStrm)
63 :     else ();
64 :     ()
65 :     end
66 :    
67 : jhr 3411 fun doFile (target : Target.desc, filename) = let
68 : jhr 3394 val baseName = (case OS.Path.splitBaseExt filename
69 :     of {base, ext=SOME "diderot"} => base
70 :     | _ => (errnl "expected diderot file"; quitWithError filename)
71 :     (* end case *))
72 :     val simple = PhaseTimer.withTimer Timers.timeFront frontEnd filename
73 :     (***** TRANSLATION TO HIGH IL*****)
74 :     (* TODO *)
75 :     (***** HIGH-IL OPTIMIZATION *****)
76 :     (* TODO *)
77 :     (***** TRANSLATION TO MID IL *****)
78 :     (* TODO *)
79 :     (***** TRANSLATION TO LOW IL *****)
80 :     (* TODO *)
81 :     in
82 :     (***** CODE GENERATION *****)
83 :     (* TODO *)()
84 :     end
85 :    
86 : jhr 3411 fun usage (cmd, long) = TextIO.output(TextIO.stdErr, Options.usage (cmd, long))
87 : jhr 3394
88 :     fun handleExn ERROR = OS.Process.failure
89 :     | handleExn exn = (
90 :     err (concat [
91 :     "uncaught exception ", General.exnName exn,
92 :     " [", General.exnMessage exn, "]\n"
93 :     ]);
94 :     List.app (fn s => err (concat [" raised at ", s, "\n"])) (SMLofNJ.exnHistory exn);
95 :     OS.Process.failure)
96 :    
97 :     fun main (name: string, args: string list) = let
98 : jhr 3411 val {help, version, target, defs, file} =
99 : jhr 3394 (Options.parseCmdLine args)
100 :     handle Options.Usage msg => (
101 :     err(concat[msg, "\n"]);
102 : jhr 3411 usage (name, false);
103 : jhr 3394 OS.Process.exit OS.Process.failure)
104 :     in
105 : jhr 3417 Ctl.resolve();
106 : jhr 3411 case help
107 :     of SOME long => (usage (name, long); OS.Process.success)
108 :     | NONE => if version
109 :     then (print(Version.message ^ "\n"); OS.Process.success)
110 :     else let
111 :     val {base, ...} = OS.Path.splitBaseExt file
112 :     in
113 :     (* set the default real type *)
114 :     if #double target then (RawTypes.realTy := RawTypes.RT_Double) else ();
115 :     if CmdLineConstants.initFromArgs defs
116 :     then (
117 :     if Controls.get Ctl.enableLog
118 :     then Log.init(base ^ ".log")
119 :     else ();
120 :     PhaseTimer.withTimer Timers.timeCompiler
121 :     doFile (target, file);
122 :     Stats.report ();
123 :     Log.reportTiming Timers.timeCompiler;
124 :     OS.Process.success
125 :     ) handle exn => handleExn exn
126 :     else (err "invalid command-line inputs\n"; OS.Process.failure)
127 :     end
128 :     (* end case *)
129 : jhr 3394 end
130 :    
131 :     end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0