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/branches/idlbasis-devel/src/MLRISC/Tools/Parser/mdl.grm
ViewVC logotype

Annotation of /sml/branches/idlbasis-devel/src/MLRISC/Tools/Parser/mdl.grm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 775 - (view) (download)
Original Path: sml/trunk/src/MLRISC/Tools/Parser/mdl.grm

1 : leunga 744 (* There are 30 shift/reduce errors *)
2 :    
3 :     structure Ast = AstPP.Ast
4 :     structure Prec = PrecedenceParser
5 :     open Ast
6 :    
7 :     val precStacks= ref [] : PrecedenceParser.precedence_stack list ref
8 :     fun newScope precStack = precStacks := !precStack :: !precStacks
9 :     fun oldScope precStack =
10 :     case !precStacks of
11 :     h::t => (precStacks := t; precStack := h)
12 :    
13 :     fun Infix precStack (p,[]) = ()
14 :     | Infix precStack (p,id::ids) =
15 :     (precStack := Prec.declare(!precStack,id,Prec.INFIX p);
16 :     Infix precStack (p,ids))
17 :    
18 :     fun Infixr precStack (p,[]) = ()
19 :     | Infixr precStack (p,id::ids) =
20 :     (precStack := Prec.declare(!precStack,id,Prec.INFIXR p);
21 :     Infixr precStack (p,ids))
22 :    
23 :     fun Nonfix precStack ([]) = ()
24 :     | Nonfix precStack (id::ids) =
25 :     (precStack := Prec.declare(!precStack,id,Prec.NONFIX);
26 :     Nonfix precStack (ids))
27 :    
28 :     fun p2s p = PP.text(AstPP.pat p)
29 :     fun e2s e = PP.text(AstPP.exp e)
30 :     fun ps2s ps = PP.text(PP.concat(map AstPP.pat ps))
31 :    
32 : leunga 775 fun BOOLexp b = LITexp(BOOLlit b)
33 :    
34 : leunga 744 fun precErr err loc msg = err(loc,msg)
35 :    
36 :     fun parseExp precStack err loc toks =
37 :     Prec.parse{error=precErr err loc,app=APPexp,tuple=TUPLEexp,
38 :     id=fn id => IDexp(IDENT([],id)),stack= !precStack,
39 :     toString=e2s, kind="expression"} toks
40 :    
41 :     fun parsePat precStack err loc toks =
42 :     let fun appPat (IDpat id,p) = CONSpat(IDENT([],id),SOME p)
43 :     | appPat (CONSpat(id,NONE),p) = CONSpat(id,SOME p)
44 :     | appPat (p1,p2) = (err(loc,"pattern "^p2s p1^" "^p2s p2); p1)
45 : leunga 775 in case Prec.parse{error=precErr err loc,app=appPat,tuple=TUPLEpat,
46 : leunga 744 id=IDpat, stack= !precStack, kind="pattern",
47 : leunga 775 toString=p2s} toks of
48 :     CONSpat(IDENT([],"not"),SOME p) => NOTpat p
49 :     | p => p
50 : leunga 744 end
51 :    
52 :     fun parseFunPat precStack err loc toks =
53 :     let fun pr(SOME f,ps) = f^" "^ps2s ps
54 :     | pr(NONE, ps) = ps2s ps
55 :     fun appPat ((f,ps), (NONE,ps')) = (f, ps@ps')
56 :     | appPat ((f,ps), (SOME g,ps')) = (f, ps@[IDpat g]@ps')
57 :     (*| appPat (p1,p2) = (err(loc,"fun pattern ("^pr p1^") "^pr p2); p1)*)
58 :     fun lower(NONE,[p]) = p
59 :     | lower(SOME f,[]) = IDpat f
60 :     fun tuple ps = (NONE,[TUPLEpat(map lower ps)])
61 :     fun id n = (SOME n,[])
62 :     fun toString(NONE,ps) = ps2s ps
63 :     | toString(SOME f,ps) = f^" "^ps2s ps
64 :     in Prec.parse{error=precErr err loc,
65 :     app=appPat,
66 :     tuple=tuple,
67 :     id=id,
68 :     stack= !precStack,
69 :     kind="function argument",
70 :     toString=toString
71 :     } (map (fn Prec.EXP p => Prec.EXP(NONE,[p])
72 :     | Prec.ID id => Prec.ID id
73 :     ) toks)
74 :     end
75 :    
76 :    
77 :     fun markdecl srcMap (decl,left,right) =
78 :     MARKdecl(SourceMap.location srcMap (left,right), decl)
79 :     fun markexp srcMap (exp,left,right) =
80 :     MARKexp(SourceMap.location srcMap (left,right), exp)
81 :    
82 :     exception Bad
83 :    
84 :     fun enumPat(err, loc, id, ps) =
85 :     map (fn IDpat x => IDpat(id^x)
86 :     | p => (err(loc,"bad pattern "^PP.text(AstPP.pat p)); p)
87 :     ) ps
88 :     fun enumPat'(err, loc, ps, id) =
89 :     map (fn IDpat x => IDpat(x^id)
90 :     | p => (err(loc,"bad pattern "^PP.text(AstPP.pat p)); p)
91 :     ) ps
92 :    
93 :     fun enumExp(err, loc, id, es) =
94 :     map (fn IDexp(IDENT([],x)) => IDexp(IDENT([],id^x))
95 :     | e => (err(loc,"bad expression "^PP.text(AstPP.exp e)); e)
96 :     ) es
97 :     fun enumExp'(err, loc, es, id) =
98 :     map (fn IDexp(IDENT([],x)) => IDexp(IDENT([],x^id))
99 :     | e => (err(loc,"bad expression "^PP.text(AstPP.exp e)); e)
100 :     ) es
101 :    
102 : leunga 775 fun clause(pats, guard, NONE, e) = CLAUSE(pats, guard, e)
103 :     | clause(pats, guard, SOME x, e) = CLAUSE(pats, guard, CONTexp(e, x))
104 :    
105 : leunga 744 %%
106 :     %header (functor MDLParser(structure Token : TOKEN
107 :     structure AstPP : MDL_AST_PRETTY_PRINTER
108 :     )
109 :     )
110 :    
111 :     %arg (srcMap,err,import,precStack,extraCells)
112 :     : SourceMap.sourcemap * (SourceMap.location * string -> unit) *
113 :     (SourceMap.location * string -> decl list) *
114 :     PrecedenceParser.precedence_stack ref *
115 :     Ast.storagedecl list
116 :     %name MDL
117 :     %term ARCHITECTURE | END | LOCAL | IN | OF | CASE | DATATYPE |
118 :     TYPE | EQ | DOLLAR | TIMES | AND | DEREF | NOT | CONCAT |
119 :     LLBRACKET | RRBRACKET |
120 :     LPAREN | RPAREN | LBRACKET | RBRACKET | LBRACE | RBRACE | SEMICOLON |
121 :     LDQUOTE | RDQUOTE | LMETA | RMETA |
122 :     CELLSET | FN | STORAGE | LOCATIONS | HASH |
123 :     COMMA | COLON | DOT | DOTDOT | AT | BAR | ARROW | DARROW | PAR | BITS |
124 :     IF | THEN | ELSE | TRUE | FALSE | WILD | RAISE |
125 :     HANDLE | LET | STRUCTURE | FUNCTOR | SIGNATURE | SIG | STRUCT | WHERE |
126 :     SHARING | INSTRUCTION | REGISTER | CELL | CELLS | ORDERING |
127 :     FIELD | FIELDS | VLIW | SUPERSCALAR | SIGNED | UNSIGNED |
128 : leunga 775 FORMATS | AS | ENCODING | WITHTYPE | FUN | VAL | INCLUDE | OPEN | OP |
129 : leunga 744 LITTLE | BIG | ENDIAN | PIPELINE | PREDICATED |
130 :     LOWERCASE | UPPERCASE | VERBATIM | WHEN | BRANCHING | TAKEN |
131 :     ASSEMBLY | RTL | SPAN | DEPENDENT | ASSIGN | DELAYSLOT |
132 :     FORWARDS | ALWAYS | NEVER | BACKWARDS |
133 :     CANDIDATE | NONFIX | INFIX | INFIXR | DEBUG |
134 :     ASM_COLON | MC_COLON | RTL_COLON | DELAYSLOT_COLON | NULLIFIED_COLON |
135 :     PADDING_COLON | CANDIDATE_COLON | AGGREGABLE | ALIASING |
136 :     RESOURCE | CPU | RESERVATION | TABLE | LATENCY | EQUATION |
137 : leunga 775 EXCEPTION |
138 : leunga 744 ID of string |
139 :     SYMBOL of string |
140 :     TYVAR of string |
141 :     WORD of Word32.word |
142 :     INT of int |
143 : leunga 775 INTINF of IntInf.int |
144 :     REAL of string |
145 : leunga 744 STRING of string |
146 :     CHAR of char |
147 :     ASMTEXT of string |
148 :     EOF
149 :    
150 :     %nonterm architecture of decl list |
151 :     structexp of structexp |
152 :     opt_of of unit |
153 :     id of id |
154 :     sym of id |
155 :     symb of id |
156 :     ident of ident |
157 :     ident2 of ident |
158 :     tid of id |
159 :     tid2 of id |
160 :     tident of ident |
161 :     tpath of id list * id |
162 :     idents of ident list |
163 :     syms of id list |
164 :     path of id list |
165 :     decls of decl list |
166 :     scopeddecls of decl list |
167 :     functorarg of decl list |
168 :     scopedmldecls of decl list |
169 :     newScope of unit |
170 :     oldScope of unit |
171 :     mldecls of decl list |
172 : leunga 775 exceptionbind of exceptionbind |
173 :     exceptionbinds of exceptionbind list |
174 : leunga 744 decl of decl |
175 :     locdecl of loc * decl |
176 :     loc of loc |
177 :     mldecl of decl |
178 :     mymldecl of decl |
179 :     mddecl of decl |
180 :     mymddecl of decl |
181 :     sharingdecl of share |
182 :     sharingdecls of share list |
183 :     sharelist of ident list |
184 :     aexp of exp |
185 :     aexp2 of exp Prec.token |
186 :     appexp of exp Prec.token list |
187 :     exp of exp |
188 :     guard of exp option |
189 :     funguard of exp option |
190 : leunga 775 cont of id option |
191 : leunga 744 region of id option |
192 :     opt_exp of exp option |
193 :     exps of exp list |
194 :     exps1 of exp list |
195 :     exps2 of exp list |
196 :     expseq of exp list |
197 :     expseq2 of exp list |
198 :     labexps0 of (id * exp) list |
199 :     labexps of (id * exp) list |
200 :     labexp of id * exp |
201 :     apat of pat |
202 :     asapat of pat |
203 :     apat2 of pat Prec.token |
204 :     apppat of pat Prec.token list |
205 :     pat of pat |
206 :     pats of pat list |
207 :     pats1 of pat list |
208 :     pats2 of pat list |
209 :     orpats2 of pat list |
210 : leunga 775 andpats2 of pat list |
211 : leunga 744 labpat of id * pat |
212 :     labpats0 of (id * pat) list * bool |
213 :     labpats of (id * pat) list * bool|
214 :     of_ty of ty option |
215 :     ty of ty |
216 :     aty of ty |
217 :     appty of ty |
218 :     tys2 of ty list |
219 :     labty of id * ty |
220 :     labtys of (id * ty) list |
221 :     labtys1 of (id * ty) list |
222 :     tuplety of ty list |
223 :     signedness of signedness |
224 :     word of Word32.word |
225 :     unsignedint of Word32.word |
226 :     unsignedint_opt of Word32.word option |
227 :     width of width |
228 :     int of int |
229 : leunga 775 intopt of int |
230 :     intinf of IntInf.int |
231 :     real of string |
232 : leunga 744 endianess of endianess |
233 :     kind of archKind |
234 :     string of string |
235 :     char of char |
236 :     bool of bool |
237 : leunga 775 literal of literal |
238 : leunga 744 slice of int * int |
239 :     slices of (int * int) list |
240 :     storagedecl of storagedecl |
241 :     aliasing of id option |
242 :     printcell of exp |
243 :     storagedecls of storagedecl list |
244 :     cellcount of int option |
245 :     locbind of locbind |
246 :     locbinds of locbind list |
247 :     field of field |
248 :     fieldid of id |
249 :     cnv of cnv |
250 :     fields of field list |
251 :     formatbind of formatbind |
252 :     formatbinds of formatbind list |
253 :     datatypebinds of datatypebind list |
254 :     datatypebind of datatypebind |
255 :     consbinds of consbind list |
256 :     consbind of consbind |
257 :     consencoding of mc option |
258 :     sdi of exp option |
259 :     latency of exp option |
260 :     pipeline of exp option |
261 :     nop of flag |
262 :     flag of flag |
263 :     flagguard of exp |
264 :     nullified of flag |
265 :     delayslot of exp option |
266 :     delayslotcandidate of exp option |
267 :     delay of delayslot |
268 :     branching of branching |
269 :     consassembly of assembly option |
270 :     typebinds of typebind list |
271 :     withtypeclause of typebind list |
272 :     typebind of typebind |
273 :     tyvar of tyvar |
274 :     tyvars of tyvar list |
275 :     tyvarseq of tyvar list |
276 :     clause of clause |
277 :     clauses of clause list |
278 :     funclause of id * clause |
279 :     funclauses of id * clause list |
280 :     funbind of funbind |
281 :     funbinds of funbind list |
282 :     valbind of valbind |
283 :     valbinds of valbind list |
284 :     assemblycase of assemblycase |
285 :     rtl of exp option |
286 :     rtlterm of rtlterm |
287 :     rtlterms of rtlterm list |
288 :     opcodeencoding of int list option |
289 :     encodingexp of int list |
290 :     encodingexps of int list |
291 :     fieldty of id option |
292 :     asms of asm list |
293 :     asm of asm |
294 :     hasasm of bool |
295 :     sigsub of sigexp -> sigexp |
296 :     sigsubs of sigexp -> sigexp |
297 :     sigexp of sigexp |
298 :     True of unit |
299 :     False of unit |
300 :     default of int * exp |
301 :     default_list of (int * exp) list |
302 :     defaults of (int * exp) list |
303 :     aggregable of bool |
304 :     bitSize of int * bool |
305 :     resourcebinds of id list |
306 :     cpubinds of cpubind list |
307 :     cpubind of cpubind |
308 :     aliases of string list |
309 :     resources of (int * id) list |
310 :     resource of (int * id) |
311 :     pipelinebinds of pipelinebind list |
312 :     pipelinebind of pipelinebind |
313 :     pipelineclauses of (id * pat * pipelineexp) list |
314 :     pipelineclause of (id * pat * pipelineexp) |
315 :     cycles0 of cycle list |
316 :     cycles of cycle list |
317 :     cycle of cycle |
318 :     latencybinds of latencybind list |
319 :     latencybind of latencybind |
320 :     latencyclauses of (id * pat * exp) list |
321 : leunga 775 latencyclause of (id * pat * exp) |
322 :     optsemi of unit
323 : leunga 744
324 : leunga 775
325 : leunga 744 %verbose
326 :     %nodefault
327 :     %pos int
328 :     %eop EOF
329 :    
330 :     %left DARROW
331 :     %left IF THEN ELSE RAISE HANDLE CASE FN OF SEMICOLON COMMA
332 :     %left DOT
333 :     %left EQ
334 :     %right ARROW
335 :     %left AT
336 :     %left TIMES
337 :     %left DEREF NOT
338 :     (* %left BITS CELL *)
339 :     (* %left BAR
340 :     %left AND*)
341 :    
342 :     (*%left DARROW *)
343 :    
344 :     %%
345 :    
346 :     architecture: decls (decls)
347 :    
348 :     decls: ([])
349 :     | decl decls (decl::decls)
350 :    
351 :     mldecls: ([])
352 :     | mldecl mldecls (mldecl::mldecls)
353 :    
354 : leunga 775 optsemi: ()
355 :     | SEMICOLON optsemi ()
356 :    
357 :     decl: mldecl optsemi (mldecl)
358 :     | mddecl optsemi (mddecl)
359 :     | INCLUDE string optsemi
360 : leunga 744 (SEQdecl(import
361 :     (SourceMap.location srcMap
362 :     (INCLUDEleft,stringright), string)))
363 :    
364 :     mldecl: mymldecl (markdecl srcMap (mymldecl,mymldeclleft,mymldeclright))
365 :    
366 :     mddecl: mymddecl (markdecl srcMap (mymddecl,mymddeclleft,mymddeclright))
367 :    
368 :     mymddecl: ARCHITECTURE id EQ STRUCT decls END (ARCHdecl(id,decls))
369 :     | LITTLE ENDIAN (ENDIANESSdecl LITTLE)
370 :     | BIG ENDIAN (ENDIANESSdecl BIG)
371 :     | VLIW (ARCHKINDdecl VLIW)
372 :     | SUPERSCALAR (ARCHKINDdecl SUPERSCALAR)
373 :     | assemblycase ASSEMBLY (ASSEMBLYCASEdecl assemblycase)
374 :     | INSTRUCTION FORMATS int BITS formatbinds
375 :     (FORMATdecl(SOME int,formatbinds))
376 :     | INSTRUCTION FORMATS formatbinds
377 :     (FORMATdecl(NONE,formatbinds))
378 :     | STORAGE storagedecls
379 :     (STORAGEdecl(storagedecls @ extraCells))
380 :     | LOCATIONS locbinds (LOCATIONSdecl locbinds)
381 :     | INSTRUCTION consbinds (INSTRUCTIONdecl consbinds)
382 :     | DEBUG id (DEBUGdecl id)
383 :     | RESOURCE resourcebinds (RESOURCEdecl resourcebinds)
384 :     | CPU cpubinds (CPUdecl cpubinds)
385 :     | PIPELINE pipelinebinds (PIPELINEdecl pipelinebinds)
386 :     | LATENCY latencybinds (LATENCYdecl latencybinds)
387 :    
388 :     resourcebinds: id ([id])
389 :     | id AND resourcebinds (id::resourcebinds)
390 :    
391 :     cpubinds: cpubind ([cpubind])
392 :     | cpubind AND cpubinds (cpubind::cpubinds)
393 :    
394 :     cpubind: id aliases int LBRACKET resources RBRACKET
395 :     (CPUbind{name=id,aliases=aliases,
396 :     maxIssues=int,resources=resources})
397 :    
398 :     aliases: ([])
399 :     | string aliases (string::aliases)
400 :    
401 :     resources: resource ([resource])
402 :     | resource COMMA resources (resource::resources)
403 :    
404 :     resource: int id (int,id)
405 :     | id (1,id)
406 :    
407 :     pipelinebinds: pipelinebind ([pipelinebind])
408 :     | pipelinebind AND pipelinebinds (pipelinebind::pipelinebinds)
409 :    
410 :     pipelinebind: pipelineclauses
411 :     (let val name = #1(hd pipelineclauses)
412 :     val clauses = map (fn (_,x,y) => (x,y)) pipelineclauses
413 :     in (PIPELINEbind(name, clauses)) end
414 :     )
415 :    
416 :     pipelineclauses: pipelineclause ([pipelineclause])
417 :     | pipelineclause BAR pipelineclauses
418 :     (pipelineclause::pipelineclauses)
419 :    
420 :     pipelineclause: id pat EQ LBRACKET cycles0 RBRACKET (id, pat,PIPELINE cycles0)
421 :    
422 :     cycles0: ([])
423 :     | cycles (cycles)
424 :    
425 :     cycles: cycle ([cycle])
426 :     | cycle COMMA cycles (cycle::cycles)
427 :    
428 :     cycle: id (IDcycle id)
429 :     | cycle CONCAT cycle (ORcycle(cycle1,cycle2))
430 :     | cycle TIMES int (REPEATcycle(cycle, int))
431 :     | LPAREN cycle RPAREN (cycle)
432 :    
433 :     latencybinds: latencybind ([latencybind])
434 :     | latencybind AND latencybinds (latencybind::latencybinds)
435 :    
436 :     latencybind: latencyclauses
437 :     (let val name = #1(hd latencyclauses)
438 :     val clauses = map (fn (_,x,y) => (x,y)) latencyclauses
439 :     in (LATENCYbind(name, clauses)) end
440 :     )
441 :    
442 :     latencyclauses: latencyclause ([latencyclause])
443 :     | latencyclause BAR latencyclauses
444 :     (latencyclause::latencyclauses)
445 :    
446 :     latencyclause: id pat EQ exp (id, pat, exp)
447 :    
448 :     mymldecl: DATATYPE datatypebinds withtypeclause
449 :     (DATATYPEdecl(datatypebinds,withtypeclause))
450 :     | TYPE typebinds (DATATYPEdecl([],typebinds))
451 :     | FUN funbinds (FUNdecl(funbinds))
452 :     | RTL id LBRACE labpats0 RBRACE EQ exp
453 :     (RTLdecl(IDpat id,LAMBDAexp
454 :     [CLAUSE([RECORDpat labpats0],NONE,exp)],
455 :     SourceMap.location srcMap (RTLleft, expright)))
456 :     | RTL asapat EQ exp
457 :     (RTLdecl(asapat,exp,
458 :     SourceMap.location srcMap (RTLleft,expright)))
459 :     | RTL syms COLON ty (RTLSIGdecl(syms,ty))
460 :     | VAL valbinds (VALdecl(valbinds))
461 :     | VAL syms COLON ty (VALSIGdecl(syms,ty))
462 :     | TYPE tyvarseq tid (TYPESIGdecl(tid,tyvarseq))
463 :     | LOCAL scopeddecls IN scopeddecls END
464 :     (LOCALdecl(scopeddecls1,scopeddecls2))
465 :     | STRUCTURE id EQ structexp (STRUCTUREdecl(id,[],NONE,structexp))
466 :     | STRUCTURE id COLON sigexp EQ structexp
467 :     (STRUCTUREdecl(id,[],SOME sigexp,structexp))
468 :     | STRUCTURE id COLON sigexp (STRUCTURESIGdecl(id,sigexp))
469 :     | SIGNATURE id EQ sigexp (SIGNATUREdecl(id,sigexp))
470 :     | FUNCTOR id LPAREN functorarg RPAREN EQ structexp
471 :     (STRUCTUREdecl(id,functorarg,NONE,structexp))
472 :     | FUNCTOR id LPAREN functorarg RPAREN COLON sigexp EQ structexp
473 :     (STRUCTUREdecl(id,functorarg,SOME sigexp,structexp))
474 : leunga 775 | FUNCTOR id EQ structexp (FUNCTORdecl(id,[],NONE,structexp))
475 : leunga 744 | SHARING sharingdecls (SHARINGdecl sharingdecls)
476 : leunga 775 | INFIX intopt syms (Infix precStack (intopt,syms); INFIXdecl(intopt,syms))
477 :     | INFIXR intopt syms (Infixr precStack (intopt,syms); INFIXRdecl(intopt,syms))
478 : leunga 744 | NONFIX syms (Nonfix precStack (syms); NONFIXdecl(syms))
479 :     | OPEN idents (OPENdecl(idents))
480 : leunga 775 | INCLUDE sigexp (INCLUDESIGdecl sigexp)
481 :     | EXCEPTION exceptionbinds (EXCEPTIONdecl exceptionbinds)
482 : leunga 744
483 : leunga 775 exceptionbinds: exceptionbind ([exceptionbind])
484 :     | exceptionbind AND exceptionbinds (exceptionbind::exceptionbinds)
485 : leunga 744
486 : leunga 775 exceptionbind: id (EXCEPTIONbind(id,NONE))
487 :     | id OF ty (EXCEPTIONbind(id,SOME ty))
488 :     | id EQ ident (EXCEPTIONEQbind(id,ident))
489 :    
490 :    
491 : leunga 744 functorarg: scopeddecls (scopeddecls)
492 :     | id COLON sigexp ([FUNCTORARGdecl(id,sigexp)])
493 :    
494 :     sigexp: ident (IDsig ident)
495 :     | SIG decls END (DECLsig decls)
496 :     | sigexp WHERE sigsubs (sigsubs sigexp)
497 :    
498 :     sigsubs: sigsub (sigsub)
499 :     | sigsub AND sigsubs (sigsub o sigsubs)
500 :    
501 :     sigsub: TYPE ident EQ ty (fn s => WHERETYPEsig(s,ident,ty))
502 :     | ident EQ structexp (fn s => WHEREsig(s,ident,structexp))
503 :    
504 :     sharingdecls: sharingdecl ([sharingdecl])
505 :     | sharingdecl AND sharingdecls (sharingdecl::sharingdecls)
506 :    
507 :     sharingdecl: TYPE sharelist (TYPEshare sharelist)
508 :     | sharelist (STRUCTshare sharelist)
509 :    
510 :     sharelist: ident EQ ident ([ident1,ident2])
511 :     | ident EQ sharelist (ident::sharelist)
512 :    
513 :     scopedmldecls: newScope mldecls oldScope (mldecls)
514 :    
515 :     scopeddecls: newScope decls oldScope (decls)
516 :    
517 :     newScope: (newScope precStack)
518 :     oldScope: (oldScope precStack)
519 :    
520 :     syms: sym ([sym])
521 :     | sym syms (sym::syms)
522 :    
523 :     idents: ident ([ident])
524 :     | ident idents (ident::idents)
525 :    
526 :     assemblycase: LOWERCASE (LOWERCASE)
527 :     | UPPERCASE (UPPERCASE)
528 :     | VERBATIM (VERBATIM)
529 :    
530 :     rtl: RTL_COLON exp (SOME(exp))
531 :     | (NONE)
532 :    
533 :     rtlterms: rtlterm ([rtlterm])
534 :     | rtlterm rtlterms (rtlterm::rtlterms)
535 :    
536 :     rtlterm: string (LITrtl string)
537 :     | sym (IDrtl sym)
538 :     | HASH id (COMPOSITErtl id)
539 :    
540 : leunga 775 structexp: ident (IDsexp ident)
541 :     | STRUCT scopeddecls END (DECLsexp scopeddecls)
542 :     | structexp LPAREN scopeddecls RPAREN
543 :     (APPsexp(structexp,DECLsexp scopeddecls))
544 :     | structexp LPAREN ident RPAREN
545 :     (APPsexp(structexp,IDsexp ident))
546 : leunga 744
547 :     datatypebinds: datatypebind ([datatypebind])
548 :     | datatypebind AND datatypebinds (datatypebind::datatypebinds)
549 :    
550 :     datatypebind: tyvarseq id opcodeencoding fieldty hasasm EQ consbinds
551 :     (let val a = hasasm orelse
552 :     List.exists(fn CONSbind{asm=SOME _,...}=>true
553 :     | _ => false) consbinds
554 :     in
555 :     DATATYPEbind{id=id,tyvars=tyvarseq,mc=opcodeencoding,
556 :     asm=a,field=fieldty,cbs=consbinds}
557 :     end
558 :     )
559 :     | tyvarseq id opcodeencoding fieldty hasasm EQ DATATYPE ty
560 :     (DATATYPEEQbind{id=id,tyvars=tyvarseq,ty=ty})
561 :    
562 :     hasasm: DEREF (true)
563 :     | (false)
564 :    
565 :     fieldty: (NONE)
566 :     | COLON id (SOME id)
567 :    
568 :     opcodeencoding: (NONE)
569 :     | LBRACKET encodingexps RBRACKET (SOME encodingexps)
570 :    
571 :     encodingexps: encodingexp (encodingexp)
572 :     | encodingexp COMMA encodingexps (encodingexp@encodingexps)
573 :    
574 :     encodingexp: int ([int])
575 :     | int DOTDOT int
576 :     (let fun f i = if i > int2 then [] else i::f(i+1)
577 :     in f int1 end)
578 :     | int int DOTDOT int
579 :     (let val inc = int2 - int1
580 :     fun f i = if i > int3 then [] else i::f(i+inc)
581 :     in f int1 end)
582 :    
583 :     consbinds: consbind ([consbind])
584 :     | consbind BAR consbinds (consbind::consbinds)
585 :    
586 :     consbind: sym of_ty consassembly consencoding rtl nop
587 :     nullified delayslot delayslotcandidate sdi latency pipeline
588 :     (let val cand =
589 :     case delayslotcandidate of
590 :     SOME _ => delayslotcandidate
591 :     | _ => case (nop,nullified) of
592 :     (FLAGoff,FLAGoff) => NONE
593 :     | _ => (SOME(BOOLexp false))
594 :     in
595 :     CONSbind{id=sym,ty=of_ty,mc=consencoding,
596 :     asm=consassembly,rtl=rtl,
597 :     nop=nop,sdi=sdi,nullified=nullified,
598 :     delayslot=delayslot,
599 :     delaycand=cand, latency=latency, pipeline=pipeline,
600 :     loc=SourceMap.location srcMap (symleft,sdiright)
601 :     }
602 :     end
603 :     )
604 :    
605 :     latency: LATENCY COLON exp (SOME exp)
606 :     | (NONE)
607 :    
608 :     pipeline: PIPELINE COLON exp (SOME exp)
609 :     | (NONE)
610 :    
611 :     delayslotcandidate: (NONE)
612 :     | DELAYSLOT CANDIDATE_COLON exp (SOME exp)
613 :    
614 :     of_ty: (NONE)
615 :     | OF ty (SOME ty)
616 :    
617 :     nop: (FLAGoff)
618 :     | PADDING_COLON flag (flag)
619 :     | PADDING_COLON False (FLAGoff)
620 :     | PADDING_COLON True (FLAGon)
621 :    
622 :     True: TRUE ()
623 :     | ALWAYS ()
624 :    
625 :     False: FALSE ()
626 :     | NEVER ()
627 :    
628 :     flag: id flagguard (FLAGid(id,true,flagguard))
629 :     | NOT id flagguard (FLAGid(id,false,flagguard))
630 :     | id EQ True flagguard (FLAGid(id,true,flagguard))
631 :     | id EQ False flagguard (FLAGid(id,false,flagguard))
632 :    
633 :     flagguard: (BOOLexp true)
634 :     | AND exp (exp)
635 :    
636 :     nullified: (FLAGoff)
637 :     | NULLIFIED_COLON FALSE (FLAGoff)
638 :     | NULLIFIED_COLON flag (flag)
639 :    
640 :     delayslot: (NONE)
641 :     | DELAYSLOT_COLON exp (SOME exp)
642 :    
643 :     branching: BRANCHING FORWARDS (BRANCHforwards)
644 :     | BRANCHING BACKWARDS (BRANCHbackwards)
645 :    
646 :     sdi: (NONE)
647 :     | SPAN DEPENDENT exp (SOME exp)
648 :    
649 :     consencoding: (NONE)
650 :     | unsignedint (SOME(WORDmc(unsignedint)))
651 :     | LPAREN expseq RPAREN (SOME(EXPmc(SEQexp expseq)))
652 :     | LPAREN exps2 RPAREN (SOME(EXPmc(TUPLEexp exps2)))
653 :     | id LBRACE labexps0 RBRACE
654 :     (SOME(EXPmc(APPexp(IDexp(IDENT([],id)),
655 :     RECORDexp labexps0))))
656 :     | MC_COLON exp (SOME(EXPmc exp))
657 :    
658 :     consassembly: (NONE)
659 :     | string (SOME(STRINGasm string))
660 :     | LDQUOTE asms RDQUOTE (SOME(ASMasm asms))
661 :     | ASM_COLON exp (SOME(ASMasm[EXPasm exp]))
662 :    
663 :     asms: asm ([asm])
664 :     | asm asms (asm::asms)
665 :    
666 :     asm: LMETA exp RMETA (EXPasm exp)
667 :     | ASMTEXT (TEXTasm ASMTEXT)
668 :    
669 :     opt_of: ()
670 :     | OF ()
671 :    
672 :     withtypeclause: ([])
673 :     | WITHTYPE typebinds (typebinds)
674 :    
675 :    
676 :     typebinds: typebind ([typebind])
677 :     | typebind AND typebinds (typebind::typebinds)
678 :    
679 :     typebind: tyvarseq tid EQ ty (TYPEbind(tid,tyvarseq,ty))
680 :    
681 :     tyvarseq: ([])
682 :     | tyvar ([tyvar])
683 :     | LPAREN tyvars RPAREN (tyvars)
684 :    
685 :     tyvars: tyvar ([tyvar])
686 :     | tyvar COMMA tyvars (tyvar::tyvars)
687 :    
688 :     formatbinds: formatbind ([formatbind])
689 :     | formatbind BAR formatbinds (formatbind::formatbinds)
690 :    
691 :     formatbind: id opt_of LBRACE fields RBRACE opt_exp
692 :     (FORMATbind(id,fields,opt_exp))
693 :    
694 :     opt_exp: (NONE)
695 :     | EQ exp (SOME exp)
696 :    
697 :     fields: field ([field])
698 :     | field COMMA fields (field::fields)
699 :    
700 :     field: fieldid COLON cnv signedness width unsignedint_opt
701 :     (FIELD{id=fieldid,cnv=cnv,
702 :     width=width,sign=signedness,value=unsignedint_opt})
703 :     | id
704 :     (FIELD{id=id,cnv=NOcnv,width=WIDTH 0,sign=UNSIGNED,value=NONE})
705 :    
706 :     fieldid: id (id)
707 :     | WILD ("")
708 :    
709 :     cnv: (NOcnv)
710 :     | id (FUNcnv id)
711 :     | DOLLAR id (CELLcnv id)
712 :    
713 :     width: (WIDTH 0)
714 :     | int (WIDTH int)
715 :     | int DOTDOT int (RANGE(int1,int2))
716 :    
717 :     unsignedint: int (Word32.fromInt int)
718 :     | word (word)
719 :    
720 :     unsignedint_opt: (NONE)
721 :     | EQ unsignedint (SOME unsignedint)
722 :    
723 :     signedness: SIGNED (SIGNED)
724 :     | UNSIGNED (UNSIGNED)
725 :     | (UNSIGNED)
726 :    
727 :     funbinds: funbind ([funbind])
728 :     | funbind AND funbinds (funbind::funbinds)
729 :    
730 :     funbind: funclauses (FUNbind funclauses)
731 :    
732 :     valbinds: valbind ([valbind])
733 :     | valbind AND valbinds (valbind::valbinds)
734 :    
735 :     valbind: pat EQ exp (VALbind(pat,exp))
736 :    
737 : leunga 775 literal: word (WORD32lit word)
738 :     | int (INTlit int)
739 :     | intinf (INTINFlit intinf)
740 :     | string (STRINGlit string)
741 :     | char (CHARlit char)
742 :     | bool (BOOLlit bool)
743 :     | real (REALlit real)
744 :    
745 :     aexp: literal (LITexp literal)
746 : leunga 744 | ident2 (IDexp ident2)
747 :     | HASH id (TYPEexp(TYVARty(INTtv id)))
748 : leunga 775 | OP symb (IDexp(IDENT([],symb)))
749 :     | LPAREN symb RPAREN (IDexp(IDENT([],symb)))
750 : leunga 744 | LPAREN exp COLON ty RPAREN (TYPEDexp(exp,ty))
751 :     | LDQUOTE asms RDQUOTE (ASMexp(ASMasm asms))
752 :     | LPAREN RPAREN (TUPLEexp [])
753 :     | LPAREN exp RPAREN (exp)
754 :     | LPAREN exps2 RPAREN (TUPLEexp exps2)
755 :     | LPAREN expseq2 RPAREN (SEQexp expseq2)
756 :     | LBRACKET exps RBRACKET (LISTexp(exps,NONE))
757 :     | LBRACE labexps0 RBRACE (RECORDexp labexps0)
758 :     | DOLLAR id LBRACKET exp region RBRACKET (LOCexp(id,exp,region))
759 :     | LLBRACKET rtlterms RRBRACKET (RTLexp(rtlterms))
760 :     | sym CONCAT LBRACKET exps RBRACKET
761 :     (let val loc = SourceMap.location srcMap
762 :     (symleft,RBRACKETright)
763 :     in LISTexp(enumExp(err,loc,sym,exps),NONE) end
764 :     )
765 :     | LBRACKET exps RBRACKET CONCAT sym
766 :     (let val loc = SourceMap.location srcMap
767 :     (symleft,RBRACKETright)
768 :     in LISTexp(enumExp'(err,loc,exps,sym),NONE) end
769 :     )
770 :    
771 :     | sym CONCAT LBRACKET exps RBRACKET CONCAT sym
772 :     (let val loc = SourceMap.location srcMap
773 :     (symleft,RBRACKETright)
774 :     in LISTexp(enumExp'(err,loc,
775 :     enumExp(err,loc,sym1,exps),sym2),
776 :     NONE)
777 :     end
778 :     )
779 : leunga 775 | LET decls IN expseq END (LETexp(decls,expseq))
780 : leunga 744
781 :     region: (NONE)
782 :     | COLON id (SOME id)
783 :    
784 :     aexp2: aexp (Prec.EXP aexp)
785 :     | sym (Prec.ID sym)
786 :     | EQ (Prec.ID "=")
787 :     | aexp2 AT LBRACKET slices RBRACKET
788 :     (Prec.EXP(BITSLICEexp(
789 :     case aexp2 of Prec.EXP e => e
790 :     | Prec.ID x => IDexp(IDENT([],x)),slices)))
791 :    
792 :     labexps0: ([])
793 :     | labexps (labexps)
794 :     labexps: labexp ([labexp])
795 :     | labexp COMMA labexps (labexp::labexps)
796 :    
797 :     labexp: id EQ exp (id,exp)
798 :     | id (id,IDexp(IDENT([],id)))
799 :    
800 :     appexp: aexp2 ([aexp2])
801 :     | appexp aexp2 (appexp @ [aexp2])
802 :    
803 :     exp: appexp (parseExp precStack err
804 :     (SourceMap.location srcMap (appexpleft,appexpright)) appexp)
805 :     | IF exp THEN exp ELSE exp (IFexp(exp1,exp2,exp3))
806 :     | CASE exp OF clauses (CASEexp(exp,clauses))
807 :     | FN clauses (LAMBDAexp clauses)
808 :     | exp HANDLE clauses (HANDLEexp(exp,clauses))
809 :     | RAISE exp (RAISEexp exp)
810 :    
811 :     expseq: exp ([exp])
812 :     | exp SEMICOLON expseq (exp::expseq)
813 :    
814 :     expseq2: exp SEMICOLON expseq (exp::expseq)
815 :    
816 :     exps1: exp ([exp])
817 :     | exp COMMA exps1 (exp::exps1)
818 :    
819 :     exps2: exp COMMA exps1 (exp::exps1)
820 :    
821 :     exps: ([])
822 :     | exps1 (exps1)
823 :    
824 :     apat: ident2 (CONSpat(ident2,NONE))
825 : leunga 775 | literal (LITpat literal)
826 : leunga 744 | WILD (WILDpat)
827 :     | LPAREN RPAREN (TUPLEpat [])
828 :     | LBRACKET pats RBRACKET (LISTpat(pats,NONE))
829 :     | LPAREN pats2 RPAREN (TUPLEpat pats2)
830 :     | LPAREN orpats2 RPAREN (ORpat orpats2)
831 : leunga 775 | LPAREN andpats2 RPAREN (ANDpat andpats2)
832 : leunga 744 | LPAREN pat RPAREN (pat)
833 : leunga 775 | LPAREN pat WHERE exp RPAREN (WHEREpat(pat,exp))
834 :     | LPAREN pat WHERE exp IN pat RPAREN
835 :     (NESTEDpat(pat1,exp,pat2))
836 : leunga 744 | LBRACE labpats0 RBRACE (RECORDpat(labpats0))
837 :     | sym CONCAT LBRACKET pats RBRACKET
838 :     (let val loc = SourceMap.location srcMap
839 :     (symleft,RBRACKETright)
840 :     in LISTpat(enumPat(err,loc,sym,pats),NONE) end
841 :     )
842 :     | sym CONCAT LBRACKET pats RBRACKET CONCAT sym
843 :     (let val loc = SourceMap.location srcMap
844 :     (symleft,RBRACKETright)
845 :     in LISTpat(enumPat'(err,loc,
846 :     enumPat(err,loc,sym1,pats),sym2),NONE) end
847 :     )
848 :    
849 :     | LBRACKET pats RBRACKET CONCAT sym
850 :     (let val loc = SourceMap.location srcMap
851 :     (symleft,RBRACKETright)
852 :     in LISTpat(enumPat'(err,loc,pats,sym),NONE) end
853 :     )
854 :    
855 :    
856 :     orpats2: pat BAR pat ([pat1,pat2])
857 :     | pat BAR orpats2 (pat::orpats2)
858 :    
859 : leunga 775 andpats2: pat AND pat ([pat1,pat2])
860 :     | pat AND andpats2 (pat::andpats2)
861 :    
862 : leunga 744 apat2: apat (Prec.EXP apat)
863 :     | sym (Prec.ID sym)
864 : leunga 775 | OP sym (Prec.ID sym)
865 : leunga 744
866 :     apppat: apat2 ([apat2])
867 :     | apppat apat2 (apppat@[apat2])
868 :    
869 :     pat: apppat (parsePat precStack err
870 :     (SourceMap.location srcMap
871 :     (apppatleft,apppatright)) apppat)
872 :     | id AS pat (ASpat(id,pat))
873 :    
874 :     asapat: apat (apat)
875 :     | id AS asapat (ASpat(id,asapat))
876 :    
877 :     pats: ([])
878 :     | pats1 (pats1)
879 :    
880 :     pats1: pat ([pat])
881 :     | pat COMMA pats1 (pat::pats1)
882 :    
883 :     pats2: pat COMMA pats1 (pat::pats1)
884 :    
885 :     labpats0: ([],false)
886 :     | labpats (labpats)
887 :    
888 :     labpats: labpat ([labpat],false)
889 :     | labpat COMMA DOTDOT ([labpat],true)
890 :     | labpat COMMA labpats (labpat:: #1 labpats, #2 labpats)
891 :    
892 :     labpat: sym (sym,IDpat sym)
893 :     | sym EQ pat (sym,pat)
894 :     | sym AS pat (sym,ASpat(sym,pat))
895 : leunga 775 | sym WHERE exp (sym,WHEREpat(IDpat sym,exp))
896 :     | sym WHERE exp IN pat (sym,NESTEDpat(IDpat sym,exp,pat))
897 : leunga 744
898 : leunga 775 clause: pat guard cont DARROW exp (clause([pat],guard,cont,exp))
899 : leunga 744
900 : leunga 775 cont: (NONE)
901 :     | EXCEPTION id (SOME id)
902 :    
903 : leunga 744 guard: (NONE)
904 :     | WHERE exp (SOME exp)
905 :    
906 :     clauses: clause ([clause])
907 :     | clause BAR clauses (clause::clauses)
908 :    
909 : leunga 775 funclause: apppat funguard cont EQ exp
910 : leunga 744 (let val loc = SourceMap.location srcMap (apppatleft,expright)
911 :     in case parseFunPat precStack err loc apppat of
912 : leunga 775 (SOME f,ps) => (f,clause(ps,funguard,cont,exp))
913 : leunga 744 | (NONE,ps) =>
914 :     (err(loc,
915 :     "in clause "^
916 :     PP.text(AstPP.clause (CLAUSE(ps,funguard,exp))));
917 : leunga 775 ("dummy",clause(ps,funguard,cont,exp)))
918 : leunga 744 end
919 :     )
920 :    
921 :     funguard: (NONE)
922 :     | WHERE LPAREN exp RPAREN (SOME exp)
923 :    
924 :     funclauses: funclause (#1 funclause,[#2 funclause])
925 :     | funclause BAR funclauses (#1 funclause,#2 funclause:: #2 funclauses)
926 :    
927 :     aty: tident (IDty tident)
928 :     | HASH int (INTVARty int)
929 :     | tyvar (TYVARty tyvar)
930 :     | DOLLAR id (CELLty id)
931 :     | LPAREN RPAREN (IDty(IDENT([],"unit")))
932 :     | LPAREN ty RPAREN (ty)
933 :     | LBRACE labtys RBRACE (RECORDty labtys)
934 :    
935 :     appty: aty (aty)
936 :     | appty tident (APPty(tident,[appty]))
937 :     | LPAREN tys2 RPAREN tident (APPty(tident,tys2))
938 :    
939 :     tid: id (id)
940 :     | tid2 (tid2)
941 :    
942 :     tid2: BITS ("bits")
943 :     | CELL ("cell")
944 :     | INSTRUCTION ("instruction")
945 :    
946 :     tident: tid (IDENT([],tid))
947 :     | tpath (IDENT(rev(#1 tpath), #2 tpath))
948 :    
949 :     tpath: tid DOT tid ([tid1],tid2)
950 :     | tpath DOT tid (#2 tpath :: #1 tpath,tid)
951 :    
952 :    
953 :     tys2: ty COMMA ty ([ty1,ty2])
954 :     | ty COMMA tys2 (ty::tys2)
955 :    
956 :     ty: ty ARROW ty (FUNty(ty1,ty2))
957 :     | tuplety (TUPLEty tuplety)
958 :     | appty (appty)
959 :    
960 :     labtys: ([])
961 :     | labtys1 (labtys1)
962 :    
963 :     labtys1: labty ([labty])
964 :     | labty COMMA labtys1 (labty::labtys1)
965 :    
966 :     labty: id COLON ty (id,ty)
967 :    
968 :     tuplety: appty TIMES appty ([appty1,appty2])
969 :     | appty TIMES tuplety (appty::tuplety)
970 :    
971 :     storagedecls: storagedecl ([storagedecl])
972 :     | storagedecl BAR storagedecls (storagedecl::storagedecls)
973 :    
974 :     storagedecl: id EQ DOLLAR id LBRACKET cellcount RBRACKET bitSize
975 :     aliasing defaults printcell
976 :     (CELLdecl{id=id1,nickname=id2,
977 :     bits= #1 bitSize,count=cellcount,
978 :     alias= aliasing, aggregable= #2 bitSize,
979 :     from=ref 0,to=ref 0,print=printcell,
980 :     defaults=defaults})
981 :    
982 :     aggregable: (false)
983 :     | AGGREGABLE (true)
984 :    
985 :     bitSize: OF int aggregable BITS (int,aggregable)
986 :     | (0,false)
987 :    
988 :     cellcount: int (SOME int)
989 :     | (NONE)
990 :    
991 :     locbind: id EQ exp (LOCbind(id,NONE,exp))
992 :     | id pat EQ exp (LOCbind(id,SOME pat,exp))
993 :    
994 :     locbinds: locbind ([locbind])
995 :     | locbind AND locbinds (locbind::locbinds)
996 :    
997 :     word: WORD (WORD)
998 :    
999 :     int: INT (INT)
1000 :    
1001 : leunga 775 intopt: int (int)
1002 :     | (0)
1003 :    
1004 :     intinf: INTINF (INTINF)
1005 :    
1006 :     real: REAL (REAL)
1007 :    
1008 : leunga 744 aliasing: (NONE)
1009 :     | ALIASING id (SOME id)
1010 :    
1011 :     printcell: ASM_COLON string
1012 :     (LAMBDAexp [CLAUSE([WILDpat],NONE,
1013 :     LITexp(STRINGlit string))])
1014 :     | ASM_COLON LPAREN exp RPAREN (exp)
1015 :    
1016 :     defaults: ([])
1017 :     | WHERE default_list (default_list)
1018 :    
1019 :     default_list: default ([default])
1020 :     | default AND default_list (default::default_list)
1021 :    
1022 :     default: DOLLAR id LBRACKET int RBRACKET EQ exp (int,exp)
1023 :    
1024 :     slices: slice ([slice])
1025 :     | slice COMMA slices (slice::slices)
1026 :    
1027 :     slice: int DOTDOT int (int1,int2)
1028 :     | int (int1,int1)
1029 :    
1030 :     id: ID (ID)
1031 :     | SYMBOL (SYMBOL)
1032 :     | CELLSET ("cellset")
1033 :    
1034 :     sym: id (id)
1035 :     | symb (symb)
1036 :    
1037 :     symb: TIMES ("*")
1038 :     | NOT ("not")
1039 :     | DEREF ("!")
1040 :    
1041 :     ident: id (IDENT([],id))
1042 :     | ident2 (ident2)
1043 :    
1044 :     ident2: path (IDENT(rev(tl path),hd path))
1045 :    
1046 :     path: id DOT sym ([sym,id])
1047 :     | path DOT sym (sym::path)
1048 :    
1049 :     tyvar: TYVAR (VARtv TYVAR)
1050 :     | HASH id (INTtv id)
1051 :    
1052 :     string: STRING (STRING)
1053 :    
1054 :     char: CHAR (CHAR)
1055 :    
1056 :     bool: False (false)
1057 :     | True (true)

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