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

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

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