123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995 |
- %{
- #include "limbo.h"
- %}
- %union
- {
- struct{
- Src src;
- union{
- Sym *idval;
- Long ival;
- Real rval;
- }v;
- }tok;
- Decl *ids;
- Node *node;
- Type *type;
- Typelist *types;
- }
- %type <type> type fnarg fnargret fnargretp adtk fixtype iditype dotiditype
- %type <ids> ids rids nids nrids tuplist forms ftypes ftype
- bclab bctarg ptags rptags polydec
- %type <node> zexp exp monexp term elist zelist celist
- idatom idterms idterm idlist
- initlist elemlist elem qual
- decl topdecls topdecl fndef fbody stmt stmts qstmts qbodies cqstmts cqbodies
- mdecl adtdecl mfield mfields field fields fnname
- pstmts pbodies pqual pfields pfbody pdecl dfield dfields
- eqstmts eqbodies idexc edecl raises tpoly tpolys texp export exportlist forpoly
- %type <types> types
- %right <tok.src> '=' Landeq Loreq Lxoreq Llsheq Lrsheq
- Laddeq Lsubeq Lmuleq Ldiveq Lmodeq Lexpeq Ldeclas
- %left <tok.src> Lload
- %left <tok.src> Loror
- %left <tok.src> Landand
- %right <tok.src> Lcons
- %left <tok.src> '|'
- %left <tok.src> '^'
- %left <tok.src> '&'
- %left <tok.src> Leq Lneq
- %left <tok.src> '<' '>' Lleq Lgeq
- %left <tok.src> Llsh Lrsh
- %left <tok.src> '+' '-'
- %left <tok.src> '*' '/' '%'
- %right <tok.src> Lexp
- %right <tok.src> Lcomm
- %left <tok.src> '(' ')' '[' ']' Linc Ldec Lof Lref
- %right <tok.src> Lif Lelse Lfn ':' Lexcept Lraises
- %left <tok.src> Lmdot
- %left <tok.src> '.'
- %left <tok.src> Lto
- %left <tok.src> Lor
- %nonassoc <tok.v.rval> Lrconst
- %nonassoc <tok.v.ival> Lconst
- %nonassoc <tok.v.idval> Lid Ltid Lsconst
- %nonassoc <tok.src> Llabs Lnil
- '!' '~' Llen Lhd Ltl Ltagof
- '{' '}' ';'
- Limplement Limport Linclude
- Lcon Ltype Lmodule Lcyclic
- Ladt Larray Llist Lchan Lself
- Ldo Lwhile Lfor Lbreak
- Lalt Lcase Lpick Lcont
- Lreturn Lexit Lspawn Lraise Lfix
- Ldynamic
- %%
- prog : Limplement ids ';'
- {
- impmods = $2;
- } topdecls
- {
- tree = rotater($5);
- }
- | topdecls
- {
- impmods = nil;
- tree = rotater($1);
- }
- ;
- topdecls: topdecl
- | topdecls topdecl
- {
- if($1 == nil)
- $$ = $2;
- else if($2 == nil)
- $$ = $1;
- else
- $$ = mkbin(Oseq, $1, $2);
- }
- ;
- topdecl : error ';'
- {
- $$ = nil;
- }
- | decl
- | fndef
- | adtdecl ';'
- | mdecl ';'
- | idatom '=' exp ';'
- {
- $$ = mkbin(Oas, $1, $3);
- }
- | idterm '=' exp ';'
- {
- $$ = mkbin(Oas, $1, $3);
- }
- | idatom Ldeclas exp ';'
- {
- $$ = mkbin(Odas, $1, $3);
- }
- | idterm Ldeclas exp ';'
- {
- $$ = mkbin(Odas, $1, $3);
- }
- | idterms ':' type ';'
- {
- yyerror("illegal declaration");
- $$ = nil;
- }
- | idterms ':' type '=' exp ';'
- {
- yyerror("illegal declaration");
- $$ = nil;
- }
- ;
- idterms : idterm
- | idterms ',' idterm
- {
- $$ = mkbin(Oseq, $1, $3);
- }
- ;
- decl : Linclude Lsconst ';'
- {
- includef($2);
- $$ = nil;
- }
- | ids ':' Ltype type ';'
- {
- $$ = typedecl($1, $4);
- }
- | ids ':' Limport exp ';'
- {
- $$ = importdecl($4, $1);
- $$->src.start = $1->src.start;
- $$->src.stop = $5.stop;
- }
- | ids ':' type ';'
- {
- $$ = vardecl($1, $3);
- }
- | ids ':' type '=' exp ';'
- {
- $$ = mkbin(Ovardecli, vardecl($1, $3), varinit($1, $5));
- }
- | ids ':' Lcon exp ';'
- {
- $$ = condecl($1, $4);
- }
- | edecl
- ;
- edecl : ids ':' Lexcept ';'
- {
- $$ = exdecl($1, nil);
- }
- | ids ':' Lexcept '(' tuplist ')' ';'
- {
- $$ = exdecl($1, revids($5));
- }
- ;
- mdecl : ids ':' Lmodule '{' mfields '}'
- {
- $1->src.stop = $6.stop;
- $$ = moddecl($1, rotater($5));
- }
- ;
- mfields :
- {
- $$ = nil;
- }
- | mfields mfield
- {
- if($1 == nil)
- $$ = $2;
- else if($2 == nil)
- $$ = $1;
- else
- $$ = mkn(Oseq, $1, $2);
- }
- | error
- {
- $$ = nil;
- }
- ;
- mfield : ids ':' type ';'
- {
- $$ = fielddecl(Dglobal, typeids($1, $3));
- }
- | adtdecl ';'
- | ids ':' Ltype type ';'
- {
- $$ = typedecl($1, $4);
- }
- | ids ':' Lcon exp ';'
- {
- $$ = condecl($1, $4);
- }
- | edecl
- ;
- adtdecl : ids ':' Ladt polydec '{' fields '}' forpoly
- {
- $1->src.stop = $7.stop;
- $$ = adtdecl($1, rotater($6));
- $$->ty->polys = $4;
- $$->ty->val = rotater($8);
- }
- | ids ':' Ladt polydec Lfor '{' tpolys '}' '{' fields '}'
- {
- $1->src.stop = $11.stop;
- $$ = adtdecl($1, rotater($10));
- $$->ty->polys = $4;
- $$->ty->val = rotater($7);
- }
- ;
- forpoly :
- {
- $$ = nil;
- }
- | Lfor '{' tpolys '}'
- {
- $$ = $3;
- }
- ;
- fields :
- {
- $$ = nil;
- }
- | fields field
- {
- if($1 == nil)
- $$ = $2;
- else if($2 == nil)
- $$ = $1;
- else
- $$ = mkn(Oseq, $1, $2);
- }
- | error
- {
- $$ = nil;
- }
- ;
- field : dfield
- | pdecl
- | ids ':' Lcon exp ';'
- {
- $$ = condecl($1, $4);
- }
- ;
- dfields :
- {
- $$ = nil;
- }
- | dfields dfield
- {
- if($1 == nil)
- $$ = $2;
- else if($2 == nil)
- $$ = $1;
- else
- $$ = mkn(Oseq, $1, $2);
- }
- ;
- dfield : ids ':' Lcyclic type ';'
- {
- Decl *d;
- for(d = $1; d != nil; d = d->next)
- d->cyc = 1;
- $$ = fielddecl(Dfield, typeids($1, $4));
- }
- | ids ':' type ';'
- {
- $$ = fielddecl(Dfield, typeids($1, $3));
- }
- ;
- pdecl : Lpick '{' pfields '}'
- {
- $$ = $3;
- }
- ;
- pfields : pfbody dfields
- {
- $1->right->right = $2;
- $$ = $1;
- }
- | pfbody error
- {
- $$ = nil;
- }
- | error
- {
- $$ = nil;
- }
- ;
- pfbody : ptags Llabs
- {
- $$ = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, $1), nil));
- typeids($1, mktype(&$1->src.start, &$1->src.stop, Tadtpick, nil, nil));
- }
- | pfbody dfields ptags Llabs
- {
- $1->right->right = $2;
- $$ = mkn(Opickdecl, $1, mkn(Oseq, fielddecl(Dtag, $3), nil));
- typeids($3, mktype(&$3->src.start, &$3->src.stop, Tadtpick, nil, nil));
- }
- | pfbody error ptags Llabs
- {
- $$ = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, $3), nil));
- typeids($3, mktype(&$3->src.start, &$3->src.stop, Tadtpick, nil, nil));
- }
- ;
- ptags : rptags
- {
- $$ = revids($1);
- }
- ;
- rptags : Lid
- {
- $$ = mkids(&$<tok.src>1, $1, nil, nil);
- }
- | rptags Lor Lid
- {
- $$ = mkids(&$<tok.src>3, $3, nil, $1);
- }
- ;
- ids : rids
- {
- $$ = revids($1);
- }
- ;
- rids : Lid
- {
- $$ = mkids(&$<tok.src>1, $1, nil, nil);
- }
- | rids ',' Lid
- {
- $$ = mkids(&$<tok.src>3, $3, nil, $1);
- }
- ;
- fixtype : Lfix '(' exp ',' exp ')'
- {
- $$ = mktype(&$1.start, &$6.stop, Tfix, nil, nil);
- $$->val = mkbin(Oseq, $3, $5);
- }
- | Lfix '(' exp ')'
- {
- $$ = mktype(&$1.start, &$4.stop, Tfix, nil, nil);
- $$->val = $3;
- }
- ;
- types : type
- {
- $$ = addtype($1, nil);
- }
- | Lcyclic type
- {
- $$ = addtype($2, nil);
- $2->flags |= CYCLIC;
- }
- | types ',' type
- {
- $$ = addtype($3, $1);
- }
- | types ',' Lcyclic type
- {
- $$ = addtype($4, $1);
- $4->flags |= CYCLIC;
- }
- ;
- type : Ltid
- {
- $$ = mkidtype(&$<tok.src>1, $1);
- }
- | iditype
- {
- $$ = $1;
- }
- | dotiditype
- {
- $$ = $1;
- }
- | type Lmdot Lid
- {
- $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
- }
- | type Lmdot Lid '[' types ']'
- {
- $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
- $$ = mkinsttype(&$1->src, $$, $5);
- }
- | Lref type
- {
- $$ = mktype(&$1.start, &$2->src.stop, Tref, $2, nil);
- }
- | Lchan Lof type
- {
- $$ = mktype(&$1.start, &$3->src.stop, Tchan, $3, nil);
- }
- | '(' tuplist ')'
- {
- if($2->next == nil)
- $$ = $2->ty;
- else
- $$ = mktype(&$1.start, &$3.stop, Ttuple, nil, revids($2));
- }
- | Larray Lof type
- {
- $$ = mktype(&$1.start, &$3->src.stop, Tarray, $3, nil);
- }
- | Llist Lof type
- {
- $$ = mktype(&$1.start, &$3->src.stop, Tlist, $3, nil);
- }
- | Lfn polydec fnargretp raises
- {
- $3->src.start = $1.start;
- $3->polys = $2;
- $3->u.eraises = $4;
- $$ = $3;
- }
- | fixtype
- /*
- | Lexcept
- {
- $$ = mktype(&$1.start, &$1.stop, Texception, nil, nil);
- $$->cons = 1;
- }
- | Lexcept '(' tuplist ')'
- {
- $$ = mktype(&$1.start, &$4.stop, Texception, nil, revids($3));
- $$->cons = 1;
- }
- */
- ;
- iditype : Lid
- {
- $$ = mkidtype(&$<tok.src>1, $1);
- }
- | Lid '[' types ']'
- {
- $$ = mkinsttype(&$<tok.src>1, mkidtype(&$<tok.src>1, $1), $3);
- }
- ;
- dotiditype : type '.' Lid
- {
- $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
- }
- | type '.' Lid '[' types ']'
- {
- $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
- $$ = mkinsttype(&$1->src, $$, $5);
- }
- ;
- tuplist : type
- {
- $$ = mkids(&$1->src, nil, $1, nil);
- }
- | tuplist ',' type
- {
- $$ = mkids(&$1->src, nil, $3, $1);
- }
- ;
- polydec :
- {
- $$ = nil;
- }
- | '[' ids ']'
- {
- $$ = polydecl($2);
- }
- ;
- fnarg : '(' forms ')'
- {
- $$ = mktype(&$1.start, &$3.stop, Tfn, tnone, $2);
- }
- | '(' '*' ')'
- {
- $$ = mktype(&$1.start, &$3.stop, Tfn, tnone, nil);
- $$->varargs = 1;
- }
- | '(' ftypes ',' '*' ')'
- {
- $$ = mktype(&$1.start, &$5.stop, Tfn, tnone, $2);
- $$->varargs = 1;
- }
- ;
- fnargret: fnarg %prec ':'
- {
- $$ = $1;
- }
- | fnarg ':' type
- {
- $1->tof = $3;
- $1->src.stop = $3->src.stop;
- $$ = $1;
- }
- ;
- fnargretp: fnargret %prec '='
- {
- $$ = $1;
- }
- | fnargret Lfor '{' tpolys '}'
- {
- $$ = $1;
- $$->val = rotater($4);
- }
- ;
- forms :
- {
- $$ = nil;
- }
- | ftypes
- ;
- ftypes : ftype
- | ftypes ',' ftype
- {
- $$ = appdecls($1, $3);
- }
- ;
- ftype : nids ':' type
- {
- $$ = typeids($1, $3);
- }
- | nids ':' adtk
- {
- Decl *d;
- $$ = typeids($1, $3);
- for(d = $$; d != nil; d = d->next)
- d->implicit = 1;
- }
- | idterms ':' type
- {
- $$ = mkids(&$1->src, enter("junk", 0), $3, nil);
- $$->store = Darg;
- yyerror("illegal argument declaraion");
- }
- | idterms ':' adtk
- {
- $$ = mkids(&$1->src, enter("junk", 0), $3, nil);
- $$->store = Darg;
- yyerror("illegal argument declaraion");
- }
- ;
- nids : nrids
- {
- $$ = revids($1);
- }
- ;
- nrids : Lid
- {
- $$ = mkids(&$<tok.src>1, $1, nil, nil);
- $$->store = Darg;
- }
- | Lnil
- {
- $$ = mkids(&$1, nil, nil, nil);
- $$->store = Darg;
- }
- | nrids ',' Lid
- {
- $$ = mkids(&$<tok.src>3, $3, nil, $1);
- $$->store = Darg;
- }
- | nrids ',' Lnil
- {
- $$ = mkids(&$3, nil, nil, $1);
- $$->store = Darg;
- }
- ;
- /*
- adttype : Lid
- {
- $$ = mkidtype(&$<tok.src>1, $1);
- }
- | adttype '.' Lid
- {
- $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
- }
- | adttype Lmdot Lid
- {
- $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
- }
- | Lref adttype
- {
- $$ = mktype(&$1.start, &$2->src.stop, Tref, $2, nil);
- }
- ;
- adtk : Lself adttype
- {
- $$ = $2;
- }
- ;
- */
- adtk : Lself iditype
- {
- $$ = $2;
- }
- | Lself Lref iditype
- {
- $$ = mktype(&$<tok.src>2.start, &$<tok.src>3.stop, Tref, $3, nil);
- }
- | Lself dotiditype
- {
- $$ = $2;
- }
- | Lself Lref dotiditype
- {
- $$ = mktype(&$<tok.src>2.start, &$<tok.src>3.stop, Tref, $3, nil);
- }
- ;
- fndef : fnname fnargretp raises fbody
- {
- $$ = fndecl($1, $2, $4);
- nfns++;
- /* patch up polydecs */
- if($1->op == Odot){
- if($1->right->left != nil){
- $2->polys = $1->right->left->decl;
- $1->right->left = nil;
- }
- if($1->left->op == Oname && $1->left->left != nil){
- $$->decl = $1->left->left->decl;
- $1->left->left = nil;
- }
- }
- else{
- if($1->left != nil){
- $2->polys = $1->left->decl;
- $1->left = nil;
- }
- }
- $2->u.eraises = $3;
- $$->src = $1->src;
- }
- ;
- raises : Lraises '(' idlist ')'
- {
- $$ = mkn(Otuple, rotater($3), nil);
- $$->src.start = $1.start;
- $$->src.stop = $4.stop;
- }
- | Lraises idatom
- {
- $$ = mkn(Otuple, mkunary(Oseq, $2), nil);
- $$->src.start = $1.start;
- $$->src.stop = $2->src.stop;
- }
- | /* empty */ %prec Lraises
- {
- $$ = nil;
- }
- ;
- fbody : '{' stmts '}'
- {
- if($2 == nil){
- $2 = mkn(Onothing, nil, nil);
- $2->src.start = curline();
- $2->src.stop = $2->src.start;
- }
- $$ = rotater($2);
- $$->src.start = $1.start;
- $$->src.stop = $3.stop;
- }
- | error '}'
- {
- $$ = mkn(Onothing, nil, nil);
- }
- | error '{' stmts '}'
- {
- $$ = mkn(Onothing, nil, nil);
- }
- ;
- fnname : Lid polydec
- {
- $$ = mkname(&$<tok.src>1, $1);
- if($2 != nil){
- $$->left = mkn(Onothing, nil ,nil);
- $$->left->decl = $2;
- }
- }
- | fnname '.' Lid polydec
- {
- $$ = mkbin(Odot, $1, mkname(&$<tok.src>3, $3));
- if($4 != nil){
- $$->right->left = mkn(Onothing, nil ,nil);
- $$->right->left->decl = $4;
- }
- }
- ;
- stmts :
- {
- $$ = nil;
- }
- | stmts decl
- {
- if($1 == nil)
- $$ = $2;
- else if($2 == nil)
- $$ = $1;
- else
- $$ = mkbin(Oseq, $1, $2);
- }
- | stmts stmt
- {
- if($1 == nil)
- $$ = $2;
- else
- $$ = mkbin(Oseq, $1, $2);
- }
- ;
- elists : '(' elist ')'
- | elists ',' '(' elist ')'
- ;
- stmt : error ';'
- {
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = curline();
- $$->src.stop = $$->src.start;
- }
- | error '}'
- {
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = curline();
- $$->src.stop = $$->src.start;
- }
- | error '{' stmts '}'
- {
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = curline();
- $$->src.stop = $$->src.start;
- }
- | '{' stmts '}'
- {
- if($2 == nil){
- $2 = mkn(Onothing, nil, nil);
- $2->src.start = curline();
- $2->src.stop = $2->src.start;
- }
- $$ = mkscope(rotater($2));
- }
- | elists ':' type ';'
- {
- yyerror("illegal declaration");
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = curline();
- $$->src.stop = $$->src.start;
- }
- | elists ':' type '=' exp';'
- {
- yyerror("illegal declaration");
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = curline();
- $$->src.stop = $$->src.start;
- }
- | zexp ';'
- {
- $$ = $1;
- }
- | Lif '(' exp ')' stmt
- {
- $$ = mkn(Oif, $3, mkunary(Oseq, $5));
- $$->src.start = $1.start;
- $$->src.stop = $5->src.stop;
- }
- | Lif '(' exp ')' stmt Lelse stmt
- {
- $$ = mkn(Oif, $3, mkbin(Oseq, $5, $7));
- $$->src.start = $1.start;
- $$->src.stop = $7->src.stop;
- }
- | bclab Lfor '(' zexp ';' zexp ';' zexp ')' stmt
- {
- $$ = mkunary(Oseq, $10);
- if($8->op != Onothing)
- $$->right = $8;
- $$ = mkbin(Ofor, $6, $$);
- $$->decl = $1;
- if($4->op != Onothing)
- $$ = mkbin(Oseq, $4, $$);
- }
- | bclab Lwhile '(' zexp ')' stmt
- {
- $$ = mkn(Ofor, $4, mkunary(Oseq, $6));
- $$->src.start = $2.start;
- $$->src.stop = $6->src.stop;
- $$->decl = $1;
- }
- | bclab Ldo stmt Lwhile '(' zexp ')' ';'
- {
- $$ = mkn(Odo, $6, $3);
- $$->src.start = $2.start;
- $$->src.stop = $7.stop;
- $$->decl = $1;
- }
- | Lbreak bctarg ';'
- {
- $$ = mkn(Obreak, nil, nil);
- $$->decl = $2;
- $$->src = $1;
- }
- | Lcont bctarg ';'
- {
- $$ = mkn(Ocont, nil, nil);
- $$->decl = $2;
- $$->src = $1;
- }
- | Lreturn zexp ';'
- {
- $$ = mkn(Oret, $2, nil);
- $$->src = $1;
- if($2->op == Onothing)
- $$->left = nil;
- else
- $$->src.stop = $2->src.stop;
- }
- | Lspawn exp ';'
- {
- $$ = mkn(Ospawn, $2, nil);
- $$->src.start = $1.start;
- $$->src.stop = $2->src.stop;
- }
- | Lraise zexp ';'
- {
- $$ = mkn(Oraise, $2, nil);
- $$->src.start = $1.start;
- $$->src.stop = $2->src.stop;
- }
- | bclab Lcase exp '{' cqstmts '}'
- {
- $$ = mkn(Ocase, $3, caselist($5, nil));
- $$->src = $3->src;
- $$->decl = $1;
- }
- | bclab Lalt '{' qstmts '}'
- {
- $$ = mkn(Oalt, caselist($4, nil), nil);
- $$->src = $2;
- $$->decl = $1;
- }
- | bclab Lpick Lid Ldeclas exp '{' pstmts '}'
- {
- $$ = mkn(Opick, mkbin(Odas, mkname(&$<tok.src>3, $3), $5), caselist($7, nil));
- $$->src.start = $<tok.src>3.start;
- $$->src.stop = $5->src.stop;
- $$->decl = $1;
- }
- | Lexit ';'
- {
- $$ = mkn(Oexit, nil, nil);
- $$->src = $1;
- }
- | '{' stmts '}' Lexcept idexc '{' eqstmts '}'
- {
- if($2 == nil){
- $2 = mkn(Onothing, nil, nil);
- $2->src.start = curline();
- $2->src.stop = curline();
- }
- $2 = mkscope(rotater($2));
- $$ = mkbin(Oexstmt, $2, mkn(Oexcept, $5, caselist($7, nil)));
- }
- /*
- | stmt Lexcept idexc '{' eqstmts '}'
- {
- $$ = mkbin(Oexstmt, $1, mkn(Oexcept, $3, caselist($5, nil)));
- }
- */
- ;
- bclab :
- {
- $$ = nil;
- }
- | ids ':'
- {
- if($1->next != nil)
- yyerror("only one identifier allowed in a label");
- $$ = $1;
- }
- ;
- bctarg :
- {
- $$ = nil;
- }
- | Lid
- {
- $$ = mkids(&$<tok.src>1, $1, nil, nil);
- }
- ;
- qstmts : qbodies stmts
- {
- $1->left->right->right = $2;
- $$ = $1;
- }
- ;
- qbodies : qual Llabs
- {
- $$ = mkunary(Oseq, mkscope(mkunary(Olabel, rotater($1))));
- }
- | qbodies stmts qual Llabs
- {
- $1->left->right->right = $2;
- $$ = mkbin(Oseq, mkscope(mkunary(Olabel, rotater($3))), $1);
- }
- ;
- cqstmts : cqbodies stmts
- {
- $1->left->right = mkscope($2);
- $$ = $1;
- }
- ;
- cqbodies : qual Llabs
- {
- $$ = mkunary(Oseq, mkunary(Olabel, rotater($1)));
- }
- | cqbodies stmts qual Llabs
- {
- $1->left->right = mkscope($2);
- $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1);
- }
- ;
- eqstmts : eqbodies stmts
- {
- $1->left->right = mkscope($2);
- $$ = $1;
- }
- ;
- eqbodies : qual Llabs
- {
- $$ = mkunary(Oseq, mkunary(Olabel, rotater($1)));
- }
- | eqbodies stmts qual Llabs
- {
- $1->left->right = mkscope($2);
- $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1);
- }
- ;
- qual : exp
- | exp Lto exp
- {
- $$ = mkbin(Orange, $1, $3);
- }
- | '*'
- {
- $$ = mkn(Owild, nil, nil);
- $$->src = $1;
- }
- | qual Lor qual
- {
- $$ = mkbin(Oseq, $1, $3);
- }
- | error
- {
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = curline();
- $$->src.stop = $$->src.start;
- }
- ;
- pstmts : pbodies stmts
- {
- $1->left->right = mkscope($2);
- $$ = $1;
- }
- ;
- pbodies : pqual Llabs
- {
- $$ = mkunary(Oseq, mkunary(Olabel, rotater($1)));
- }
- | pbodies stmts pqual Llabs
- {
- $1->left->right = mkscope($2);
- $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1);
- }
- ;
- pqual : Lid
- {
- $$ = mkname(&$<tok>1.src, $1);
- }
- | '*'
- {
- $$ = mkn(Owild, nil, nil);
- $$->src = $1;
- }
- | pqual Lor pqual
- {
- $$ = mkbin(Oseq, $1, $3);
- }
- | error
- {
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = curline();
- $$->src.stop = $$->src.start;
- }
- ;
- zexp :
- {
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = curline();
- $$->src.stop = $$->src.start;
- }
- | exp
- ;
- exp : monexp
- | exp '=' exp
- {
- $$ = mkbin(Oas, $1, $3);
- }
- | exp Landeq exp
- {
- $$ = mkbin(Oandas, $1, $3);
- }
- | exp Loreq exp
- {
- $$ = mkbin(Ooras, $1, $3);
- }
- | exp Lxoreq exp
- {
- $$ = mkbin(Oxoras, $1, $3);
- }
- | exp Llsheq exp
- {
- $$ = mkbin(Olshas, $1, $3);
- }
- | exp Lrsheq exp
- {
- $$ = mkbin(Orshas, $1, $3);
- }
- | exp Laddeq exp
- {
- $$ = mkbin(Oaddas, $1, $3);
- }
- | exp Lsubeq exp
- {
- $$ = mkbin(Osubas, $1, $3);
- }
- | exp Lmuleq exp
- {
- $$ = mkbin(Omulas, $1, $3);
- }
- | exp Ldiveq exp
- {
- $$ = mkbin(Odivas, $1, $3);
- }
- | exp Lmodeq exp
- {
- $$ = mkbin(Omodas, $1, $3);
- }
- | exp Lexpeq exp
- {
- $$ = mkbin(Oexpas, $1, $3);
- }
- | exp Lcomm '=' exp
- {
- $$ = mkbin(Osnd, $1, $4);
- }
- | exp Ldeclas exp
- {
- $$ = mkbin(Odas, $1, $3);
- }
- | Lload Lid exp %prec Lload
- {
- $$ = mkn(Oload, $3, nil);
- $$->src.start = $<tok.src.start>1;
- $$->src.stop = $3->src.stop;
- $$->ty = mkidtype(&$<tok.src>2, $2);
- }
- | exp Lexp exp
- {
- $$ = mkbin(Oexp, $1, $3);
- }
- | exp '*' exp
- {
- $$ = mkbin(Omul, $1, $3);
- }
- | exp '/' exp
- {
- $$ = mkbin(Odiv, $1, $3);
- }
- | exp '%' exp
- {
- $$ = mkbin(Omod, $1, $3);
- }
- | exp '+' exp
- {
- $$ = mkbin(Oadd, $1, $3);
- }
- | exp '-' exp
- {
- $$ = mkbin(Osub, $1, $3);
- }
- | exp Lrsh exp
- {
- $$ = mkbin(Orsh, $1, $3);
- }
- | exp Llsh exp
- {
- $$ = mkbin(Olsh, $1, $3);
- }
- | exp '<' exp
- {
- $$ = mkbin(Olt, $1, $3);
- }
- | exp '>' exp
- {
- $$ = mkbin(Ogt, $1, $3);
- }
- | exp Lleq exp
- {
- $$ = mkbin(Oleq, $1, $3);
- }
- | exp Lgeq exp
- {
- $$ = mkbin(Ogeq, $1, $3);
- }
- | exp Leq exp
- {
- $$ = mkbin(Oeq, $1, $3);
- }
- | exp Lneq exp
- {
- $$ = mkbin(Oneq, $1, $3);
- }
- | exp '&' exp
- {
- $$ = mkbin(Oand, $1, $3);
- }
- | exp '^' exp
- {
- $$ = mkbin(Oxor, $1, $3);
- }
- | exp '|' exp
- {
- $$ = mkbin(Oor, $1, $3);
- }
- | exp Lcons exp
- {
- $$ = mkbin(Ocons, $1, $3);
- }
- | exp Landand exp
- {
- $$ = mkbin(Oandand, $1, $3);
- }
- | exp Loror exp
- {
- $$ = mkbin(Ooror, $1, $3);
- }
- ;
- monexp : term
- | '+' monexp
- {
- $2->src.start = $1.start;
- $$ = $2;
- }
- | '-' monexp
- {
- $$ = mkunary(Oneg, $2);
- $$->src.start = $1.start;
- }
- | '!' monexp
- {
- $$ = mkunary(Onot, $2);
- $$->src.start = $1.start;
- }
- | '~' monexp
- {
- $$ = mkunary(Ocomp, $2);
- $$->src.start = $1.start;
- }
- | '*' monexp
- {
- $$ = mkunary(Oind, $2);
- $$->src.start = $1.start;
- }
- | Linc monexp
- {
- $$ = mkunary(Opreinc, $2);
- $$->src.start = $1.start;
- }
- | Ldec monexp
- {
- $$ = mkunary(Opredec, $2);
- $$->src.start = $1.start;
- }
- | Lcomm monexp
- {
- $$ = mkunary(Orcv, $2);
- $$->src.start = $1.start;
- }
- | Lhd monexp
- {
- $$ = mkunary(Ohd, $2);
- $$->src.start = $1.start;
- }
- | Ltl monexp
- {
- $$ = mkunary(Otl, $2);
- $$->src.start = $1.start;
- }
- | Llen monexp
- {
- $$ = mkunary(Olen, $2);
- $$->src.start = $1.start;
- }
- | Lref monexp
- {
- $$ = mkunary(Oref, $2);
- $$->src.start = $1.start;
- }
- | Ltagof monexp
- {
- $$ = mkunary(Otagof, $2);
- $$->src.start = $1.start;
- }
- | Larray '[' exp ']' Lof type
- {
- $$ = mkn(Oarray, $3, nil);
- $$->ty = mktype(&$1.start, &$6->src.stop, Tarray, $6, nil);
- $$->src = $$->ty->src;
- }
- | Larray '[' exp ']' Lof '{' initlist '}'
- {
- $$ = mkn(Oarray, $3, $7);
- $$->src.start = $1.start;
- $$->src.stop = $8.stop;
- }
- | Larray '[' ']' Lof '{' initlist '}'
- {
- $$ = mkn(Onothing, nil, nil);
- $$->src.start = $2.start;
- $$->src.stop = $3.stop;
- $$ = mkn(Oarray, $$, $6);
- $$->src.start = $1.start;
- $$->src.stop = $7.stop;
- }
- | Llist Lof '{' celist '}'
- {
- $$ = etolist($4);
- $$->src.start = $1.start;
- $$->src.stop = $5.stop;
- }
- | Lchan Lof type
- {
- $$ = mkn(Ochan, nil, nil);
- $$->ty = mktype(&$1.start, &$3->src.stop, Tchan, $3, nil);
- $$->src = $$->ty->src;
- }
- | Lchan '[' exp ']' Lof type
- {
- $$ = mkn(Ochan, $3, nil);
- $$->ty = mktype(&$1.start, &$6->src.stop, Tchan, $6, nil);
- $$->src = $$->ty->src;
- }
- | Larray Lof Ltid monexp
- {
- $$ = mkunary(Ocast, $4);
- $$->ty = mktype(&$1.start, &$4->src.stop, Tarray, mkidtype(&$<tok.src>3, $3), nil);
- $$->src = $$->ty->src;
- }
- | Ltid monexp
- {
- $$ = mkunary(Ocast, $2);
- $$->src.start = $<tok.src>1.start;
- $$->ty = mkidtype(&$$->src, $1);
- }
- | Lid monexp
- {
- $$ = mkunary(Ocast, $2);
- $$->src.start = $<tok.src>1.start;
- $$->ty = mkidtype(&$$->src, $1);
- }
- | fixtype monexp
- {
- $$ = mkunary(Ocast, $2);
- $$->src.start = $<tok.src>1.start;
- $$->ty = $1;
- }
- ;
- term : idatom
- | term '(' zelist ')'
- {
- $$ = mkn(Ocall, $1, $3);
- $$->src.start = $1->src.start;
- $$->src.stop = $4.stop;
- }
- | '(' elist ')'
- {
- $$ = $2;
- if($2->op == Oseq)
- $$ = mkn(Otuple, rotater($2), nil);
- else
- $$->flags |= PARENS;
- $$->src.start = $1.start;
- $$->src.stop = $3.stop;
- }
- | term '.' Lid
- {
- $$ = mkbin(Odot, $1, mkname(&$<tok.src>3, $3));
- }
- | term Lmdot term
- {
- $$ = mkbin(Omdot, $1, $3);
- }
- | term '[' export ']'
- {
- $$ = mkbin(Oindex, $1, $3);
- $$->src.stop = $4.stop;
- }
- | term '[' zexp ':' zexp ']'
- {
- if($3->op == Onothing)
- $3->src = $4;
- if($5->op == Onothing)
- $5->src = $4;
- $$ = mkbin(Oslice, $1, mkbin(Oseq, $3, $5));
- $$->src.stop = $6.stop;
- }
- | term Linc
- {
- $$ = mkunary(Oinc, $1);
- $$->src.stop = $2.stop;
- }
- | term Ldec
- {
- $$ = mkunary(Odec, $1);
- $$->src.stop = $2.stop;
- }
- | Lsconst
- {
- $$ = mksconst(&$<tok.src>1, $1);
- }
- | Lconst
- {
- $$ = mkconst(&$<tok.src>1, $1);
- if($1 > 0x7fffffff || $1 < -0x7fffffff)
- $$->ty = tbig;
- $$ = $$;
- }
- | Lrconst
- {
- $$ = mkrconst(&$<tok.src>1, $1);
- }
- | term '[' exportlist ',' export ']'
- {
- $$ = mkbin(Oindex, $1, rotater(mkbin(Oseq, $3, $5)));
- $$->src.stop = $6.stop;
- }
- ;
- idatom : Lid
- {
- $$ = mkname(&$<tok.src>1, $1);
- }
- | Lnil
- {
- $$ = mknil(&$<tok.src>1);
- }
- ;
- idterm : '(' idlist ')'
- {
- $$ = mkn(Otuple, rotater($2), nil);
- $$->src.start = $1.start;
- $$->src.stop = $3.stop;
- }
- ;
- exportlist : export
- | exportlist ',' export
- {
- $$ = mkbin(Oseq, $1, $3);
- }
- ;
- export : exp
- | texp
- ;
- texp : Ltid
- {
- $$ = mkn(Otype, nil, nil);
- $$->ty = mkidtype(&$<tok.src>1, $1);
- $$->src = $$->ty->src;
- }
- | Larray Lof type
- {
- $$ = mkn(Otype, nil, nil);
- $$->ty = mktype(&$1.start, &$3->src.stop, Tarray, $3, nil);
- $$->src = $$->ty->src;
- }
- | Llist Lof type
- {
- $$ = mkn(Otype, nil, nil);
- $$->ty = mktype(&$1.start, &$3->src.stop, Tlist, $3, nil);
- $$->src = $$->ty->src;
- }
- | Lcyclic type
- {
- $$ = mkn(Otype, nil ,nil);
- $$->ty = $2;
- $$->ty->flags |= CYCLIC;
- $$->src = $$->ty->src;
- }
- ;
- idexc : Lid
- {
- $$ = mkname(&$<tok.src>1, $1);
- }
- | /* empty */
- {
- $$ = nil;
- }
- ;
- idlist : idterm
- | idatom
- | idlist ',' idterm
- {
- $$ = mkbin(Oseq, $1, $3);
- }
- | idlist ',' idatom
- {
- $$ = mkbin(Oseq, $1, $3);
- }
- ;
- zelist :
- {
- $$ = nil;
- }
- | elist
- {
- $$ = rotater($1);
- }
- ;
- celist : elist
- | elist ','
- ;
- elist : exp
- | elist ',' exp
- {
- $$ = mkbin(Oseq, $1, $3);
- }
- ;
- initlist : elemlist
- {
- $$ = rotater($1);
- }
- | elemlist ','
- {
- $$ = rotater($1);
- }
- ;
- elemlist : elem
- | elemlist ',' elem
- {
- $$ = mkbin(Oseq, $1, $3);
- }
- ;
- elem : exp
- {
- $$ = mkn(Oelem, nil, $1);
- $$->src = $1->src;
- }
- | qual Llabs exp
- {
- $$ = mkbin(Oelem, rotater($1), $3);
- }
- ;
- /*
- tpoly : ids Llabs '{' dfields '}'
- {
- $$ = typedecl($1, mktype(&$1->src.start, &$5.stop, Tpoly, nil, nil));
- $$->left = rotater($4);
- }
- ;
- tpolys : tpoly
- {
- $$ = $1;
- }
- | tpolys tpoly
- {
- $$ = mkbin(Oseq, $1, $2);
- }
- ;
- */
- tpolys : tpoly dfields
- {
- if($1->op == Oseq)
- $1->right->left = rotater($2);
- else
- $1->left = rotater($2);
- $$ = $1;
- }
- ;
- tpoly : ids Llabs
- {
- $$ = typedecl($1, mktype(&$1->src.start, &$2.stop, Tpoly, nil, nil));
- }
- | tpoly dfields ids Llabs
- {
- if($1->op == Oseq)
- $1->right->left = rotater($2);
- else
- $1->left = rotater($2);
- $$ = mkbin(Oseq, $1, typedecl($3, mktype(&$3->src.start, &$4.stop, Tpoly, nil, nil)));
- }
- ;
- %%
- static char *mkfileext(char*, char*, char*);
- static void usage(void);
- static int dosym;
- static int toterrors;
- static ulong canonnanbits[] = { 0x7fffffff, 0xffffffff};
- static char* infile;
- #define SLASHMOD "/module"
- static char*
- getroot(void)
- {
- int n;
- char *e, *l, *s;
- if((e = getenv("EMU")) != nil){
- for(s = e; *e != '\0'; e++){
- if(*e == '-' && *(e+1) == 'r' && (e == s || *(e-1) == ' ' || *(e-1) == '\t')){
- e += 2;
- l = strchr(e, ' ');
- if(l != nil)
- *l = '\0';
- if((n = strlen(e)) > 0){
- s = malloc(n+1);
- strcpy(s, e);
- return s;
- }
- }
- }
- }
- if((e = getenv("ROOT")) != nil)
- return strdup(e);
- return nil;
- }
- void
- main(int argc, char *argv[])
- {
- char *s, *ofile, *ext, *root;
- int i;
- FPinit();
- FPcontrol(0, INVAL|ZDIV|OVFL|UNFL|INEX);
- canonnan = canontod(canonnanbits);
- fmtinstall('D', dotconv);
- fmtinstall('I', instconv);
- fmtinstall('K', declconv);
- fmtinstall('k', storeconv);
- fmtinstall('L', lineconv);
- fmtinstall('M', mapconv);
- fmtinstall('n', nodeconv); /* exp structure */
- fmtinstall('O', opconv);
- fmtinstall('g', gfltconv);
- fmtinstall('Q', etconv); /* src expression with type */
- fmtinstall('R', ctypeconv); /* c equivalent type */
- fmtinstall('P', ctypeconv); /* c equivalent type - pointer type */
- fmtinstall('T', typeconv); /* source style types */
- fmtinstall('t', stypeconv); /* structurally descriptive type */
- fmtinstall('U', srcconv);
- fmtinstall('v', expconv); /* src expression */
- fmtinstall('V', expconv); /* src expression in '' */
- lexinit();
- typeinit();
- optabinit();
- gendis = 1;
- asmsym = 0;
- maxerr = 20;
- ofile = nil;
- ext = nil;
- ARGBEGIN{
- case 'D':
- /*
- * debug flags:
- *
- * a alt compilation
- * A array constructor compilation
- * b boolean and branch compilation
- * c case compilation
- * d function declaration
- * D descriptor generation
- * e expression compilation
- * E addressable expression compilation
- * f print arguments for compiled functions
- * F constant folding
- * g print out globals
- * m module declaration and type checking
- * n nil references
- * s print sizes of output file sections
- * S type signing
- * t type checking function bodies
- * T timing
- * v global var and constant compilation
- * x adt verification
- * Y tuple compilation
- * z Z bug fixes
- */
- s = ARGF();
- while(s && *s)
- debug[*s++] = 1;
- break;
- case 'I':
- s = ARGF();
- if(s == nil)
- usage();
- addinclude(s);
- break;
- case 'G':
- asmsym = 1;
- break;
- case 'S':
- gendis = 0;
- break;
- case 'a':
- emitstub = 1;
- break;
- case 'A':
- emitstub = emitdyn = 1;
- break;
- case 'c':
- mustcompile = 1;
- break;
- case 'C':
- dontcompile = 1;
- break;
- case 'e':
- maxerr = 1000;
- break;
- case 'f':
- isfatal = 1;
- break;
- case 'F':
- newfnptr = 1;
- break;
- case 'g':
- dosym = 1;
- break;
- case 'i':
- dontinline = 1;
- break;
- case 'o':
- ofile = ARGF();
- break;
- case 'O':
- optims = 1;
- break;
- case 's':
- s = ARGF();
- if(s != nil)
- fixss = atoi(s);
- break;
- case 't':
- emittab = ARGF();
- if(emittab == nil)
- usage();
- break;
- case 'T':
- emitcode = ARGF();
- if(emitcode == nil)
- usage();
- break;
- case 'd':
- emitcode = ARGF();
- if(emitcode == nil)
- usage();
- emitdyn = 1;
- break;
- case 'w':
- superwarn = dowarn;
- dowarn = 1;
- break;
- case 'x':
- ext = ARGF();
- break;
- case 'X':
- signdump = ARGF();
- break;
- case 'y':
- oldcycles = 1;
- break;
- case 'z':
- arrayz = 1;
- break;
- default:
- usage();
- break;
- }ARGEND
- if((root = getroot()) != nil){
- char *r;
- r = malloc(strlen(root)+strlen(SLASHMOD)+1);
- strcpy(r, root);
- strcat(r, SLASHMOD);
- addinclude(r);
- free(root);
- }
- else
- addinclude(INCPATH);
- if(argc == 0){
- usage();
- }else if(ofile != nil){
- if(argc != 1)
- usage();
- translate(argv[0], ofile, mkfileext(ofile, ".dis", ".sbl"));
- }else{
- if(ext == nil){
- ext = ".s";
- if(gendis)
- ext = ".dis";
- }
- for(i = 0; i < argc; i++){
- s = strrchr(argv[i], '/');
- if(s == nil)
- s = argv[i];
- else
- s++;
- if(argc > 1)
- print("%s:\n", argv[i]);
- ofile = mkfileext(s, ".b", ext);
- translate(argv[i], ofile, mkfileext(ofile, ext, ".sbl"));
- }
- }
- if(toterrors)
- exits("errors");
- exits(0);
- }
- static void
- usage(void)
- {
- fprint(2, "usage: limbo [-CGSacgwe] [-I incdir] [-o outfile] [-{T|t|d} module] [-D debug] file ...\n");
- exits("usage");
- }
- static char*
- mkfileext(char *file, char *oldext, char *ext)
- {
- char *ofile;
- int n, n2;
- n = strlen(file);
- n2 = strlen(oldext);
- if(n >= n2 && strcmp(&file[n-n2], oldext) == 0)
- n -= n2;
- ofile = malloc(n + strlen(ext) + 1);
- memmove(ofile, file, n);
- strcpy(ofile+n, ext);
- return ofile;
- }
- void
- translate(char *in, char *out, char *dbg)
- {
- Decl *entry;
- int doemit;
- infile = in;
- outfile = out;
- symfile = dbg;
- errors = 0;
- bins[0] = Bopen(in, OREAD);
- if(bins[0] == nil){
- fprint(2, "can't open %s: %r\n", in);
- toterrors++;
- return;
- }
- doemit = emitstub || emittab || emitcode;
- if(!doemit){
- bout = Bopen(out, OWRITE);
- if(bout == nil){
- fprint(2, "can't open %s: %r\n", out);
- toterrors++;
- Bterm(bins[0]);
- return;
- }
- if(dosym){
- bsym = Bopen(dbg, OWRITE);
- if(bsym == nil)
- fprint(2, "can't open %s: %r\n", dbg);
- }
- }
- lexstart(in);
- popscopes();
- typestart();
- declstart();
- yyparse();
- entry = typecheck(!doemit);
- modcom(entry);
- fns = nil;
- nfns = 0;
- descriptors = nil;
- if(bout != nil)
- Bterm(bout);
- if(bsym != nil)
- Bterm(bsym);
- toterrors += errors;
- if(errors && bout != nil)
- remove(out);
- if(errors && bsym != nil)
- remove(dbg);
- }
- void
- trapFPE(unsigned exception[5], int value[2])
- {
- /* can't happen; it's just here to keep FPinit happy. */
- USED(exception);
- USED(value);
- }
- static char *
- win2inf(char *s)
- {
- int nt = 0;
- char *t;
- if(strlen(s) > 1 && s[1] == ':'){
- s[1] = '/';
- s++;
- nt = 1;
- }
- for(t = s; *t != '\0'; t++){
- if(*t == '\\')
- *t = '/';
- if(nt)
- *t = tolower(*t);
- }
- return s;
- }
- static char *
- cleann(char *s)
- {
- char *p, *r, *t;
- char buf[256];
- r = t = malloc(strlen(s)+1);
- strcpy(t, s);
- t = win2inf(t);
- if(*t != '/'){
- p = win2inf(getwd(buf, sizeof(buf)));
- s = malloc(strlen(p)+strlen(t)+2);
- strcpy(s, p);
- strcat(s, "/");
- strcat(s, t);
- }
- else{
- s = malloc(strlen(t)+1);
- strcpy(s, t);
- }
- free(r);
- /* print("cleann: %s\n", p); */
- return cleanname(s);
- }
- char *
- srcpath(char *name, int nlen)
- {
- int l1, l2;
- char *r, *srcp, *t;
- srcp = cleann(infile);
- r = getroot();
- if(r == nil){
- l1 = strlen(INCPATH);
- r = malloc(l1+1);
- strcpy(r, INCPATH);
- if(l1 >= strlen(SLASHMOD) && strcmp(r+l1-strlen(SLASHMOD), SLASHMOD) == 0)
- r[l1-strlen(SLASHMOD)] = '\0';
- }
- t = cleann(r);
- free(r);
- r = t;
- /* srcp relative to r */
- l1 = strlen(srcp);
- l2 = strlen(r);
- if(l1 >= l2 && strncmp(srcp, r, l2) == 0){
- /* nothing to do */
- }else
- l2 = 0;
- strncpy(name, srcp+l2, nlen);
- name[nlen-1] = '\0';
- free(r);
- free(srcp);
- /* print("srcpath: %s\n", name); */
- return name;
- }
|