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

SCM Repository

[smlnj] Diff of /sml/trunk/src/cm/parse/parse.sml
ViewVC logotype

Diff of /sml/trunk/src/cm/parse/parse.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 273, Wed May 12 08:38:51 1999 UTC revision 277, Mon May 17 09:13:26 1999 UTC
# Line 30  Line 30 
30          val currentDir = AbsPath.dir group          val currentDir = AbsPath.dir group
31          val context = AbsPath.relativeContext (AbsPath.dir group)          val context = AbsPath.relativeContext (AbsPath.dir group)
32          val filename = AbsPath.name group          val filename = AbsPath.name group
33            val _ = Say.vsay (concat ["[scanning ", filename, "]\n"])
34          val stream = TextIO.openIn filename          val stream = TextIO.openIn filename
35          val errcons =          val errcons =
36              { linewidth = !P.linewidth, flush = P.flush, consumer = P.say }              { linewidth = !P.linewidth, flush = P.flush, consumer = P.say }
37          val source = S.newSource (filename, 1, stream, false, errcons)          val source = S.newSource (filename, 1, stream, false, errcons)
38          val sourceMap = #sourceMap source          val sourceMap = #sourceMap source
39          fun error region m =          fun error' region m b = EM.error source region EM.COMPLAIN m b
40              EM.error source region EM.COMPLAIN m EM.nullErrorBody          fun error region m = error' region m EM.nullErrorBody
41    
42          (* recParse returns a group (not an option)          (* recParse returns a group (not an option)
43           * and re-raises LrParser.ParseError.           * and re-raises LrParser.ParseError.
# Line 45  Line 46 
46           * This function is used to parse aliases and sub-groups. *)           * This function is used to parse aliases and sub-groups. *)
47          fun recParse (p1, p2) p =          fun recParse (p1, p2) p =
48              case parse' (p, (group, (source, p1, p2)) :: groupstack) of              case parse' (p, (group, (source, p1, p2)) :: groupstack) of
49                  NONE => raise LrParser.ParseError                  NONE => (#anyErrors source := true; CMSemant.emptyGroup)
50                | SOME res => res                | SOME res => res
51    
52          fun doMember (p, p1, p2, c) =          fun doMember (p, p1, p2, c, e) =
53              CMSemant.member (recParse (p1, p2)) { sourcepath = p,              CMSemant.member (recParse (p1, p2))
54                                { sourcepath = p,
55                                                    group = group,                                                    group = group,
56                                                    class = c }                                class = c,
57                                  error = e }
58    
59          (* checking for cycles among groups and printing them nicely *)          (* checking for cycles among groups and printing them nicely *)
60          val _ = let          val _ = let
# Line 73  Line 76 
76                          end                          end
77                  in                  in
78                      PrettyPrint.add_newline pps;                      PrettyPrint.add_newline pps;
79                      PrettyPrint.begin_block pps PrettyPrint.CONSISTENT 4;                      loop (g, hist)
                     loop (g, hist);  
                     PrettyPrint.end_block pps  
80                  end                  end
81              in              in
82                  EM.error s (p1, p2) EM.COMPLAIN                  EM.error s (p1, p2) EM.COMPLAIN
83                     ("group hierarchy forms a cycle with " ^ AbsPath.spec group)                     ("group hierarchy forms a cycle with " ^ AbsPath.spec group)
84                     pphist                     pphist;
85                    raise LrParser.ParseError
86              end              end
87          in          in
88              case findCycle (groupstack, []) of              case findCycle (groupstack, []) of
# Line 151  Line 153 
153          val (parseResult, _) =          val (parseResult, _) =
154              CMParse.parse (lookAhead, tokenStream,              CMParse.parse (lookAhead, tokenStream,
155                             fn (s,p1,p2) => error (p1, p2) s,                             fn (s,p1,p2) => error (p1, p2) s,
156                             (context, error, recParse, doMember))                             (context, error', error, recParse, doMember))
157      in      in
158          TextIO.closeIn stream;          TextIO.closeIn stream;
159          if !(#anyErrors source) then NONE          if !(#anyErrors source) then NONE
160          else SOME parseResult          else SOME parseResult
161      end handle LrParser.ParseError => NONE      end
162        handle LrParser.ParseError => NONE
163             | Cycle => NONE
164    
165      fun parse group = parse' (group, [])      fun parse group = parse' (group, [])
166  end  end

Legend:
Removed from v.273  
changed lines
  Added in v.277

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