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/MLRISC/Tools/Parser/mdl.lex
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/Tools/Parser/mdl.lex

Parent Directory Parent Directory | Revision Log Revision Log


Revision 744 - (view) (download)

1 : leunga 744 exception Error
2 :    
3 :     type pos = int
4 :     type svalue = Tokens.svalue
5 :     type ('a,'b) token = ('a,'b) Tokens.token
6 :     type lexresult = (svalue,pos) token
7 :     type lexarg = {srcMap : SourceMap.sourcemap,
8 :     err : pos * pos * string -> unit,
9 :     MDLmode : bool
10 :     }
11 :     type arg = lexarg
12 :    
13 :     open Tokens
14 :    
15 :     val commentLevel = ref 0
16 :     val metaLevel = ref 0
17 :    
18 :     val asmLQuote = ref "``"
19 :     val asmRQuote = ref "''"
20 :     val asmLMeta = ref "<"
21 :     val asmRMeta = ref ">"
22 :    
23 :     exception Error
24 :    
25 :     fun init() = (commentLevel := 0; metaLevel := 0;
26 :     asmLQuote := "``"; asmRQuote := "''";
27 :     asmLMeta := "<"; asmRMeta := ">"
28 :     )
29 :    
30 :     fun eof{srcMap,err,MDLmode} =
31 :     let val pos = SourceMap.currPos srcMap
32 :     in EOF(pos,pos) end
33 :     fun debug _ = ()
34 :    
35 :     fun check(err,_,_,SOME w) = w
36 :     | check(err,pos,s,NONE) =
37 :     (err(pos,pos+size s,"bad literal "^s); raise Error)
38 :    
39 :     fun strip k s = String.substring(s,k,String.size s - k)
40 :     fun scan err fmt (s,s') tok pos =
41 :     tok(check(err,pos,s,StringCvt.scanString fmt s'),
42 :     pos,pos + size s)
43 :     handle _ => ID(s,pos,pos)
44 :    
45 :     fun wdecimal(err,s,pos) =
46 :     scan err (Word32.scan StringCvt.DEC) (s,strip 2 s) WORD pos
47 :     fun whex(err,s,pos) =
48 :     scan err (Word32.scan StringCvt.HEX) (s,strip 3 s) WORD pos
49 :     fun woctal(err,s,pos) = scan err (Word32.scan StringCvt.OCT) (s,strip 3 s) WORD pos
50 :     fun wbinary(err,s,pos) = scan err (Word32.scan StringCvt.BIN) (s,strip 3 s) WORD pos
51 :     fun decimal(err,s,pos) = scan err (Int.scan StringCvt.DEC) (s,s) INT pos
52 :     fun hex(err,s,pos) = scan err (Int.scan StringCvt.HEX) (s,strip 2 s) INT pos
53 :     fun octal(err,s,pos) = scan err (Int.scan StringCvt.OCT) (s,strip 2 s) INT pos
54 :     fun binary(err,s,pos) = scan err (Int.scan StringCvt.BIN) (s,strip 2 s) INT pos
55 :    
56 :     fun string(err,s,pos) =
57 :     STRING(
58 :     check(err,pos,s,String.fromString(String.substring(s,1,String.size s-2))),
59 :     pos, pos + size s)
60 :     fun char(err,s,pos) =
61 :     CHAR(check(err,pos,s,Char.fromString(String.substring(s,2,String.size s-3))),
62 :     pos,pos + size s)
63 :     fun asmtext(err,s,pos) =
64 :     ASMTEXT(check(err,pos,s,String.fromString s),pos,pos + size s)
65 :    
66 :     infix $$
67 :     fun x $$ y = y :: x
68 :    
69 :     exception NotFound
70 :    
71 :     val keywords = HashTable.mkTable (HashString.hashString,op =) (13,NotFound)
72 :     : (string,int * int -> (svalue,int) token) HashTable.hash_table
73 :     val MDLkeywords = HashTable.mkTable (HashString.hashString,op =) (13,NotFound)
74 :     : (string,int * int -> (svalue,int) token) HashTable.hash_table
75 :     val symbols = HashTable.mkTable (HashString.hashString,op =) (13,NotFound)
76 :     : (string,int * int -> (svalue,int) token) HashTable.hash_table
77 :    
78 :     val _ = app (HashTable.insert keywords)
79 :     ( nil $$
80 :     ("_",WILD) $$
81 :     ("datatype", DATATYPE) $$
82 :     ("type", TYPE) $$
83 :     ("end", END) $$
84 :     ("fun", FUN) $$
85 :     ("fn", FN) $$
86 :     ("val", VAL) $$
87 :     ("raise", RAISE) $$
88 :     ("handle", HANDLE) $$
89 :     ("let", LET) $$
90 :     ("local", LOCAL) $$
91 :     ("structure", STRUCTURE) $$
92 :     ("signature", SIGNATURE) $$
93 :     ("functor", FUNCTOR) $$
94 :     ("sig", SIG) $$
95 :     ("struct", STRUCT) $$
96 :     ("sharing", SHARING) $$
97 :     ("where", WHERE) $$
98 :     ("withtype", WITHTYPE) $$
99 :     ("if", IF) $$
100 :     ("then", THEN) $$
101 :     ("else", ELSE) $$
102 :     ("in", IN) $$
103 :     ("true", TRUE) $$
104 :     ("false", FALSE) $$
105 :     ("and", AND) $$
106 :     ("at", AT) $$
107 :     ("of", OF) $$
108 :     ("case", CASE) $$
109 :     ("as", AS) $$
110 :     ("open", OPEN) $$
111 :     ("include", INCLUDE) $$
112 :     ("infix", INFIX) $$
113 :     ("infixr", INFIXR) $$
114 :     ("nonfix", NONFIX) $$
115 :     ("not", NOT)
116 :     )
117 :    
118 :     val _ = app (HashTable.insert MDLkeywords)
119 :     ( nil $$
120 :     ("architecture", ARCHITECTURE) $$
121 :     ("assembly", ASSEMBLY) $$
122 :     ("storage", STORAGE) $$
123 :     ("locations", LOCATIONS) $$
124 :     ("equation", EQUATION) $$
125 :     ("at", AT) $$
126 :     ("vliw", VLIW) $$
127 :     ("field", FIELD) $$
128 :     ("fields", FIELDS) $$
129 :     ("signed", SIGNED) $$
130 :     ("unsigned", UNSIGNED) $$
131 :     ("superscalar", SUPERSCALAR) $$
132 :     ("bits", BITS) $$
133 :     ("ordering", ORDERING) $$
134 :     ("little", LITTLE) $$
135 :     ("big", BIG) $$
136 :     ("endian", ENDIAN) $$
137 :     ("register", REGISTER) $$
138 :     ("as", AS) $$
139 :     ("cell", CELL) $$
140 :     ("cells", CELLS) $$
141 :     ("cellset", CELLSET) $$
142 :     ("pipeline", PIPELINE) $$
143 :     ("cpu", CPU) $$
144 :     ("resource", RESOURCE) $$
145 :     ("reservation", RESERVATION) $$
146 :     ("table", TABLE) $$
147 :     ("latency", LATENCY) $$
148 :     ("predicated", PREDICATED) $$
149 :     ("instruction", INSTRUCTION) $$
150 :     ("formats", FORMATS) $$
151 :     ("uppercase", UPPERCASE) $$
152 :     ("lowercase", LOWERCASE) $$
153 :     ("verbatim", VERBATIM) $$
154 :     ("span", SPAN) $$
155 :     ("dependent", DEPENDENT) $$
156 :     ("always", ALWAYS) $$
157 :     ("never", NEVER) $$
158 :     ("delayslot", DELAYSLOT) $$
159 :     (* ("branching", BRANCHING) $$ *)
160 :     ("candidate", CANDIDATE) $$
161 :     ("rtl", RTL) $$
162 :     ("debug", DEBUG) $$
163 :     ("aliasing", ALIASING) $$
164 :     ("aggregable",AGGREGABLE)
165 :     )
166 :    
167 :     val _ = app (HashTable.insert symbols)
168 :     (
169 :     nil $$
170 :     ("=", EQ) $$
171 :     ("*", TIMES) $$
172 :     (":", COLON) $$
173 :     (".", DOT) $$
174 :     ("..", DOTDOT) $$
175 :     ("...", DOTDOT) $$
176 :     ("|", BAR) $$
177 :     ("->", ARROW) $$
178 :     ("=>", DARROW) $$
179 :     ("#", HASH) $$
180 :     ("!", DEREF) $$
181 :     ("^^", CONCAT)
182 :     )
183 :    
184 :     fun lookup(MDLmode,s,yypos) =
185 :     let val l = String.size s
186 :     fun id() = ID(Symbol.toString(Symbol.fromString s), yypos, yypos + l)
187 :     in HashTable.lookup keywords s (yypos,yypos + l)
188 :     handle _ =>
189 :     (if MDLmode then
190 :     (HashTable.lookup MDLkeywords s (yypos,yypos + l) handle _ => id())
191 :     else id()
192 :     )
193 :     end
194 :    
195 :     fun lookupSym(s,yypos) =
196 :     let val l = String.size s
197 :     in HashTable.lookup symbols s (yypos,yypos + l)
198 :     handle _ => SYMBOL(Symbol.toString(Symbol.fromString s), yypos, yypos + l)
199 :     end
200 :    
201 :     %%
202 :    
203 :     %header (functor MDLLexFun(Tokens : MDL_TOKENS));
204 :     %arg ({srcMap,err,MDLmode});
205 :    
206 :     alpha=[A-Za-z];
207 :     digit=[0-9];
208 :     id=[A-Za-z_][A-Za-z0-9_\']*;
209 :     tyvar=\'{id};
210 :     decimal={digit}+;
211 :     integer=-?{decimal};
212 :     octal=0[0-7]+;
213 :     hex=0x[0-9a-fA-F]+;
214 :     binary=0b[0-1]+;
215 :     wdecimal=0w{digit}+;
216 :     woctal=0w0[0-7]+;
217 :     whex=0wx[0-9a-fA-F]+;
218 :     wbinary=0wb[0-1]+;
219 :     ws=[\ \t];
220 :     string=\"([^\\\n\t"]|\\.)*\";
221 :     char=#\"([^\\\n\t"]|\\.)*\";
222 :     sym1=(\-|[=\.+~/*:!@#$%^&*|?])+;
223 :     sym2=`+|'+|\<+|\>+|\=\>|~\>\>;
224 :     asmsymbol={sym1}|{sym2};
225 :     symbol=(\-|[=\.+~/*:!@#$%^&*|?<>])+|``|'';
226 :     asmtext=([^\n\t<>']+|');
227 :    
228 :     %s COMMENT ASM ASMQUOTE;
229 :    
230 :     %%
231 :     <INITIAL,COMMENT,ASM>\n => (SourceMap.newline srcMap yypos; continue());
232 :     <INITIAL,COMMENT,ASM>{ws} => (continue());
233 :     <ASMQUOTE>\n => (err(yypos,yypos+size yytext,
234 :     "newline in assembly text!"); continue());
235 :     <INITIAL>\-\-.*\n => (continue());
236 :     <INITIAL>"(*" => (commentLevel := 1; YYBEGIN COMMENT; continue());
237 :     <INITIAL,ASM>{decimal} => (decimal(err,yytext,yypos));
238 :     <INITIAL,ASM>{hex} => (hex(err,yytext,yypos));
239 :     <INITIAL,ASM>{octal} => (octal(err,yytext,yypos));
240 :     <INITIAL,ASM>{binary} => (binary(err,yytext,yypos));
241 :     <INITIAL,ASM>{wdecimal} => (wdecimal(err,yytext,yypos));
242 :     <INITIAL,ASM>{whex} => (whex(err,yytext,yypos));
243 :     <INITIAL,ASM>{woctal} => (woctal(err,yytext,yypos));
244 :     <INITIAL,ASM>{wbinary} => (wbinary(err,yytext,yypos));
245 :     <INITIAL,ASM>{string} => (string(err,yytext,yypos));
246 :     <INITIAL,ASM>{char} => (char(err,yytext,yypos));
247 :     <INITIAL,ASM>"$" => (if MDLmode then DOLLAR(yypos,yypos+1)
248 :     else SYMBOL("$",yypos,yypos+1));
249 :     <INITIAL,ASM>"asm:" => (ASM_COLON(yypos,yypos + size yytext));
250 :     <INITIAL,ASM>"mc:" => (MC_COLON(yypos,yypos + size yytext));
251 :     <INITIAL,ASM>"rtl:" => (RTL_COLON(yypos,yypos + size yytext));
252 :     <INITIAL,ASM>"delayslot:" => (DELAYSLOT_COLON(yypos,size yytext));
253 :     <INITIAL,ASM>"padding:" => (PADDING_COLON(yypos,size yytext));
254 :     <INITIAL,ASM>"nullified:" => (NULLIFIED_COLON(yypos,size yytext));
255 :     <INITIAL,ASM>"candidate:" => (CANDIDATE_COLON(yypos,size yytext));
256 :     <INITIAL,ASM>{id} => (lookup(MDLmode,yytext,yypos));
257 :     <INITIAL,ASM>{tyvar} => (TYVAR(yytext,yypos,yypos + size yytext));
258 :     <INITIAL,ASM>"(" => (LPAREN(yypos,yypos+1));
259 :     <INITIAL,ASM>")" => (RPAREN(yypos,yypos+1));
260 :     <INITIAL,ASM>"[" => (LBRACKET(yypos,yypos+1));
261 :     <INITIAL,ASM>"]" => (RBRACKET(yypos,yypos+1));
262 :     <INITIAL,ASM>"{" => (LBRACE(yypos,yypos+1));
263 :     <INITIAL,ASM>"}" => (RBRACE(yypos,yypos+1));
264 :     <INITIAL,ASM>"," => (COMMA(yypos,yypos+1));
265 :     <INITIAL,ASM>";" => (SEMICOLON(yypos,yypos+1));
266 :    
267 :     <INITIAL>{symbol} => (if yytext = !asmLQuote then
268 :     (debug("lquote "^yytext^"\n");
269 :     YYBEGIN ASMQUOTE;
270 :     LDQUOTE(yypos,yypos+size yytext))
271 :     else
272 :     lookupSym(yytext,yypos));
273 :     <ASMQUOTE>{asmsymbol} => (if yytext = !asmRQuote then
274 :     (if !metaLevel <> 0 then
275 :     err(yypos,yypos+size yytext,
276 :     "Mismatch between "^(!asmLMeta)^
277 :     " and "^(!asmRMeta)) else ();
278 :     debug("rquote "^yytext^"\n");
279 :     YYBEGIN INITIAL;
280 :     RDQUOTE(yypos,yypos+size yytext))
281 :     else if yytext = !asmLMeta then
282 :     (metaLevel := !metaLevel + 1;
283 :     debug("lmeta "^yytext^"\n");
284 :     YYBEGIN ASM; LMETA(yypos,yypos+size yytext))
285 :     else
286 :     asmtext(err,yytext,yypos));
287 :     <ASM>{asmsymbol} => (if yytext = !asmRMeta then
288 :     (metaLevel := !metaLevel - 1;
289 :     debug("rmeta "^yytext^"("^Int.toString(!metaLevel)^")\n");
290 :     if !metaLevel = 0 then YYBEGIN ASMQUOTE
291 :     else (); RMETA(yypos,yypos+size yytext))
292 :     else
293 :     lookupSym(yytext,yypos));
294 :     <ASMQUOTE>{asmtext} => (debug("text="^yytext^"\n");
295 :     asmtext(err,yytext,yypos));
296 :     <COMMENT>"*)" => (commentLevel := !commentLevel - 1;
297 :     if !commentLevel = 0 then YYBEGIN INITIAL else ();
298 :     continue());
299 :     <COMMENT>"(*" => (commentLevel := !commentLevel + 1; continue());
300 :     <COMMENT>. => (continue());
301 :     . => (err(yypos,yypos+size yytext,
302 :     "unknown character "^String.toString yytext);
303 :     continue());

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