comparison src/lacweb.grm @ 240:7036d29574f2

Shorthand for multi-binding con declaration
author Adam Chlipala <adamc@hcoop.net>
date Thu, 28 Aug 2008 13:39:20 -0400
parents fc6f04889bf2
children 052126db06e7
comparison
equal deleted inserted replaced
239:fc6f04889bf2 240:7036d29574f2
191 | str of str 191 | str of str
192 192
193 | kind of kind 193 | kind of kind
194 | ktuple of kind list 194 | ktuple of kind list
195 | kcolon of explicitness 195 | kcolon of explicitness
196 | kopt of kind option
196 197
197 | path of string list * string 198 | path of string list * string
198 | cpath of string list * string 199 | cpath of string list * string
199 | spath of str 200 | spath of str
200 | mpath of string list 201 | mpath of string list
209 | rcon of (con * con) list 210 | rcon of (con * con) list
210 | rconn of (con * con) list 211 | rconn of (con * con) list
211 | rcone of (con * con) list 212 | rcone of (con * con) list
212 | cargs of con * kind -> con * kind 213 | cargs of con * kind -> con * kind
213 | cargl of con * kind -> con * kind 214 | cargl of con * kind -> con * kind
215 | cargl2 of con * kind -> con * kind
214 | carg of con * kind -> con * kind 216 | carg of con * kind -> con * kind
215 | cargp of con * kind -> con * kind 217 | cargp of con * kind -> con * kind
216 218
217 | eexp of exp 219 | eexp of exp
218 | eapps of exp 220 | eapps of exp
293 s (SIGleft, sgisright))]) 295 s (SIGleft, sgisright))])
294 296
295 decls : ([]) 297 decls : ([])
296 | decl decls (decl :: decls) 298 | decl decls (decl :: decls)
297 299
298 decl : CON SYMBOL EQ cexp (DCon (SYMBOL, NONE, cexp), s (CONleft, cexpright)) 300 decl : CON SYMBOL cargl2 kopt EQ cexp (let
299 | CON SYMBOL DCOLON kind EQ cexp (DCon (SYMBOL, SOME kind, cexp), s (CONleft, cexpright)) 301 val loc = s (CONleft, cexpright)
302
303 val k = Option.getOpt (kopt, (KWild, loc))
304 val (c, k) = cargl2 (cexp, k)
305 in
306 (DCon (SYMBOL, SOME k, c), loc)
307 end)
300 | LTYPE SYMBOL EQ cexp (DCon (SYMBOL, SOME (KType, s (LTYPEleft, cexpright)), cexp), 308 | LTYPE SYMBOL EQ cexp (DCon (SYMBOL, SOME (KType, s (LTYPEleft, cexpright)), cexp),
301 s (LTYPEleft, cexpright)) 309 s (LTYPEleft, cexpright))
302 | DATATYPE SYMBOL dargs EQ barOpt dcons(DDatatype (SYMBOL, dargs, dcons), s (DATATYPEleft, dconsright)) 310 | DATATYPE SYMBOL dargs EQ barOpt dcons(DDatatype (SYMBOL, dargs, dcons), s (DATATYPEleft, dconsright))
303 | DATATYPE SYMBOL dargs EQ DATATYPE CSYMBOL DOT path 311 | DATATYPE SYMBOL dargs EQ DATATYPE CSYMBOL DOT path
304 (case dargs of 312 (case dargs of
335 val c = (CAbs (SYMBOL2, SOME k, cexp), loc) 343 val c = (CAbs (SYMBOL2, SOME k, cexp), loc)
336 in 344 in
337 (DClass (SYMBOL1, c), s (CLASSleft, cexpright)) 345 (DClass (SYMBOL1, c), s (CLASSleft, cexpright))
338 end) 346 end)
339 347
348 kopt : (NONE)
349 | DCOLON kind (SOME kind)
350
340 dargs : ([]) 351 dargs : ([])
341 | SYMBOL dargs (SYMBOL :: dargs) 352 | SYMBOL dargs (SYMBOL :: dargs)
342 353
343 barOpt : () 354 barOpt : ()
344 | BAR () 355 | BAR ()
461 cargs : carg (carg) 472 cargs : carg (carg)
462 | cargl (cargl) 473 | cargl (cargl)
463 474
464 cargl : cargp cargp (cargp1 o cargp2) 475 cargl : cargp cargp (cargp1 o cargp2)
465 | cargp cargl (cargp o cargl) 476 | cargp cargl (cargp o cargl)
477
478 cargl2 : (fn x => x)
479 | cargp cargl2 (cargp o cargl2)
466 480
467 carg : SYMBOL (fn (c, k) => 481 carg : SYMBOL (fn (c, k) =>
468 let 482 let
469 val loc = s (SYMBOLleft, SYMBOLright) 483 val loc = s (SYMBOLleft, SYMBOLright)
470 in 484 in