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/cm.lex
ViewVC logotype

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

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

revision 262, Thu May 6 06:52:05 1999 UTC revision 266, Sat May 8 04:00:44 1999 UTC
# Line 2  Line 2 
2    
3  type svalue = Tokens.svalue  type svalue = Tokens.svalue
4  type pos = int  type pos = int
5    
6  type ('a, 'b) token = ('a, 'b) Tokens.token  type ('a, 'b) token = ('a, 'b) Tokens.token
7  type lexresult = (svalue, pos) token  type lexresult = (svalue, pos) token
8    
9  fun err (p1, p2) = ErrorMsg.error p1  type lexarg = {
10                   enterC: unit -> unit,
11                   leaveC: unit -> bool,
12                   newS: pos * string -> unit,
13                   addS: char -> unit,
14                   addSC: string * int -> unit,
15                   addSN: string * pos -> unit,
16                   getS: pos * (string * pos * pos -> lexresult) -> lexresult,
17                   handleEof: unit -> lexresult,
18                   newline: pos -> unit,
19                   error: pos -> string -> unit
20                  }
21    
22    type arg = lexarg
23    
24    fun eof (arg: lexarg) = (#handleEof arg ())
25    
26    (*
27  local  local
28      val depth = ref 0      val depth = ref 0
29      val curstring = ref ([]: char list)      val curstring = ref ([]: char list)
30      val startpos = ref 0      val startpos = ref 0
31      val instring = ref false      val instring = ref false
32  in  in
33    
34    
35      fun resetAll () = (depth := 0; startpos := 0; instring := false)      fun resetAll () = (depth := 0; startpos := 0; instring := false)
36    
37      (* comment stuff *)      (* comment stuff *)
# Line 41  Line 60 
60           Tokens.STRING (implode (rev (!curstring)), !startpos, endpos + 1))           Tokens.STRING (implode (rev (!curstring)), !startpos, endpos + 1))
61    
62      (* handling EOF *)      (* handling EOF *)
63      fun eof() = let      fun eof (arg: ) = let
64          val pos = ErrorMsg.lastLinePos ()          val pos = ErrorMsg.lastLinePos ()
65      in      in
66          if !depth > 0 then          if !depth > 0 then
# Line 53  Line 72 
72          Tokens.EOF(pos,pos)          Tokens.EOF(pos,pos)
73      end      end
74  end  end
75    *)
76    
77  local  local
78      val idlist = [("Alias", Tokens.ALIAS),      val idlist = [("Alias", Tokens.ALIAS),
# Line 72  Line 92 
92  in  in
93      fun idToken (t, p) =      fun idToken (t, p) =
94          case List.find (fn (id, _) => id = t) idlist of          case List.find (fn (id, _) => id = t) idlist of
95              NONE => Tokens.ID (t, p, p + size t)              NONE => Tokens.FILE_STANDARD (t, p, p + size t)
96            | SOME (_, tok) => tok (p, p + size t)            | SOME (_, tok) => tok (p, p + size t)
97  end  end
98    
99  fun newLine p = ErrorMsg.newLine p  (* states:
100    
101         INITIAL -> C
102           |
103           +------> P -> PC
104           |        |
105           |        +--> PM -> PMC
106           |
107           +------> M -> MC
108           |
109           +------> S -> SS
110           |
111           +------> ES -> E
112    
113       "C"  -- COMMENT
114       "P"  -- PREPROC
115       "M"  -- MLSYMBOL
116       "S"  -- STRING
117       "SS" -- STRINGSKIP
118       "ES" -- ERRORSTART
119       "E"  -- ERROR
120    *)
121    
122  %%  %%
123  %s COMMENT STRING STRINGSKIP;  
124    %s C P PC PM PMC M MC S SS E ES;
125    
126  %header(functor CMLexFun (structure Tokens: CM_TOKENS));  %header(functor CMLexFun (structure Tokens: CM_TOKENS));
127    
128    %arg ({ enterC, leaveC,
129            newS, addS, addSC, addSN, getS,
130            handleEof,
131            newline,
132            error });
133    
134  idchars=[A-Za-z'_0-9];  idchars=[A-Za-z'_0-9];
135  id=[A-Za-z]{idchars}*;  id=[A-Za-z]{idchars}*;
136    cmextrachars=[!%&$+/<=>?@~|#*]|\-|\^;
137    cmidchars={idchars}|{cmextrachars};
138    cmid={cmextrachars}+;
139  ws=("\012"|[\t\ ]);  ws=("\012"|[\t\ ]);
140  eol=("\013\010"|"\013"|"\010");  eol=("\013\010"|"\013"|"\010");
141  sym=[!%&$+/:<=>?@~|#*]|\-|\^|"\\";  sym=[!%&$+/:<=>?@~|#*]|\-|\^|"\\";
# Line 92  Line 143 
143  sharp="#";  sharp="#";
144  %%  %%
145    
146  <COMMENT>"(*"           => (enterC (); continue ());  <INITIAL>"(*"           => (enterC (); YYBEGIN C; continue ());
147  <COMMENT>"*)"           => (if leaveC () then YYBEGIN INITIAL else ();  <P>"(*"                 => (enterC (); YYBEGIN PC; continue ());
148    <PM>"(*"                => (enterC (); YYBEGIN PMC; continue ());
149    <M>"(*"                 => (enterC (); YYBEGIN MC; continue ());
150    
151    <C,PC,PMC,MC>"(*"       => (enterC (); continue ());
152    
153    <C>"*)"                 => (if leaveC () then YYBEGIN INITIAL else ();
154                                continue ());
155    <PC>"*)"                => (if leaveC () then YYBEGIN P else ();
156                                continue ());
157    <PMC>"*)"                => (if leaveC () then YYBEGIN PM else ();
158                                continue ());
159    <MC>"*)"                => (if leaveC () then YYBEGIN M else ();
160                                continue ());
161    <C,PC,PMC,MC>{eol}      => (newline yypos; continue ());
162    <C,PC,PMC,MC>.          => (continue ());
163    
164    <INITIAL,P,PM,M>"*)"    => (error yypos "unmatched comment delimiter";
165                              continue ());                              continue ());
 <COMMENT>{eol}          => (newLine yypos; continue ());  
 <COMMENT>.              => (continue ());  
166    
167  <STRING>"\\a"           => (addS #"\a"; continue ());  <INITIAL>"\""           => (YYBEGIN S; newS (yypos, "string"); continue ());
 <STRING>"\\b"           => (addS #"\b"; continue ());  
 <STRING>"\\f"           => (addS #"\f"; continue ());  
 <STRING>"\\n"           => (addS #"\n"; continue ());  
 <STRING>"\\r"           => (addS #"\r"; continue ());  
 <STRING>"\\t"           => (addS #"\t"; continue ());  
 <STRING>"\\v"           => (addS #"\v"; continue ());  
   
 <STRING>"\\^"@          => (addS (chr 0); continue ());  
 <STRING>"\\^"[a-z]      => (addSC (yytext, yypos, ord #"a"); continue ());  
 <STRING>"\\^"[A-Z]      => (addSC (yytext, yypos, ord #"A"); continue ());  
 <STRING>"\\^["          => (addS (chr 27); continue ());  
 <STRING>"\\^\\"         => (addS (chr 28); continue ());  
 <STRING>"\\^]"          => (addS (chr 29); continue ());  
 <STRING>"\\^^"          => (addS (chr 30); continue ());  
 <STRING>"\\^_"          => (addS (chr 31); continue ());  
   
 <STRING>"\\"[0-9][0-9][0-9]     => (addSN (yytext, yypos); continue ());  
168    
169  <STRING>"\\\""          => (addS #"\""; continue ());  <S>"\\a"                => (addS #"\a"; continue ());
170  <STRING>"\\\\"          => (addS #"\\"; continue ());  <S>"\\b"                => (addS #"\b"; continue ());
171    <S>"\\f"                => (addS #"\f"; continue ());
172    <S>"\\n"                => (addS #"\n"; continue ());
173    <S>"\\r"                => (addS #"\r"; continue ());
174    <S>"\\t"                => (addS #"\t"; continue ());
175    <S>"\\v"                => (addS #"\v"; continue ());
176    
177    <S>"\\^"@               => (addS (chr 0); continue ());
178    <S>"\\^"[a-z]           => (addSC (yytext, ord #"a"); continue ());
179    <S>"\\^"[A-Z]           => (addSC (yytext, ord #"A"); continue ());
180    <S>"\\^["               => (addS (chr 27); continue ());
181    <S>"\\^\\"              => (addS (chr 28); continue ());
182    <S>"\\^]"               => (addS (chr 29); continue ());
183    <S>"\\^^"               => (addS (chr 30); continue ());
184    <S>"\\^_"               => (addS (chr 31); continue ());
185    
186    <S>"\\"[0-9][0-9][0-9]  => (addSN (yytext, yypos); continue ());
187    
188  <STRING>"\\"{eol}       => (YYBEGIN STRINGSKIP; newLine yypos; continue ());  <S>"\\\""               => (addS #"\""; continue ());
189  <STRING>"\\"{ws}+       => (YYBEGIN STRINGSKIP; continue ());  <S>"\\\\"               => (addS #"\\"; continue ());
190    
191  <STRING>"\\".           => (ErrorMsg.error yypos  <S>"\\"{eol}            => (YYBEGIN SS; newline (yypos + 1); continue ());
192    <S>"\\"{ws}+            => (YYBEGIN SS; continue ());
193    
194    <S>"\\".                => (error yypos
195                               ("illegal escape character in string " ^ yytext);                               ("illegal escape character in string " ^ yytext);
196                              continue ());                              continue ());
197    
198  <STRING>"\""            => (YYBEGIN INITIAL; getS yypos);  <S>"\""                 => (YYBEGIN INITIAL; getS (yypos, Tokens.FILE_NATIVE));
199  <STRING>{eol}           => (ErrorMsg.error yypos "illegal linebreak in string";  <S>{eol}                => (newline yypos;
200                                error yypos "illegal linebreak in string";
201                              continue ());                              continue ());
 <STRING>.               => (addS (String.sub (yytext, 0)); continue ());  
202    
203  <STRINGSKIP>{eol}       => (newLine yypos; continue ());  <S>.                    => (addS (String.sub (yytext, 0)); continue ());
 <STRINGSKIP>{ws}+       => (continue ());  
 <STRINGSKIP>"\\"        => (YYBEGIN STRING; continue ());  
 <STRINGSKIP>.           => (ErrorMsg.error yypos  
                              ("illegal character in stringskip " ^ yytext);  
                             continue ());  
204    
205  <INITIAL>"(*"           => (YYBEGIN COMMENT; enterC (); continue ());  <SS>{eol}               => (newline yypos; continue ());
206  <INITIAL>"*)"           => (ErrorMsg.error yypos "unmatched comment delimiter";  <SS>{ws}+               => (continue ());
207    <SS>"\\"                => (YYBEGIN S; continue ());
208    <SS>.                   => (error yypos
209                                 ("illegal character in stringskip " ^ yytext);
210                              continue ());                              continue ());
 <INITIAL>"\""           => (YYBEGIN STRING; newS yypos; continue ());  
211    
212  <INITIAL>"("            => (Tokens.LPAREN (yypos, yypos + 1));  <INITIAL,P>"("          => (Tokens.LPAREN (yypos, yypos + 1));
213  <INITIAL>")"            => (Tokens.RPAREN (yypos, yypos + 1));  <INITIAL,P>")"          => (Tokens.RPAREN (yypos, yypos + 1));
 <INITIAL>","            => (Tokens.COMMA (yypos, yypos + 1));  
214  <INITIAL>":"            => (Tokens.COLON (yypos, yypos + 1));  <INITIAL>":"            => (Tokens.COLON (yypos, yypos + 1));
215  <INITIAL>"+"            => (Tokens.PLUS (yypos, yypos + 1));  <P>"+"                  => (Tokens.PLUS (yypos, yypos + 1));
216  <INITIAL>"-"            => (Tokens.MINUS (yypos, yypos + 1));  <P>"-"                  => (Tokens.MINUS (yypos, yypos + 1));
217  <INITIAL>"*"            => (Tokens.TIMES (yypos, yypos + 1));  <P>"*"                  => (Tokens.TIMES (yypos, yypos + 1));
218  <INITIAL>"<>"           => (Tokens.NE (yypos, yypos + 2));  <P>"<>"                 => (Tokens.NE (yypos, yypos + 2));
219  <INITIAL>"<="           => (Tokens.LE (yypos, yypos + 2));  <P>"<="                 => (Tokens.LE (yypos, yypos + 2));
220  <INITIAL>"<"            => (Tokens.LT (yypos, yypos + 1));  <P>"<"                  => (Tokens.LT (yypos, yypos + 1));
221  <INITIAL>">="           => (Tokens.GE (yypos, yypos + 2));  <P>">="                 => (Tokens.GE (yypos, yypos + 2));
222  <INITIAL>">"            => (Tokens.GT (yypos, yypos + 1));  <P>">"                  => (Tokens.GT (yypos, yypos + 1));
223  <INITIAL>"="            => (Tokens.EQ (yypos, yypos + 1));  <P>"="                  => (Tokens.EQ (yypos, yypos + 1));
224    <P>"~"                  => (Tokens.TILDE (yypos, yypos + 1));
225    
226  <INITIAL>{digit}+       => (Tokens.NUMBER  <P>{digit}+             => (Tokens.NUMBER
227                               (valOf (Int.fromString yytext)                               (valOf (Int.fromString yytext)
228                                handle _ =>                                handle _ =>
229                                    (ErrorMsg.error yypos "number too large"; 0),                                    (error yypos "number too large"; 0),
230                                yypos, yypos + size yytext));                                yypos, yypos + size yytext));
 <INITIAL>{sym}+         => (Tokens.ID (yytext, yypos, yypos + size yytext));  
 <INITIAL>{id}           => (idToken (yytext, yypos));  
231    
232  <INITIAL>{eol}{sharp}{ws}*"if"   => (Tokens.IF (yypos, yypos + size yytext));  <P>{id}                 => (Tokens.CM_ID (yytext, yypos, yypos + size yytext));
233  <INITIAL>{eol}{sharp}{ws}*"then" => (Tokens.THEN (yypos, yypos + size yytext));  
234  <INITIAL>{eol}{sharp}{ws}*"elif" => (Tokens.ELIF (yypos, yypos + size yytext));  <M>({id}|{sym}+)        => (YYBEGIN INITIAL;
235  <INITIAL>{eol}{sharp}{ws}*"else" => (Tokens.ELSE (yypos, yypos + size yytext));                              Tokens.ML_ID (yytext, yypos, yypos + size yytext));
236  <INITIAL>{eol}{sharp}{ws}*"endif" => (Tokens.ENDIF (yypos,  <PM>({id}|{sym}+)       => (YYBEGIN P;
237                                Tokens.ML_ID (yytext, yypos, yypos + size yytext));
238    
239    <INITIAL>{eol}{sharp}{ws}*"if"   => (YYBEGIN P;
240                                         newline yypos;
241                                         Tokens.IF (yypos, yypos + size yytext));
242    <INITIAL>{eol}{sharp}{ws}*"then" => (YYBEGIN P;
243                                         newline yypos;
244                                         Tokens.THEN (yypos, yypos + size yytext));
245    <INITIAL>{eol}{sharp}{ws}*"elif" => (YYBEGIN P;
246                                         newline yypos;
247                                         Tokens.ELIF (yypos, yypos + size yytext));
248    <INITIAL>{eol}{sharp}{ws}*"else" => (YYBEGIN P;
249                                         newline yypos;
250                                         Tokens.ELSE (yypos, yypos + size yytext));
251    <INITIAL>{eol}{sharp}{ws}*"endif" => (YYBEGIN P;
252                                          newline yypos;
253                                          Tokens.ENDIF (yypos,
254                                                      yypos + size yytext));                                                      yypos + size yytext));
255    <INITIAL>{eol}{sharp}{ws}*"error" => (YYBEGIN ES; newline yypos;
256                                          newS (yypos, "error"); continue ());
257    <ES>{ws}+               => (continue ());
258    <ES>{eol}               => (YYBEGIN INITIAL; newline yypos;
259                                getS (yypos, Tokens.ERROR));
260    <ES>.                   => (YYBEGIN E;
261                                addS (String.sub (yytext, 0)); continue ());
262    <E>{eol}                => (YYBEGIN INITIAL; newline yypos;
263                                getS (yypos, Tokens.ERROR));
264    <E>.                    => (addS (String.sub (yytext, 0)); continue ());
265    
266    <INITIAL,M,PM>{eol}     => (newline yypos; continue ());
267    <P>{eol}                => (YYBEGIN INITIAL; newline yypos; continue ());
268    
269    <INITIAL,M,PM,P>{ws}+   => (continue ());
270    
271    <M,PM>.                 => (error yypos
272                                ("illegal character at start of ML symbol: " ^
273                                 yytext);
274                                continue ());
275    
276    <INITIAL>{cmid}         => (idToken (yytext, yypos));
277    
278    
279  <INITIAL>{eol}          => (newLine yypos; continue ());  <INITIAL>.              => (error yypos
280  <INITIAL>{ws}+          => (continue ());                              ("illegal character: " ^ yytext);
 <INITIAL>.              => (ErrorMsg.error yypos  
                              ("illegal character " ^ yytext);  
281                              continue ());                              continue ());

Legend:
Removed from v.262  
changed lines
  Added in v.266

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