Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/compiler/Parse/main/frontend.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/Parse/main/frontend.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (view) (download)

1 : monnier 16 (* Copyright 1996 by AT&T Bell Laboratories *)
2 :     (* frontend.sml *)
3 :    
4 :     structure FrontEnd : FRONT_END =
5 :     struct
6 :    
7 :     structure MLLrVals = MLLrValsFun(structure Token = LrParser.Token)
8 :     structure Lex = MLLexFun(structure Tokens = MLLrVals.Tokens)
9 :     structure MLP = JoinWithArg(structure ParserData = MLLrVals.ParserData
10 :     structure Lex=Lex
11 :     structure LrParser = LrParser)
12 :    
13 :     (* the following two functions are also defined in build/computil.sml *)
14 :     val addLines = Stats.addStat(Stats.makeStat "Source Lines")
15 :    
16 :     open ErrorMsg
17 :    
18 :     datatype parseResult
19 :     = EOF (* end of file reached *)
20 :     | ERROR (* parsed successfully, but with syntactic or semantic errors *)
21 :     | ABORT (* could not even parse to end of declaration *)
22 :     | PARSE of Ast.dec
23 :    
24 :     val dummyEOF = MLLrVals.Tokens.EOF(0,0)
25 :     val dummySEMI = MLLrVals.Tokens.SEMICOLON(0,0)
26 :    
27 :     fun parse (source as {sourceStream,errConsumer,interactive,
28 :     sourceMap, anyErrors,...}: Source.inputSource) =
29 :     let val err = ErrorMsg.error source
30 :     val complainMatch = ErrorMsg.matchErrorString source
31 :    
32 :     fun parseerror(s,p1,p2) = err (p1,p2) COMPLAIN s nullErrorBody
33 :    
34 :     val lexarg = {comLevel = ref 0,
35 :     sourceMap = sourceMap,
36 :     charlist = ref (nil : string list),
37 :     stringtype = ref false,
38 :     stringstart = ref 0,
39 :     err = err,
40 :     brack_stack = ref (nil: int ref list)}
41 :    
42 :     val doprompt = ref true
43 :     val prompt = ref (!Control.primaryPrompt)
44 :    
45 :     fun inputc_sourceStream _ = TextIO.input(sourceStream)
46 :    
47 :     exception AbortLex
48 :     fun getline k =
49 :     (if !doprompt
50 :     then (if !anyErrors then raise AbortLex else ();
51 :     Control.Print.say
52 :     (if !(#comLevel lexarg) > 0
53 :     orelse !(#charlist lexarg) <> nil
54 :     then !Control.secondaryPrompt
55 :     else !prompt);
56 :     Control.Print.flush();
57 :     doprompt := false)
58 :     else ();
59 :     let val s = inputc_sourceStream k
60 :     in doprompt := ((String.sub(s,size s - 1) = #"\n")
61 :     handle _ => false);
62 :     s
63 :     end)
64 :    
65 :     val lexer =
66 :     Lex.makeLexer (if interactive then getline
67 :     else inputc_sourceStream) lexarg
68 :     val lexer' = ref(LrParser.Stream.streamify lexer)
69 :     val lookahead = if interactive then 0 else 30
70 :    
71 :     fun oneparse () =
72 :     let val _ = prompt := !Control.primaryPrompt
73 :     val (nextToken,rest) = LrParser.Stream.get(!lexer')
74 :    
75 :     val startpos = SourceMap.lastChange sourceMap
76 :     fun linesRead() = SourceMap.newlineCount sourceMap
77 :     (startpos, SourceMap.lastChange sourceMap)
78 :     in (*if interactive then SourceMap.forgetOldPositions sourceMap
79 :     else ();*)
80 :     if MLP.sameToken(nextToken,dummySEMI)
81 :     then (lexer' := rest; oneparse ())
82 :     else if MLP.sameToken(nextToken,dummyEOF)
83 :     then EOF
84 :     else let val _ = prompt := !Control.secondaryPrompt;
85 :     val (result, lexer'') =
86 :     MLP.parse(lookahead,!lexer',parseerror,err)
87 :     val _ = addLines(linesRead())
88 :     val _ = lexer' := lexer''
89 :     in if !anyErrors then ERROR else PARSE result
90 :     end
91 :     end handle LrParser.ParseError => ABORT
92 :     | AbortLex => ABORT
93 :     (* oneparse *)
94 :     in fn () => (anyErrors := false; oneparse ())
95 :     end
96 :    
97 :     end (* structure FrontEnd *)

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