annotate src/compiler.sml @ 24:ea15905e598d

Run a shake before reducing
author Adam Chlipala <adamc@hcoop.net>
date Sun, 08 Jun 2008 17:21:31 -0400
parents bfa2e9ae4df8
children 0a762c73824d
rev   line source
adamc@1 1 (* Copyright (c) 2008, Adam Chlipala
adamc@1 2 * All rights reserved.
adamc@1 3 *
adamc@1 4 * Redistribution and use in source and binary forms, with or without
adamc@1 5 * modification, are permitted provided that the following conditions are met:
adamc@1 6 *
adamc@1 7 * - Redistributions of source code must retain the above copyright notice,
adamc@1 8 * this list of conditions and the following disclaimer.
adamc@1 9 * - Redistributions in binary form must reproduce the above copyright notice,
adamc@1 10 * this list of conditions and the following disclaimer in the documentation
adamc@1 11 * and/or other materials provided with the distribution.
adamc@1 12 * - The names of contributors may not be used to endorse or promote products
adamc@1 13 * derived from this software without specific prior written permission.
adamc@1 14 *
adamc@1 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
adamc@1 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
adamc@1 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
adamc@1 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
adamc@1 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
adamc@1 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
adamc@1 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
adamc@1 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
adamc@1 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
adamc@1 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
adamc@1 25 * POSSIBILITY OF SUCH DAMAGE.
adamc@1 26 *)
adamc@1 27
adamc@1 28 (* Laconic/Web language parser *)
adamc@1 29
adamc@1 30 structure Compiler :> COMPILER = struct
adamc@1 31
adamc@1 32 structure LacwebLrVals = LacwebLrValsFn(structure Token = LrParser.Token)
adamc@1 33 structure Lex = LacwebLexFn(structure Tokens = LacwebLrVals.Tokens)
adamc@1 34 structure LacwebP = Join(structure ParserData = LacwebLrVals.ParserData
adamc@1 35 structure Lex = Lex
adamc@1 36 structure LrParser = LrParser)
adamc@1 37
adamc@1 38 (* The main parsing routine *)
adamc@1 39 fun parse filename =
adamc@1 40 let
adamc@1 41 val () = (ErrorMsg.resetErrors ();
adamc@1 42 ErrorMsg.resetPositioning filename)
adamc@1 43 val file = TextIO.openIn filename
adamc@1 44 fun get _ = TextIO.input file
adamc@1 45 fun parseerror (s, p1, p2) = ErrorMsg.errorAt' (p1, p2) s
adamc@1 46 val lexer = LrParser.Stream.streamify (Lex.makeLexer get)
adamc@1 47 val (absyn, _) = LacwebP.parse (30, lexer, parseerror, ())
adamc@1 48 in
adamc@1 49 TextIO.closeIn file;
adamc@5 50 if ErrorMsg.anyErrors () then
adamc@5 51 NONE
adamc@5 52 else
adamc@5 53 SOME absyn
adamc@1 54 end
adamc@1 55 handle LrParser.ParseError => NONE
adamc@1 56
adamc@5 57 fun elaborate env filename =
adamc@5 58 case parse filename of
adamc@5 59 NONE => NONE
adamc@5 60 | SOME file =>
adamc@5 61 let
adamc@5 62 val out = Elaborate.elabFile env file
adamc@5 63 in
adamc@5 64 if ErrorMsg.anyErrors () then
adamc@5 65 NONE
adamc@5 66 else
adamc@5 67 SOME out
adamc@5 68 end
adamc@16 69
adamc@16 70 fun corify eenv cenv filename =
adamc@16 71 case elaborate eenv filename of
adamc@16 72 NONE => NONE
adamc@16 73 | SOME (_, file) => SOME (Corify.corify file)
adamc@5 74
adamc@20 75 fun reduce eenv cenv filename =
adamc@20 76 case corify eenv cenv filename of
adamc@20 77 NONE => NONE
adamc@24 78 | SOME file => SOME (Reduce.reduce (Shake.shake file))
adamc@20 79
adamc@23 80 fun shake eenv cenv filename =
adamc@23 81 case reduce eenv cenv filename of
adamc@23 82 NONE => NONE
adamc@23 83 | SOME file => SOME (Shake.shake file)
adamc@23 84
adamc@1 85 fun testParse filename =
adamc@1 86 case parse filename of
adamc@5 87 NONE => print "Failed\n"
adamc@1 88 | SOME file =>
adamc@5 89 (Print.print (SourcePrint.p_file file);
adamc@5 90 print "\n")
adamc@5 91
adamc@5 92 fun testElaborate filename =
adamc@14 93 (case elaborate ElabEnv.basis filename of
adamc@5 94 NONE => print "Failed\n"
adamc@5 95 | SOME (_, file) =>
adamc@14 96 (Print.print (ElabPrint.p_file ElabEnv.basis file);
adamc@5 97 print "\n"))
adamc@5 98 handle ElabEnv.UnboundNamed n =>
adamc@5 99 print ("Unbound named " ^ Int.toString n ^ "\n")
adamc@1 100
adamc@16 101 fun testCorify filename =
adamc@16 102 (case corify ElabEnv.basis CoreEnv.basis filename of
adamc@16 103 NONE => print "Failed\n"
adamc@16 104 | SOME file =>
adamc@16 105 (Print.print (CorePrint.p_file CoreEnv.basis file);
adamc@16 106 print "\n"))
adamc@16 107 handle CoreEnv.UnboundNamed n =>
adamc@16 108 print ("Unbound named " ^ Int.toString n ^ "\n")
adamc@16 109
adamc@20 110 fun testReduce filename =
adamc@20 111 (case reduce ElabEnv.basis CoreEnv.basis filename of
adamc@20 112 NONE => print "Failed\n"
adamc@20 113 | SOME file =>
adamc@20 114 (Print.print (CorePrint.p_file CoreEnv.basis file);
adamc@20 115 print "\n"))
adamc@20 116 handle CoreEnv.UnboundNamed n =>
adamc@20 117 print ("Unbound named " ^ Int.toString n ^ "\n")
adamc@20 118
adamc@23 119 fun testShake filename =
adamc@23 120 (case shake ElabEnv.basis CoreEnv.basis filename of
adamc@23 121 NONE => print "Failed\n"
adamc@23 122 | SOME file =>
adamc@23 123 (Print.print (CorePrint.p_file CoreEnv.basis file);
adamc@23 124 print "\n"))
adamc@23 125 handle CoreEnv.UnboundNamed n =>
adamc@23 126 print ("Unbound named " ^ Int.toString n ^ "\n")
adamc@23 127
adamc@1 128 end