Annotation of researchv10no/cmd/sml/src/parse/ml.grm, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: open ErrorMsg Symbol PrintUtil 
        !             3: open Access Basics BasicTypes TypesUtil Absyn
        !             4: open Env
        !             5: open EnvAccess
        !             6: open ModUtil
        !             7: open SigMatch
        !             8: open Misc
        !             9: open CoreLang
        !            10: open Signs
        !            11: open Strs
        !            12: %%
        !            13: %term
        !            14:     EOF | ID of Symbol.symbol | IDDOT of Symbol.symbol | TYVAR of Symbol.symbol
        !            15:   | INT of int | REAL of string | STRING of string | ABSTRACTION | ABSTYPE | AND
        !            16:   | ARROW | AS | BAR | CASE | DATATYPE | DOTDOTDOT | ELSE | END | EQUAL
        !            17:   | EQTYPE | EXCEPTION | DO | DARROW | FN | FUN | FUNCTOR | HANDLE | HASH
        !            18:   | IF | IN | INCLUDE | INFIX | INFIXR | LET | LOCAL | NONFIX | OF | OP
        !            19:   | OPEN | OVERLOAD | QUERY | RAISE | REC | SHARING | SIG | SIGNATURE | STRUCT
        !            20:   | STRUCTURE | THEN | TYPE | VAL | WHILE | WILD | WITH | WITHTYPE | ASTERISK
        !            21:   | COLON | COMMA | LBRACE | LBRACKET | LPAREN | RBRACE | RBRACKET | RPAREN |
        !            22:     SEMICOLON | ORELSE | ANDALSO | IMPORT
        !            23: 
        !            24: %nonterm  ident of symbol
        !            25:        | optional_op of unit
        !            26:        | opid of symbol 
        !            27:        | qid of symbol list 
        !            28:        | selector of symbol 
        !            29:        | tycon of symbol list
        !            30:        | tlabel of (symbol * ty) susp
        !            31:        | tlabels  of (symbol * ty) list susp
        !            32:        | ty' of ty susp
        !            33:        | tuple_ty of ty list susp
        !            34:        | ty of ty susp
        !            35:        | ty0_pc of ty list susp
        !            36:        | match of rule list stamped
        !            37:        | rule of rule stamped
        !            38:        | elabel of (symbol * exp) stamped 
        !            39:        | elabels of (symbol * exp) list stamped
        !            40:        | exp_ps of exp list stamped 
        !            41:        | exp of exp stamped 
        !            42:        | app_exp of exp precStack stamped
        !            43:        | aexp of exp stamped
        !            44:        | bexp of exp stamped
        !            45:        | cexp of exp stamped
        !            46:        | dexp of exp stamped
        !            47:        | exp_list of exp list stamped
        !            48:        | exp_2c  of exp list stamped
        !            49:        | pat of pat susp
        !            50:        | app_pat of appat precStack susp
        !            51:        | apat  of pat susp
        !            52:        | plabel of (symbol * pat) susp
        !            53:        | plabels of ((symbol * pat) list * bool) susp
        !            54:        | pat_2c of pat list susp
        !            55:        | pat_list of pat list susp
        !            56:        | vb of vb list stamped
        !            57:        | constraint of ty option susp
        !            58:        | rvb of rawrvb list susp
        !            59:        | fb' of rawclause list susp
        !            60:        | fb of rawclause list list susp
        !            61:        | clause of rawclause susp
        !            62:        | tb of bool -> tb list pathstamped
        !            63:        | tyvars of tyvar list
        !            64:        | tyvar_pc of tyvar list
        !            65:        | db of tycon ref list pathstamped
        !            66:        | db' of tycon ref pathstamped
        !            67:        | constrs of ty -> (symbol * bool * ty) list
        !            68:        | constr of ty -> symbol * bool * ty
        !            69:        | eb of eb list susp
        !            70:        | qid_p of structureVar list susp
        !            71:        | fixity of fixity
        !            72:        | ldec of dec pathstamped
        !            73:        | exp_pa of exp list stamped
        !            74:        | ldecs of dec pathstamped
        !            75:        | ops of symbol list
        !            76:        | spec_s of spectype
        !            77:        | spec of spectype
        !            78:        | strspec of spectype
        !            79:        | tyspec of bool3 -> spectype
        !            80:        | valspec of spectype
        !            81:        | exnspec of spectype
        !            82:        | sharespec of spectype
        !            83:        | patheqn of symbol list list
        !            84:        | sign of signtype
        !            85:        | sigconstraint_op of Structure option susp
        !            86:        | sigb of signatureVar list susp
        !            87:        | str of strArg -> strexp * Structure * thinning
        !            88:        | sdecs of dec list pathstamped
        !            89:        | sdec of dec pathstamped
        !            90:        | strb of bool -> (symbol*structureVar*strb) list pathstamped
        !            91:        | fparam of (symbol * access * Structure * bool) susp
        !            92:        | fctb of (symbol * functorVar * fctb) list susp
        !            93:        | importdec of string list
        !            94:        | interdec of dec susp
        !            95: 
        !            96: %verbose
        !            97: %pure
        !            98: %start interdec
        !            99: %eop EOF SEMICOLON
        !           100: 
        !           101: %nonassoc WITHTYPE
        !           102: %right AND
        !           103: %right ARROW
        !           104: %right AS
        !           105: %right HANDLE
        !           106: %right BAR
        !           107: %left ORELSE
        !           108: %left ANDALSO
        !           109: %left COLON
        !           110: 
        !           111: %name ML
        !           112: 
        !           113: %keyword ABSTRACTION ABSTYPE AND AS CASE DATATYPE DOTDOTDOT ELSE END 
        !           114:   EQTYPE EXCEPTION  DO  DARROW  FN  FUN  FUNCTOR  HANDLE
        !           115:   IF IN INCLUDE  INFIX  INFIXR  LET  LOCAL  NONFIX  OF  OP
        !           116:   OPEN OVERLOAD  RAISE  REC  SHARING  SIG  SIGNATURE  STRUCT
        !           117:   STRUCTURE THEN TYPE VAL WHILE WITH WITHTYPE
        !           118:   ORELSE ANDALSO IMPORT
        !           119: 
        !           120: %subst EQUAL for DARROW | DARROW for EQUAL | ANDALSO for AND
        !           121: 
        !           122: %prefer VAL THEN ELSE 
        !           123: %header (structure MLLrValues)
        !           124: %%
        !           125: 
        !           126: ident  : ID            (ID)
        !           127:        | ASTERISK      (ASTERISKsym)
        !           128:        | EQUAL         (EQUALsym)
        !           129: 
        !           130: optional_op : OP       (warn "unnecessary `op' in datatype or exception declaration")
        !           131:            |           ()
        !           132: 
        !           133: opid   : ID            (ID)
        !           134:        | ASTERISK      (ASTERISKsym)
        !           135:        | OP ident      (ident)
        !           136: 
        !           137: qid    : IDDOT qid     (IDDOT :: qid)
        !           138:        | ident         ([ident])
        !           139: 
        !           140: selector: ID           (ID)
        !           141:        | INT           (let val s = makestring INT
        !           142:                          in if INT < 1
        !           143:                              then complain ("nonpositive integer label in \
        !           144:                                             \selector, found " ^ s)
        !           145:                              else ();
        !           146:                             Symbol.symbol s
        !           147:                         end)
        !           148: 
        !           149: tycon   : IDDOT tycon          (IDDOT :: tycon)
        !           150:        | ID                    ([ID])
        !           151: 
        !           152: tlabel : selector COLON ty     (fn()=>(selector, ty()))
        !           153: 
        !           154: tlabels : tlabel COMMA tlabels (fn()=>tlabel()::tlabels())
        !           155:        | tlabel                (fn()=>[tlabel()])
        !           156: 
        !           157: ty'    : TYVAR                 (fn()=>VARty(lookTyvar TYVAR))
        !           158:        | LBRACE tlabels RBRACE (fn()=>make_recordTy(tlabels()))
        !           159:        | LBRACE RBRACE         (fn()=>make_recordTy nil)
        !           160:        | LPAREN ty0_pc 
        !           161:              RPAREN tycon      (fn()=>let val ts = ty0_pc()
        !           162:                                  in CONty(!lookPathArTYC(tycon,length ts),ts)
        !           163:                                 end)
        !           164:        | LPAREN ty RPAREN      (ty)
        !           165:        | ty' tycon             (fn()=>CONty(lookArTYCp(tycon,1),[ty'()]))
        !           166:        | tycon                 (fn()=>CONty(lookArTYCp(tycon,0),[]))
        !           167: 
        !           168: tuple_ty : ty' ASTERISK tuple_ty (fn()=> ty'() :: tuple_ty())
        !           169:         | ty' ASTERISK ty'      (fn()=>[ty'1(),ty'2()])
        !           170: 
        !           171: ty     : tuple_ty              (fn()=>tupleTy(tuple_ty()))
        !           172:        | ty ARROW ty           (fn()=>CONty(arrowTycon, [ty1(),ty2()]))
        !           173:        | ty'                   (ty')
        !           174:        
        !           175: ty0_pc : ty COMMA ty           (fn() => [ty1(),ty2()])
        !           176:        | ty COMMA ty0_pc       (fn() => ty()::ty0_pc())
        !           177: 
        !           178: match  : rule                  (fn st => [rule st])
        !           179:        | rule BAR match        (fn st => rule st :: match st)
        !           180: 
        !           181: rule   : pat DARROW exp        (makeRULE(pat,exp))
        !           182: 
        !           183: elabel : selector EQUAL exp    (fn st => (selector,exp st))
        !           184: 
        !           185: elabels : elabel COMMA elabels (fn st => (elabel st :: elabels st))
        !           186:        | elabel                (fn st => [elabel st])
        !           187: 
        !           188: exp_ps : exp                   (fn st => [exp st])
        !           189:        | exp SEMICOLON exp_ps  (fn st => exp st :: exp_ps st)
        !           190: 
        !           191: exp    : app_exp bexp          (fn st => exp_finish(exp_parse(app_exp st, 
        !           192:                                                bexp st, NONfix)))
        !           193:        | bexp                  (bexp)
        !           194:        | cexp                  (cexp)
        !           195: 
        !           196: bexp   : FN match              (fn st=> FNexp(match st))
        !           197:        | CASE exp OF match     (fn st=> CASEexp(exp st, match st))
        !           198:        | WHILE exp DO exp      (fn st=> WHILEexp(exp1 st, exp2 st))
        !           199:        | IF exp THEN exp 
        !           200:                 ELSE exp       (fn st=> IFexp(exp1 st, exp2 st, exp3 st))
        !           201: 
        !           202: cexp   : cexp HANDLE match     (fn st=> HANDLEexp(cexp st,
        !           203:                                                HANDLER(FNexp(match st))))
        !           204:        | RAISE exp             (fn st=> RAISEexp(exp st))
        !           205:        | dexp                  (dexp)
        !           206: 
        !           207: dexp   : app_exp               (fn st=> exp_finish(app_exp st))
        !           208:        | dexp COLON ty         (fn st=> CONSTRAINTexp(dexp st, ty()))
        !           209:        | dexp ANDALSO dexp     (fn st=> ANDALSOexp(dexp1 st, dexp2 st))
        !           210:        | dexp ORELSE dexp      (fn st=> ORELSEexp(dexp1 st, dexp2 st))
        !           211: 
        !           212: app_exp        : aexp          (fn st => exp_start(aexp st, NONfix))
        !           213:         | ident                (fn st => exp_start(lookID ident, lookFIX ident))
        !           214:        | app_exp aexp  (fn st => exp_parse(app_exp st, aexp st, NONfix))
        !           215:        | app_exp ident (fn st => exp_parse(app_exp st, lookID ident, 
        !           216:                                                                lookFIX ident))
        !           217: 
        !           218: aexp   : OP ident                      (fn st=> lookID ident)
        !           219:        | IDDOT qid                     (fn st=> lookPath(IDDOT::qid,lookIDinStr))
        !           220:        | INT                           (fn st => INTexp INT)
        !           221:        | REAL                          (fn st => REALexp REAL)
        !           222:        | STRING                        (fn st => STRINGexp STRING)
        !           223:        | HASH selector                 (fn st => SELECTORexp selector)
        !           224:        | LBRACE elabels RBRACE         (fn st=> makeRECORDexp(elabels st))
        !           225:        | LBRACE RBRACE                 (fn st=> RECORDexp nil)
        !           226:        | LPAREN RPAREN                 (fn st=> unitExp)
        !           227:        | LPAREN exp_ps RPAREN          (fn st=> SEQexp(exp_ps st))
        !           228:        | LPAREN exp_2c RPAREN          (fn st=> TUPLEexp(exp_2c st))
        !           229:        | LBRACKET exp_list RBRACKET    (fn st=> LISTexp(exp_list st))
        !           230:        | LBRACKET RBRACKET             (fn st=> LISTexp nil)
        !           231:        | LET ldecs IN exp_ps END       (fn st=> protect(protectScope,fn()=>
        !           232:                                                 LETexp(ldecs([],st),
        !           233:                                                        SEQexp(exp_ps st))))
        !           234: 
        !           235: exp_2c : exp COMMA exp_2c      (fn st=> exp st :: exp_2c st)
        !           236:        | exp COMMA exp         (fn st=> [exp1 st, exp2 st])
        !           237: 
        !           238: exp_list : exp                 (fn st=> [exp st])
        !           239:         | exp COMMA exp_list   (fn st=> exp st :: exp_list st)
        !           240: 
        !           241: pat    : pat AS pat            (fn()=> layered(pat1(), pat2()))
        !           242:        | app_pat               (fn()=> pat_finish(app_pat()))
        !           243:        | app_pat COLON ty      (fn()=> CONSTRAINTpat(pat_finish(app_pat()),ty()))
        !           244: 
        !           245: app_pat        : apat                  (fn()=> pat_start(apat(), NONfix))
        !           246:        | app_pat apat          (fn()=> pat_parse(app_pat(),apat(), NONfix))
        !           247:        | ID                    (pat_start_id ID)
        !           248:        | ASTERISK              (pat_start_id ASTERISKsym)
        !           249:        | app_pat ID            (pat_parse_id(app_pat,ID))
        !           250:        | app_pat ASTERISK      (pat_parse_id(app_pat,ASTERISKsym))
        !           251: 
        !           252: apat   : OP ident                      (pat_id ident)
        !           253:        | IDDOT qid                     (fn()=>qid_pat(IDDOT::qid))
        !           254:        | INT                           (fn()=>INTpat INT)
        !           255:        | REAL                          (fn()=>REALpat REAL)
        !           256:        | STRING                        (fn()=>STRINGpat STRING)
        !           257:        | WILD                          (fn()=>WILDpat)
        !           258:        | LPAREN RPAREN                 (fn()=>unitPat)
        !           259:        | LPAREN pat RPAREN             (pat)
        !           260:        | LPAREN pat_2c RPAREN          (fn()=>TUPLEpat(pat_2c()))
        !           261:        | LBRACKET RBRACKET             (fn()=>LISTpat nil)
        !           262:        | LBRACKET pat_list RBRACKET    (fn()=>LISTpat(pat_list()))
        !           263:        | LBRACE RBRACE                 (fn()=>makeRECORDpat(nil,false))
        !           264:        | LBRACE plabels RBRACE         (fn()=>makeRECORDpat(plabels()))
        !           265: 
        !           266: plabel : selector EQUAL pat    (fn()=> (selector,pat()))
        !           267:        | ID                    (fn()=> (ID, pat_id ID ()))
        !           268:        | ID AS pat             (fn()=> (ID, LAYEREDpat(pat_id ID (), pat())))
        !           269:        | ID COLON ty           (fn()=> (ID, CONSTRAINTpat(pat_id ID(), ty())))
        !           270:        | ID COLON ty AS pat    (fn()=> (ID, LAYEREDpat(CONSTRAINTpat(pat_id ID(), ty()),pat())))
        !           271: 
        !           272: plabels : plabel COMMA plabels (fn()=>let val (a,(b,fx))=(plabel(),plabels())
        !           273:                                        in (a::b, fx)
        !           274:                                       end)
        !           275:        | plabel                (fn()=> ([plabel()],false))
        !           276:        | DOTDOTDOT             (fn()=> (nil, true))
        !           277: 
        !           278: pat_2c : pat COMMA pat_2c      (fn()=> pat() :: pat_2c())
        !           279:        | pat COMMA pat         (fn()=>[pat1(), pat2()])
        !           280: 
        !           281: pat_list: pat                  (fn()=> [pat()])
        !           282:        | pat COMMA pat_list    (fn()=> pat() :: pat_list())
        !           283: 
        !           284: vb     : vb AND vb             (fn st=> vb1 st @ vb2 st)
        !           285:        | pat EQUAL exp         (fn st=> protect(protectTyvars NONE, fn()=>
        !           286:                                     [valbind(pat(),exp st,currentTyvars())]))
        !           287: 
        !           288: constraint :                   (fn()=>NONE)
        !           289:           | COLON ty           (fn()=>SOME(ty()))
        !           290: 
        !           291: rvb    : opid constraint 
        !           292:                EQUAL FN match  (fn()=>[{name=opid,ty=constraint(),match=match}])
        !           293:        | rvb AND rvb           (fn()=> rvb1() @ rvb2())
        !           294: 
        !           295: 
        !           296: fb'    : clause                (fn()=>[clause()])
        !           297:        | clause BAR fb'        (fn()=>clause()::fb'())
        !           298:         
        !           299: fb     : fb'                   (fn() => [checkFB(fb'())])
        !           300:        | fb' AND fb            (fn() => checkFB(fb'()) :: fb())
        !           301: 
        !           302: clause : app_pat constraint EQUAL exp  (makeCLAUSE(app_pat,constraint,exp))
        !           303: 
        !           304: tb     : tyvars ident EQUAL ty         (makeTB(tyvars,ident,ty))
        !           305:        | tb AND tb                     (fn nw => fn $ => tb1 nw $ @ tb2 nw $)
        !           306: 
        !           307: tyvars : TYVAR                         ([mkTyvar(mkUBOUND TYVAR)])
        !           308:        | LPAREN tyvar_pc RPAREN        (tyvar_pc)
        !           309:        |                               (nil)
        !           310: 
        !           311: tyvar_pc: TYVAR                                ([mkTyvar(mkUBOUND TYVAR)])
        !           312:        | TYVAR COMMA tyvar_pc          (mkTyvar(mkUBOUND TYVAR) :: tyvar_pc)
        !           313: 
        !           314: db     : db' AND db                    (fn $ => db' $ :: db $)
        !           315:        | db'                           (fn $ => [db' $])
        !           316: 
        !           317: db'    : tyvars ident EQUAL constrs    (makeDB'(tyvars,ident,constrs))
        !           318: 
        !           319: constrs : constr                       (fn t => [constr t])
        !           320:        | constr BAR constrs            (fn t => constr t :: constrs t)
        !           321: 
        !           322: constr : optional_op ident             (fn t=> (ident,true,t))
        !           323:        | optional_op ident OF ty       (fn t=> (ident,false,
        !           324:                                                 CONty(arrowTycon,[ty(),t])))
        !           325: 
        !           326: eb     : optional_op ident             (makeEB ident)
        !           327:        | optional_op ident OF ty       (makeEBof(ident,ty))
        !           328:        | optional_op ident EQUAL qid   (makeEBeq(ident,qid))
        !           329:        | eb AND eb                     (fn()=> eb1() @ eb2())
        !           330: 
        !           331: qid_p  : qid                           (fn()=> [getSTRpath qid])
        !           332:        | qid qid_p                     (fn()=> getSTRpath qid :: qid_p())
        !           333: 
        !           334: 
        !           335: fixity : INFIX                         (infixleft 0)
        !           336:        | INFIX INT                     (infixleft INT)
        !           337:        | INFIXR                        (infixright 0)
        !           338:        | INFIXR INT                    (infixright INT)
        !           339:        | NONFIX                        (NONfix)
        !           340: 
        !           341: ldec   : VAL vb                        (makeVALdec vb)
        !           342:        | VAL REC rvb                   (makeVALRECdec rvb)
        !           343:        | FUN fb                        (makeFUNdec fb)
        !           344:        | TYPE tb                       (fn ps => TYPEdec(tb true ps))
        !           345:        | DATATYPE db                   (makeDB(db, fn _ => fn _ => nil))
        !           346:        | DATATYPE db WITHTYPE tb       (makeDB(db, tb))
        !           347:        | ABSTYPE db WITH ldecs END     (makeABSTYPEdec(db,ldecs))
        !           348:        | EXCEPTION eb                  (fn ps => EXCEPTIONdec(eb()))
        !           349:        | OPEN qid_p                    (makeOPENdec qid_p)
        !           350:        | fixity ops                    (makeFIXdec(fixity,ops))
        !           351:        | OVERLOAD ident 
        !           352:                COLON ty AS exp_pa      (makeOVERLOADdec(ident,ty,exp_pa))
        !           353: 
        !           354: exp_pa : exp                           (fn st => [exp st])
        !           355:        | exp AND exp_pa                (fn st => exp st :: exp_pa st)
        !           356: 
        !           357: ldecs  :                               (fn $ => SEQdec nil)
        !           358:        | ldec ldecs                    (makeSEQdec(ldec,ldecs))
        !           359:        | ldec SEMICOLON ldecs          (fn $ => SEQdec nil)
        !           360:        | LOCAL ldecs IN ldecs END ldecs (makeSEQdec(
        !           361:                                           makeLOCALdec(ldecs1,ldecs2),ldecs3))
        !           362: 
        !           363: ops    : ident                         ([ident])
        !           364:        | ident ops                     (ident::ops)
        !           365: 
        !           366: spec_s :                               (fn $ => nil)
        !           367:        | spec spec_s                   (fn $ => spec $ @ spec_s $)
        !           368:        | spec SEMICOLON spec_s         (fn $ => spec $ @ spec_s $)
        !           369: 
        !           370: spec   : STRUCTURE strspec             (strspec)
        !           371:        | DATATYPE db                   (make_dtyspec db)
        !           372:        | TYPE tyspec                   (tyspec NO)
        !           373:        | EQTYPE tyspec                 (tyspec YES)
        !           374:        | VAL valspec                   (valspec)
        !           375:        | EXCEPTION exnspec             (exnspec)
        !           376:        | fixity ops                    (make_fixityspec(fixity,ops))
        !           377:        | SHARING sharespec             (sharespec)
        !           378:        | INCLUDE ident                 (make_includespec ident)
        !           379: 
        !           380: strspec        : strspec AND strspec           (fn $ => strspec1 $ @ strspec2 $)
        !           381:        | ident COLON sign              (make_strspec(ident,sign))
        !           382: 
        !           383: tyspec : tyspec AND tyspec             (fn eq => fn $ => 
        !           384:                                            tyspec1 eq $ @ tyspec2 eq $)
        !           385:        | tyvars ident                  (fn eq => make_tyspec(eq,tyvars,ident))
        !           386: 
        !           387: valspec        : valspec AND valspec           (fn $ => valspec1 $ @ valspec2 $)
        !           388:        | opid COLON ty                 (make_valspec(opid,ty))
        !           389: 
        !           390: exnspec : exnspec AND exnspec          (fn $ => exnspec1 $ @ exnspec2 $)
        !           391:        | ident                         (make_exnspec ident)
        !           392:        | ident OF ty                   (make_exnspecOF (ident,ty))
        !           393: 
        !           394: sharespec: sharespec AND sharespec     (fn $ => sharespec1 $ @ sharespec2 $)
        !           395:        | TYPE patheqn                  (make_type_sharespec patheqn)
        !           396:        | patheqn                       (make_str_sharespec patheqn)
        !           397:        
        !           398: patheqn:  qid EQUAL qid                        ([qid1,qid2])
        !           399:        | qid EQUAL patheqn             (qid :: patheqn)
        !           400: 
        !           401: sign   : ID                            (makeSIGid ID)
        !           402:        | SIG spec_s END                (makeSIG spec_s)
        !           403: 
        !           404: sigconstraint_op :                     (fn()=>NONE)
        !           405:        | COLON sign                    (fn()=>SOME(sign(1,Stampset.newStampsets())))
        !           406: 
        !           407: sigb   : sigb AND sigb                 (fn()=> sigb1() @ sigb2())
        !           408:        | ident EQUAL sign              (make_sigb(ident,sign))
        !           409: 
        !           410: str    : qid                           (make_str_qid qid)
        !           411:        | STRUCT sdecs END              (make_str_struct sdecs)
        !           412:        | ID LPAREN sdecs RPAREN        (make_str_app(ID,spread_args sdecs))
        !           413:        | ID LPAREN str RPAREN          (make_str_app(ID,single_arg str))
        !           414:        | LET sdecs IN str END          (make_str_let(sdecs,str))
        !           415: 
        !           416: sdecs  : sdec sdecs                    (fn $ => sdec $ :: sdecs $)
        !           417:        | sdec SEMICOLON sdecs          (fn $ => sdec $ :: sdecs $)
        !           418:        | LOCAL sdecs IN sdecs 
        !           419:                END sdecs               (fn $ =>makeLOCALsdecs(sdecs1,sdecs2) $
        !           420:                                                        @ sdecs $)
        !           421:        |                               (fn $ => nil)
        !           422: 
        !           423: sdec   : STRUCTURE strb        (makeSTRBs(strb false))
        !           424:        | ABSTRACTION strb      (makeSTRBs(strb true))
        !           425:        | SIGNATURE sigb        (makeSIGdec sigb)
        !           426:        | FUNCTOR fctb          (makeFCTdec fctb)
        !           427:        | ldec                  (fn (pa,_,st)=>
        !           428:                                 let val dec = ldec(pa,st)
        !           429:                                  in Typecheck.decType dec; dec
        !           430:                                 end)
        !           431: 
        !           432: strb   : ident sigconstraint_op 
        !           433:                EQUAL str       (makeSTRB(ident,sigconstraint_op,str))
        !           434:        | strb AND strb         (fn a => fn $ => strb1 a $ @ strb2 a $)
        !           435: 
        !           436: fparam : ID COLON sign                 (single_formal(ID,sign))
        !           437:        | spec_s                        (spread_formal spec_s)
        !           438: 
        !           439: fctb   : ident LPAREN fparam RPAREN
        !           440:           sigconstraint_op EQUAL str   (makeFCTB(ident,fparam,sigconstraint_op,str))
        !           441:        | fctb AND fctb                 (fn $ => fctb1 $ @ fctb2 $)
        !           442: 
        !           443: importdec: STRING                      ([STRING])
        !           444:        | STRING importdec              (STRING :: importdec)
        !           445: 
        !           446: interdec: sdec                         (fn()=> sdec([],Stampset.globalStamps))
        !           447:        | IMPORT importdec              (fn()=>IMPORTdec importdec)
        !           448:        | exp                           (fn()=>toplevelexp exp)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.