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 273, Wed May 12 08:38:51 1999 UTC revision 274, Fri May 14 05:23:02 1999 UTC
# Line 34  Line 34 
34      Tokens.EOF (pos, pos)      Tokens.EOF (pos, pos)
35  end  end
36    
37  local  fun errorTok (t, p) = let
38      val idlist = [("Alias", Tokens.ALIAS),      fun findGraph i =
39            if Char.isGraph (String.sub (t, i)) then i
40            else findGraph (i + 1)
41        fun findError i =
42            if String.sub (t, i) = #"e" then i
43            else findError (i + 1)
44        val start = findGraph (5 + findError 0)
45        val msg = String.extract (t, start, NONE)
46    in
47        Tokens.ERROR (msg, p, p + size t)
48    end
49    
50    val cm_ids = [("Alias", Tokens.ALIAS),
51                    ("Group", Tokens.GROUP),                    ("Group", Tokens.GROUP),
52                    ("Library", Tokens.LIBRARY),                    ("Library", Tokens.LIBRARY),
53                    ("is", Tokens.IS),                ("is", Tokens.IS)]
54                    ("structure", Tokens.STRUCTURE),  
55    val ml_ids = [("structure", Tokens.STRUCTURE),
56                    ("signature", Tokens.SIGNATURE),                    ("signature", Tokens.SIGNATURE),
57                    ("functor", Tokens.FUNCTOR),                    ("functor", Tokens.FUNCTOR),
58                    ("funsig", Tokens.FUNSIG),                ("funsig", Tokens.FUNSIG)]
59                    ("defined", Tokens.DEFINED),  
60    val pp_ids = [("defined", Tokens.DEFINED),
61                    ("div", Tokens.DIV),                    ("div", Tokens.DIV),
62                    ("mod", Tokens.MOD),                    ("mod", Tokens.MOD),
63                    ("andalso", Tokens.ANDALSO),                    ("andalso", Tokens.ANDALSO),
64                    ("orelse", Tokens.ORELSE),                    ("orelse", Tokens.ORELSE),
65                    ("not", Tokens.NOT)]                    ("not", Tokens.NOT)]
66  in  
67      fun idToken (t, p) =  fun idToken (t, p, idlist, default, chstate) =
68          case List.find (fn (id, _) => id = t) idlist of      case List.find (fn (id, _) => id = t) ml_ids of
69              NONE => Tokens.FILE_STANDARD (t, p, p + size t)          SOME (_, tok) => (chstate (); tok (p, p + size t))
70            | SOME (_, tok) => tok (p, p + size t)        | NONE =>
71  end              (case List.find (fn (id, _) => id = t) idlist of
72                     SOME (_, tok) => tok (p, p + size t)
73                   | NONE => default (t, p, p + size t))
74    
75  (* states:  (* states:
76    
# Line 67  Line 83 
83         +------> M -> MC         +------> M -> MC
84         |         |
85         +------> S -> SS         +------> S -> SS
        |  
        +------> ES -> E  
86    
87     "C"  -- COMMENT     "C"  -- COMMENT
88     "P"  -- PREPROC     "P"  -- PREPROC
89     "M"  -- MLSYMBOL     "M"  -- MLSYMBOL
90     "S"  -- STRING     "S"  -- STRING
91     "SS" -- STRINGSKIP     "SS" -- STRINGSKIP
    "ES" -- ERRORSTART  
    "E"  -- ERROR  
92  *)  *)
93    
94  %%  %%
95    
96  %s C P PC PM PMC M MC S SS E ES;  %s C P PC PM PMC M MC S SS;
97    
98  %header(functor CMLexFun (structure Tokens: CM_TOKENS));  %header(functor CMLexFun (structure Tokens: CM_TOKENS));
99    
# Line 93  Line 105 
105    
106  idchars=[A-Za-z'_0-9];  idchars=[A-Za-z'_0-9];
107  id=[A-Za-z]{idchars}*;  id=[A-Za-z]{idchars}*;
108  cmextrachars=[!%&$+/<=>?@~|#*]|\-|\^;  cmextrachars=[.;,!%&$+/<=>?@~|#*]|\-|\^;
109  cmidchars={idchars}|{cmextrachars};  cmidchars={idchars}|{cmextrachars};
110  cmid={cmextrachars}+;  cmid={cmidchars}+;
111  ws=("\012"|[\t\ ]);  ws=("\012"|[\t\ ]);
112  eol=("\013\010"|"\013"|"\010");  eol=("\013\010"|"\013"|"\010");
113    neol=[^\013\010];
114  sym=[!%&$+/:<=>?@~|#*]|\-|\^|"\\";  sym=[!%&$+/:<=>?@~|#*]|\-|\^|"\\";
115  digit=[0-9];  digit=[0-9];
116  sharp="#";  sharp="#";
# Line 193  Line 206 
206                                     0),                                     0),
207                                yypos, yypos + size yytext));                                yypos, yypos + size yytext));
208    
209  <P>{id}                 => (Tokens.CM_ID (yytext, yypos, yypos + size yytext));  <P>{id}                 => (idToken (yytext, yypos, pp_ids, Tokens.CM_ID,
210                                         fn () => YYBEGIN PM));
211    
212  <M>({id}|{sym}+)        => (YYBEGIN INITIAL;  <M>({id}|{sym}+)        => (YYBEGIN INITIAL;
213                              Tokens.ML_ID (yytext, yypos, yypos + size yytext));                              Tokens.ML_ID (yytext, yypos, yypos + size yytext));
214  <PM>({id}|{sym}+)       => (YYBEGIN P;  <PM>({id}|{sym}+)       => (YYBEGIN P;
215                              Tokens.ML_ID (yytext, yypos, yypos + size yytext));                              Tokens.ML_ID (yytext, yypos, yypos + size yytext));
216    
217  <INITIAL>{eol}{sharp}{ws}*"if"   => (YYBEGIN P;  <INITIAL,P>{eol}{sharp}{ws}*"if" => (YYBEGIN P;
218                                       newline yypos;                                       newline yypos;
219                                       Tokens.IF (yypos, yypos + size yytext));                                       Tokens.IF (yypos, yypos + size yytext));
220  <INITIAL>{eol}{sharp}{ws}*"then" => (YYBEGIN P;  <INITIAL,P>{eol}{sharp}{ws}*"elif" => (YYBEGIN P;
                                      newline yypos;  
                                      Tokens.THEN (yypos, yypos + size yytext));  
 <INITIAL>{eol}{sharp}{ws}*"elif" => (YYBEGIN P;  
221                                       newline yypos;                                       newline yypos;
222                                       Tokens.ELIF (yypos, yypos + size yytext));                                       Tokens.ELIF (yypos, yypos + size yytext));
223  <INITIAL>{eol}{sharp}{ws}*"else" => (YYBEGIN P;  <INITIAL,P>{eol}{sharp}{ws}*"else" => (YYBEGIN P;
224                                       newline yypos;                                       newline yypos;
225                                       Tokens.ELSE (yypos, yypos + size yytext));                                       Tokens.ELSE (yypos, yypos + size yytext));
226  <INITIAL>{eol}{sharp}{ws}*"endif" => (YYBEGIN P;  <INITIAL,P>{eol}{sharp}{ws}*"endif" => (YYBEGIN P;
227                                        newline yypos;                                        newline yypos;
228                                        Tokens.ENDIF (yypos,                                        Tokens.ENDIF (yypos,
229                                                      yypos + size yytext));                                                      yypos + size yytext));
230  <INITIAL>{eol}{sharp}{ws}*"error" => (YYBEGIN ES; newline yypos;  <INITIAL,P>{eol}{sharp}{ws}*"error"{ws}+{neol}* => (newline yypos;
231                                        newS (yypos, "error"); continue ());                                                      errorTok (yytext, yypos));
 <ES>{ws}+               => (continue ());  
 <ES>{eol}               => (YYBEGIN INITIAL; newline yypos;  
                             getS (yypos, Tokens.ERROR));  
 <ES>.                   => (YYBEGIN E;  
                             addS (String.sub (yytext, 0)); continue ());  
 <E>{eol}                => (YYBEGIN INITIAL; newline yypos;  
                             getS (yypos, Tokens.ERROR));  
 <E>.                    => (addS (String.sub (yytext, 0)); continue ());  
   
232  <INITIAL,M,PM>{eol}     => (newline yypos; continue ());  <INITIAL,M,PM>{eol}     => (newline yypos; continue ());
233  <P>{eol}                => (YYBEGIN INITIAL; newline yypos; continue ());  <P>{eol}                => (YYBEGIN INITIAL; newline yypos; continue ());
234    
# Line 237  Line 239 
239                               yytext);                               yytext);
240                              continue ());                              continue ());
241    
242  <INITIAL>{cmid}         => (idToken (yytext, yypos));  <INITIAL>{cmid}         => (idToken (yytext, yypos, cm_ids,
243                                         Tokens.FILE_STANDARD,
244                                         fn () => YYBEGIN M));
245    
246    
247  <INITIAL>.              => (error (yypos, yypos+1)  <INITIAL>.              => (error (yypos, yypos+1)

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

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