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 1232 - (view) (download)

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

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