limbo.y 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995
  1. %{
  2. #include "limbo.h"
  3. %}
  4. %union
  5. {
  6. struct{
  7. Src src;
  8. union{
  9. Sym *idval;
  10. Long ival;
  11. Real rval;
  12. }v;
  13. }tok;
  14. Decl *ids;
  15. Node *node;
  16. Type *type;
  17. Typelist *types;
  18. }
  19. %type <type> type fnarg fnargret fnargretp adtk fixtype iditype dotiditype
  20. %type <ids> ids rids nids nrids tuplist forms ftypes ftype
  21. bclab bctarg ptags rptags polydec
  22. %type <node> zexp exp monexp term elist zelist celist
  23. idatom idterms idterm idlist
  24. initlist elemlist elem qual
  25. decl topdecls topdecl fndef fbody stmt stmts qstmts qbodies cqstmts cqbodies
  26. mdecl adtdecl mfield mfields field fields fnname
  27. pstmts pbodies pqual pfields pfbody pdecl dfield dfields
  28. eqstmts eqbodies idexc edecl raises tpoly tpolys texp export exportlist forpoly
  29. %type <types> types
  30. %right <tok.src> '=' Landeq Loreq Lxoreq Llsheq Lrsheq
  31. Laddeq Lsubeq Lmuleq Ldiveq Lmodeq Lexpeq Ldeclas
  32. %left <tok.src> Lload
  33. %left <tok.src> Loror
  34. %left <tok.src> Landand
  35. %right <tok.src> Lcons
  36. %left <tok.src> '|'
  37. %left <tok.src> '^'
  38. %left <tok.src> '&'
  39. %left <tok.src> Leq Lneq
  40. %left <tok.src> '<' '>' Lleq Lgeq
  41. %left <tok.src> Llsh Lrsh
  42. %left <tok.src> '+' '-'
  43. %left <tok.src> '*' '/' '%'
  44. %right <tok.src> Lexp
  45. %right <tok.src> Lcomm
  46. %left <tok.src> '(' ')' '[' ']' Linc Ldec Lof Lref
  47. %right <tok.src> Lif Lelse Lfn ':' Lexcept Lraises
  48. %left <tok.src> Lmdot
  49. %left <tok.src> '.'
  50. %left <tok.src> Lto
  51. %left <tok.src> Lor
  52. %nonassoc <tok.v.rval> Lrconst
  53. %nonassoc <tok.v.ival> Lconst
  54. %nonassoc <tok.v.idval> Lid Ltid Lsconst
  55. %nonassoc <tok.src> Llabs Lnil
  56. '!' '~' Llen Lhd Ltl Ltagof
  57. '{' '}' ';'
  58. Limplement Limport Linclude
  59. Lcon Ltype Lmodule Lcyclic
  60. Ladt Larray Llist Lchan Lself
  61. Ldo Lwhile Lfor Lbreak
  62. Lalt Lcase Lpick Lcont
  63. Lreturn Lexit Lspawn Lraise Lfix
  64. Ldynamic
  65. %%
  66. prog : Limplement ids ';'
  67. {
  68. impmods = $2;
  69. } topdecls
  70. {
  71. tree = rotater($5);
  72. }
  73. | topdecls
  74. {
  75. impmods = nil;
  76. tree = rotater($1);
  77. }
  78. ;
  79. topdecls: topdecl
  80. | topdecls topdecl
  81. {
  82. if($1 == nil)
  83. $$ = $2;
  84. else if($2 == nil)
  85. $$ = $1;
  86. else
  87. $$ = mkbin(Oseq, $1, $2);
  88. }
  89. ;
  90. topdecl : error ';'
  91. {
  92. $$ = nil;
  93. }
  94. | decl
  95. | fndef
  96. | adtdecl ';'
  97. | mdecl ';'
  98. | idatom '=' exp ';'
  99. {
  100. $$ = mkbin(Oas, $1, $3);
  101. }
  102. | idterm '=' exp ';'
  103. {
  104. $$ = mkbin(Oas, $1, $3);
  105. }
  106. | idatom Ldeclas exp ';'
  107. {
  108. $$ = mkbin(Odas, $1, $3);
  109. }
  110. | idterm Ldeclas exp ';'
  111. {
  112. $$ = mkbin(Odas, $1, $3);
  113. }
  114. | idterms ':' type ';'
  115. {
  116. yyerror("illegal declaration");
  117. $$ = nil;
  118. }
  119. | idterms ':' type '=' exp ';'
  120. {
  121. yyerror("illegal declaration");
  122. $$ = nil;
  123. }
  124. ;
  125. idterms : idterm
  126. | idterms ',' idterm
  127. {
  128. $$ = mkbin(Oseq, $1, $3);
  129. }
  130. ;
  131. decl : Linclude Lsconst ';'
  132. {
  133. includef($2);
  134. $$ = nil;
  135. }
  136. | ids ':' Ltype type ';'
  137. {
  138. $$ = typedecl($1, $4);
  139. }
  140. | ids ':' Limport exp ';'
  141. {
  142. $$ = importdecl($4, $1);
  143. $$->src.start = $1->src.start;
  144. $$->src.stop = $5.stop;
  145. }
  146. | ids ':' type ';'
  147. {
  148. $$ = vardecl($1, $3);
  149. }
  150. | ids ':' type '=' exp ';'
  151. {
  152. $$ = mkbin(Ovardecli, vardecl($1, $3), varinit($1, $5));
  153. }
  154. | ids ':' Lcon exp ';'
  155. {
  156. $$ = condecl($1, $4);
  157. }
  158. | edecl
  159. ;
  160. edecl : ids ':' Lexcept ';'
  161. {
  162. $$ = exdecl($1, nil);
  163. }
  164. | ids ':' Lexcept '(' tuplist ')' ';'
  165. {
  166. $$ = exdecl($1, revids($5));
  167. }
  168. ;
  169. mdecl : ids ':' Lmodule '{' mfields '}'
  170. {
  171. $1->src.stop = $6.stop;
  172. $$ = moddecl($1, rotater($5));
  173. }
  174. ;
  175. mfields :
  176. {
  177. $$ = nil;
  178. }
  179. | mfields mfield
  180. {
  181. if($1 == nil)
  182. $$ = $2;
  183. else if($2 == nil)
  184. $$ = $1;
  185. else
  186. $$ = mkn(Oseq, $1, $2);
  187. }
  188. | error
  189. {
  190. $$ = nil;
  191. }
  192. ;
  193. mfield : ids ':' type ';'
  194. {
  195. $$ = fielddecl(Dglobal, typeids($1, $3));
  196. }
  197. | adtdecl ';'
  198. | ids ':' Ltype type ';'
  199. {
  200. $$ = typedecl($1, $4);
  201. }
  202. | ids ':' Lcon exp ';'
  203. {
  204. $$ = condecl($1, $4);
  205. }
  206. | edecl
  207. ;
  208. adtdecl : ids ':' Ladt polydec '{' fields '}' forpoly
  209. {
  210. $1->src.stop = $7.stop;
  211. $$ = adtdecl($1, rotater($6));
  212. $$->ty->polys = $4;
  213. $$->ty->val = rotater($8);
  214. }
  215. | ids ':' Ladt polydec Lfor '{' tpolys '}' '{' fields '}'
  216. {
  217. $1->src.stop = $11.stop;
  218. $$ = adtdecl($1, rotater($10));
  219. $$->ty->polys = $4;
  220. $$->ty->val = rotater($7);
  221. }
  222. ;
  223. forpoly :
  224. {
  225. $$ = nil;
  226. }
  227. | Lfor '{' tpolys '}'
  228. {
  229. $$ = $3;
  230. }
  231. ;
  232. fields :
  233. {
  234. $$ = nil;
  235. }
  236. | fields field
  237. {
  238. if($1 == nil)
  239. $$ = $2;
  240. else if($2 == nil)
  241. $$ = $1;
  242. else
  243. $$ = mkn(Oseq, $1, $2);
  244. }
  245. | error
  246. {
  247. $$ = nil;
  248. }
  249. ;
  250. field : dfield
  251. | pdecl
  252. | ids ':' Lcon exp ';'
  253. {
  254. $$ = condecl($1, $4);
  255. }
  256. ;
  257. dfields :
  258. {
  259. $$ = nil;
  260. }
  261. | dfields dfield
  262. {
  263. if($1 == nil)
  264. $$ = $2;
  265. else if($2 == nil)
  266. $$ = $1;
  267. else
  268. $$ = mkn(Oseq, $1, $2);
  269. }
  270. ;
  271. dfield : ids ':' Lcyclic type ';'
  272. {
  273. Decl *d;
  274. for(d = $1; d != nil; d = d->next)
  275. d->cyc = 1;
  276. $$ = fielddecl(Dfield, typeids($1, $4));
  277. }
  278. | ids ':' type ';'
  279. {
  280. $$ = fielddecl(Dfield, typeids($1, $3));
  281. }
  282. ;
  283. pdecl : Lpick '{' pfields '}'
  284. {
  285. $$ = $3;
  286. }
  287. ;
  288. pfields : pfbody dfields
  289. {
  290. $1->right->right = $2;
  291. $$ = $1;
  292. }
  293. | pfbody error
  294. {
  295. $$ = nil;
  296. }
  297. | error
  298. {
  299. $$ = nil;
  300. }
  301. ;
  302. pfbody : ptags Llabs
  303. {
  304. $$ = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, $1), nil));
  305. typeids($1, mktype(&$1->src.start, &$1->src.stop, Tadtpick, nil, nil));
  306. }
  307. | pfbody dfields ptags Llabs
  308. {
  309. $1->right->right = $2;
  310. $$ = mkn(Opickdecl, $1, mkn(Oseq, fielddecl(Dtag, $3), nil));
  311. typeids($3, mktype(&$3->src.start, &$3->src.stop, Tadtpick, nil, nil));
  312. }
  313. | pfbody error ptags Llabs
  314. {
  315. $$ = mkn(Opickdecl, nil, mkn(Oseq, fielddecl(Dtag, $3), nil));
  316. typeids($3, mktype(&$3->src.start, &$3->src.stop, Tadtpick, nil, nil));
  317. }
  318. ;
  319. ptags : rptags
  320. {
  321. $$ = revids($1);
  322. }
  323. ;
  324. rptags : Lid
  325. {
  326. $$ = mkids(&$<tok.src>1, $1, nil, nil);
  327. }
  328. | rptags Lor Lid
  329. {
  330. $$ = mkids(&$<tok.src>3, $3, nil, $1);
  331. }
  332. ;
  333. ids : rids
  334. {
  335. $$ = revids($1);
  336. }
  337. ;
  338. rids : Lid
  339. {
  340. $$ = mkids(&$<tok.src>1, $1, nil, nil);
  341. }
  342. | rids ',' Lid
  343. {
  344. $$ = mkids(&$<tok.src>3, $3, nil, $1);
  345. }
  346. ;
  347. fixtype : Lfix '(' exp ',' exp ')'
  348. {
  349. $$ = mktype(&$1.start, &$6.stop, Tfix, nil, nil);
  350. $$->val = mkbin(Oseq, $3, $5);
  351. }
  352. | Lfix '(' exp ')'
  353. {
  354. $$ = mktype(&$1.start, &$4.stop, Tfix, nil, nil);
  355. $$->val = $3;
  356. }
  357. ;
  358. types : type
  359. {
  360. $$ = addtype($1, nil);
  361. }
  362. | Lcyclic type
  363. {
  364. $$ = addtype($2, nil);
  365. $2->flags |= CYCLIC;
  366. }
  367. | types ',' type
  368. {
  369. $$ = addtype($3, $1);
  370. }
  371. | types ',' Lcyclic type
  372. {
  373. $$ = addtype($4, $1);
  374. $4->flags |= CYCLIC;
  375. }
  376. ;
  377. type : Ltid
  378. {
  379. $$ = mkidtype(&$<tok.src>1, $1);
  380. }
  381. | iditype
  382. {
  383. $$ = $1;
  384. }
  385. | dotiditype
  386. {
  387. $$ = $1;
  388. }
  389. | type Lmdot Lid
  390. {
  391. $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
  392. }
  393. | type Lmdot Lid '[' types ']'
  394. {
  395. $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
  396. $$ = mkinsttype(&$1->src, $$, $5);
  397. }
  398. | Lref type
  399. {
  400. $$ = mktype(&$1.start, &$2->src.stop, Tref, $2, nil);
  401. }
  402. | Lchan Lof type
  403. {
  404. $$ = mktype(&$1.start, &$3->src.stop, Tchan, $3, nil);
  405. }
  406. | '(' tuplist ')'
  407. {
  408. if($2->next == nil)
  409. $$ = $2->ty;
  410. else
  411. $$ = mktype(&$1.start, &$3.stop, Ttuple, nil, revids($2));
  412. }
  413. | Larray Lof type
  414. {
  415. $$ = mktype(&$1.start, &$3->src.stop, Tarray, $3, nil);
  416. }
  417. | Llist Lof type
  418. {
  419. $$ = mktype(&$1.start, &$3->src.stop, Tlist, $3, nil);
  420. }
  421. | Lfn polydec fnargretp raises
  422. {
  423. $3->src.start = $1.start;
  424. $3->polys = $2;
  425. $3->u.eraises = $4;
  426. $$ = $3;
  427. }
  428. | fixtype
  429. /*
  430. | Lexcept
  431. {
  432. $$ = mktype(&$1.start, &$1.stop, Texception, nil, nil);
  433. $$->cons = 1;
  434. }
  435. | Lexcept '(' tuplist ')'
  436. {
  437. $$ = mktype(&$1.start, &$4.stop, Texception, nil, revids($3));
  438. $$->cons = 1;
  439. }
  440. */
  441. ;
  442. iditype : Lid
  443. {
  444. $$ = mkidtype(&$<tok.src>1, $1);
  445. }
  446. | Lid '[' types ']'
  447. {
  448. $$ = mkinsttype(&$<tok.src>1, mkidtype(&$<tok.src>1, $1), $3);
  449. }
  450. ;
  451. dotiditype : type '.' Lid
  452. {
  453. $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
  454. }
  455. | type '.' Lid '[' types ']'
  456. {
  457. $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
  458. $$ = mkinsttype(&$1->src, $$, $5);
  459. }
  460. ;
  461. tuplist : type
  462. {
  463. $$ = mkids(&$1->src, nil, $1, nil);
  464. }
  465. | tuplist ',' type
  466. {
  467. $$ = mkids(&$1->src, nil, $3, $1);
  468. }
  469. ;
  470. polydec :
  471. {
  472. $$ = nil;
  473. }
  474. | '[' ids ']'
  475. {
  476. $$ = polydecl($2);
  477. }
  478. ;
  479. fnarg : '(' forms ')'
  480. {
  481. $$ = mktype(&$1.start, &$3.stop, Tfn, tnone, $2);
  482. }
  483. | '(' '*' ')'
  484. {
  485. $$ = mktype(&$1.start, &$3.stop, Tfn, tnone, nil);
  486. $$->varargs = 1;
  487. }
  488. | '(' ftypes ',' '*' ')'
  489. {
  490. $$ = mktype(&$1.start, &$5.stop, Tfn, tnone, $2);
  491. $$->varargs = 1;
  492. }
  493. ;
  494. fnargret: fnarg %prec ':'
  495. {
  496. $$ = $1;
  497. }
  498. | fnarg ':' type
  499. {
  500. $1->tof = $3;
  501. $1->src.stop = $3->src.stop;
  502. $$ = $1;
  503. }
  504. ;
  505. fnargretp: fnargret %prec '='
  506. {
  507. $$ = $1;
  508. }
  509. | fnargret Lfor '{' tpolys '}'
  510. {
  511. $$ = $1;
  512. $$->val = rotater($4);
  513. }
  514. ;
  515. forms :
  516. {
  517. $$ = nil;
  518. }
  519. | ftypes
  520. ;
  521. ftypes : ftype
  522. | ftypes ',' ftype
  523. {
  524. $$ = appdecls($1, $3);
  525. }
  526. ;
  527. ftype : nids ':' type
  528. {
  529. $$ = typeids($1, $3);
  530. }
  531. | nids ':' adtk
  532. {
  533. Decl *d;
  534. $$ = typeids($1, $3);
  535. for(d = $$; d != nil; d = d->next)
  536. d->implicit = 1;
  537. }
  538. | idterms ':' type
  539. {
  540. $$ = mkids(&$1->src, enter("junk", 0), $3, nil);
  541. $$->store = Darg;
  542. yyerror("illegal argument declaraion");
  543. }
  544. | idterms ':' adtk
  545. {
  546. $$ = mkids(&$1->src, enter("junk", 0), $3, nil);
  547. $$->store = Darg;
  548. yyerror("illegal argument declaraion");
  549. }
  550. ;
  551. nids : nrids
  552. {
  553. $$ = revids($1);
  554. }
  555. ;
  556. nrids : Lid
  557. {
  558. $$ = mkids(&$<tok.src>1, $1, nil, nil);
  559. $$->store = Darg;
  560. }
  561. | Lnil
  562. {
  563. $$ = mkids(&$1, nil, nil, nil);
  564. $$->store = Darg;
  565. }
  566. | nrids ',' Lid
  567. {
  568. $$ = mkids(&$<tok.src>3, $3, nil, $1);
  569. $$->store = Darg;
  570. }
  571. | nrids ',' Lnil
  572. {
  573. $$ = mkids(&$3, nil, nil, $1);
  574. $$->store = Darg;
  575. }
  576. ;
  577. /*
  578. adttype : Lid
  579. {
  580. $$ = mkidtype(&$<tok.src>1, $1);
  581. }
  582. | adttype '.' Lid
  583. {
  584. $$ = mkdottype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
  585. }
  586. | adttype Lmdot Lid
  587. {
  588. $$ = mkarrowtype(&$1->src.start, &$<tok.src>3.stop, $1, $3);
  589. }
  590. | Lref adttype
  591. {
  592. $$ = mktype(&$1.start, &$2->src.stop, Tref, $2, nil);
  593. }
  594. ;
  595. adtk : Lself adttype
  596. {
  597. $$ = $2;
  598. }
  599. ;
  600. */
  601. adtk : Lself iditype
  602. {
  603. $$ = $2;
  604. }
  605. | Lself Lref iditype
  606. {
  607. $$ = mktype(&$<tok.src>2.start, &$<tok.src>3.stop, Tref, $3, nil);
  608. }
  609. | Lself dotiditype
  610. {
  611. $$ = $2;
  612. }
  613. | Lself Lref dotiditype
  614. {
  615. $$ = mktype(&$<tok.src>2.start, &$<tok.src>3.stop, Tref, $3, nil);
  616. }
  617. ;
  618. fndef : fnname fnargretp raises fbody
  619. {
  620. $$ = fndecl($1, $2, $4);
  621. nfns++;
  622. /* patch up polydecs */
  623. if($1->op == Odot){
  624. if($1->right->left != nil){
  625. $2->polys = $1->right->left->decl;
  626. $1->right->left = nil;
  627. }
  628. if($1->left->op == Oname && $1->left->left != nil){
  629. $$->decl = $1->left->left->decl;
  630. $1->left->left = nil;
  631. }
  632. }
  633. else{
  634. if($1->left != nil){
  635. $2->polys = $1->left->decl;
  636. $1->left = nil;
  637. }
  638. }
  639. $2->u.eraises = $3;
  640. $$->src = $1->src;
  641. }
  642. ;
  643. raises : Lraises '(' idlist ')'
  644. {
  645. $$ = mkn(Otuple, rotater($3), nil);
  646. $$->src.start = $1.start;
  647. $$->src.stop = $4.stop;
  648. }
  649. | Lraises idatom
  650. {
  651. $$ = mkn(Otuple, mkunary(Oseq, $2), nil);
  652. $$->src.start = $1.start;
  653. $$->src.stop = $2->src.stop;
  654. }
  655. | /* empty */ %prec Lraises
  656. {
  657. $$ = nil;
  658. }
  659. ;
  660. fbody : '{' stmts '}'
  661. {
  662. if($2 == nil){
  663. $2 = mkn(Onothing, nil, nil);
  664. $2->src.start = curline();
  665. $2->src.stop = $2->src.start;
  666. }
  667. $$ = rotater($2);
  668. $$->src.start = $1.start;
  669. $$->src.stop = $3.stop;
  670. }
  671. | error '}'
  672. {
  673. $$ = mkn(Onothing, nil, nil);
  674. }
  675. | error '{' stmts '}'
  676. {
  677. $$ = mkn(Onothing, nil, nil);
  678. }
  679. ;
  680. fnname : Lid polydec
  681. {
  682. $$ = mkname(&$<tok.src>1, $1);
  683. if($2 != nil){
  684. $$->left = mkn(Onothing, nil ,nil);
  685. $$->left->decl = $2;
  686. }
  687. }
  688. | fnname '.' Lid polydec
  689. {
  690. $$ = mkbin(Odot, $1, mkname(&$<tok.src>3, $3));
  691. if($4 != nil){
  692. $$->right->left = mkn(Onothing, nil ,nil);
  693. $$->right->left->decl = $4;
  694. }
  695. }
  696. ;
  697. stmts :
  698. {
  699. $$ = nil;
  700. }
  701. | stmts decl
  702. {
  703. if($1 == nil)
  704. $$ = $2;
  705. else if($2 == nil)
  706. $$ = $1;
  707. else
  708. $$ = mkbin(Oseq, $1, $2);
  709. }
  710. | stmts stmt
  711. {
  712. if($1 == nil)
  713. $$ = $2;
  714. else
  715. $$ = mkbin(Oseq, $1, $2);
  716. }
  717. ;
  718. elists : '(' elist ')'
  719. | elists ',' '(' elist ')'
  720. ;
  721. stmt : error ';'
  722. {
  723. $$ = mkn(Onothing, nil, nil);
  724. $$->src.start = curline();
  725. $$->src.stop = $$->src.start;
  726. }
  727. | error '}'
  728. {
  729. $$ = mkn(Onothing, nil, nil);
  730. $$->src.start = curline();
  731. $$->src.stop = $$->src.start;
  732. }
  733. | error '{' stmts '}'
  734. {
  735. $$ = mkn(Onothing, nil, nil);
  736. $$->src.start = curline();
  737. $$->src.stop = $$->src.start;
  738. }
  739. | '{' stmts '}'
  740. {
  741. if($2 == nil){
  742. $2 = mkn(Onothing, nil, nil);
  743. $2->src.start = curline();
  744. $2->src.stop = $2->src.start;
  745. }
  746. $$ = mkscope(rotater($2));
  747. }
  748. | elists ':' type ';'
  749. {
  750. yyerror("illegal declaration");
  751. $$ = mkn(Onothing, nil, nil);
  752. $$->src.start = curline();
  753. $$->src.stop = $$->src.start;
  754. }
  755. | elists ':' type '=' exp';'
  756. {
  757. yyerror("illegal declaration");
  758. $$ = mkn(Onothing, nil, nil);
  759. $$->src.start = curline();
  760. $$->src.stop = $$->src.start;
  761. }
  762. | zexp ';'
  763. {
  764. $$ = $1;
  765. }
  766. | Lif '(' exp ')' stmt
  767. {
  768. $$ = mkn(Oif, $3, mkunary(Oseq, $5));
  769. $$->src.start = $1.start;
  770. $$->src.stop = $5->src.stop;
  771. }
  772. | Lif '(' exp ')' stmt Lelse stmt
  773. {
  774. $$ = mkn(Oif, $3, mkbin(Oseq, $5, $7));
  775. $$->src.start = $1.start;
  776. $$->src.stop = $7->src.stop;
  777. }
  778. | bclab Lfor '(' zexp ';' zexp ';' zexp ')' stmt
  779. {
  780. $$ = mkunary(Oseq, $10);
  781. if($8->op != Onothing)
  782. $$->right = $8;
  783. $$ = mkbin(Ofor, $6, $$);
  784. $$->decl = $1;
  785. if($4->op != Onothing)
  786. $$ = mkbin(Oseq, $4, $$);
  787. }
  788. | bclab Lwhile '(' zexp ')' stmt
  789. {
  790. $$ = mkn(Ofor, $4, mkunary(Oseq, $6));
  791. $$->src.start = $2.start;
  792. $$->src.stop = $6->src.stop;
  793. $$->decl = $1;
  794. }
  795. | bclab Ldo stmt Lwhile '(' zexp ')' ';'
  796. {
  797. $$ = mkn(Odo, $6, $3);
  798. $$->src.start = $2.start;
  799. $$->src.stop = $7.stop;
  800. $$->decl = $1;
  801. }
  802. | Lbreak bctarg ';'
  803. {
  804. $$ = mkn(Obreak, nil, nil);
  805. $$->decl = $2;
  806. $$->src = $1;
  807. }
  808. | Lcont bctarg ';'
  809. {
  810. $$ = mkn(Ocont, nil, nil);
  811. $$->decl = $2;
  812. $$->src = $1;
  813. }
  814. | Lreturn zexp ';'
  815. {
  816. $$ = mkn(Oret, $2, nil);
  817. $$->src = $1;
  818. if($2->op == Onothing)
  819. $$->left = nil;
  820. else
  821. $$->src.stop = $2->src.stop;
  822. }
  823. | Lspawn exp ';'
  824. {
  825. $$ = mkn(Ospawn, $2, nil);
  826. $$->src.start = $1.start;
  827. $$->src.stop = $2->src.stop;
  828. }
  829. | Lraise zexp ';'
  830. {
  831. $$ = mkn(Oraise, $2, nil);
  832. $$->src.start = $1.start;
  833. $$->src.stop = $2->src.stop;
  834. }
  835. | bclab Lcase exp '{' cqstmts '}'
  836. {
  837. $$ = mkn(Ocase, $3, caselist($5, nil));
  838. $$->src = $3->src;
  839. $$->decl = $1;
  840. }
  841. | bclab Lalt '{' qstmts '}'
  842. {
  843. $$ = mkn(Oalt, caselist($4, nil), nil);
  844. $$->src = $2;
  845. $$->decl = $1;
  846. }
  847. | bclab Lpick Lid Ldeclas exp '{' pstmts '}'
  848. {
  849. $$ = mkn(Opick, mkbin(Odas, mkname(&$<tok.src>3, $3), $5), caselist($7, nil));
  850. $$->src.start = $<tok.src>3.start;
  851. $$->src.stop = $5->src.stop;
  852. $$->decl = $1;
  853. }
  854. | Lexit ';'
  855. {
  856. $$ = mkn(Oexit, nil, nil);
  857. $$->src = $1;
  858. }
  859. | '{' stmts '}' Lexcept idexc '{' eqstmts '}'
  860. {
  861. if($2 == nil){
  862. $2 = mkn(Onothing, nil, nil);
  863. $2->src.start = curline();
  864. $2->src.stop = curline();
  865. }
  866. $2 = mkscope(rotater($2));
  867. $$ = mkbin(Oexstmt, $2, mkn(Oexcept, $5, caselist($7, nil)));
  868. }
  869. /*
  870. | stmt Lexcept idexc '{' eqstmts '}'
  871. {
  872. $$ = mkbin(Oexstmt, $1, mkn(Oexcept, $3, caselist($5, nil)));
  873. }
  874. */
  875. ;
  876. bclab :
  877. {
  878. $$ = nil;
  879. }
  880. | ids ':'
  881. {
  882. if($1->next != nil)
  883. yyerror("only one identifier allowed in a label");
  884. $$ = $1;
  885. }
  886. ;
  887. bctarg :
  888. {
  889. $$ = nil;
  890. }
  891. | Lid
  892. {
  893. $$ = mkids(&$<tok.src>1, $1, nil, nil);
  894. }
  895. ;
  896. qstmts : qbodies stmts
  897. {
  898. $1->left->right->right = $2;
  899. $$ = $1;
  900. }
  901. ;
  902. qbodies : qual Llabs
  903. {
  904. $$ = mkunary(Oseq, mkscope(mkunary(Olabel, rotater($1))));
  905. }
  906. | qbodies stmts qual Llabs
  907. {
  908. $1->left->right->right = $2;
  909. $$ = mkbin(Oseq, mkscope(mkunary(Olabel, rotater($3))), $1);
  910. }
  911. ;
  912. cqstmts : cqbodies stmts
  913. {
  914. $1->left->right = mkscope($2);
  915. $$ = $1;
  916. }
  917. ;
  918. cqbodies : qual Llabs
  919. {
  920. $$ = mkunary(Oseq, mkunary(Olabel, rotater($1)));
  921. }
  922. | cqbodies stmts qual Llabs
  923. {
  924. $1->left->right = mkscope($2);
  925. $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1);
  926. }
  927. ;
  928. eqstmts : eqbodies stmts
  929. {
  930. $1->left->right = mkscope($2);
  931. $$ = $1;
  932. }
  933. ;
  934. eqbodies : qual Llabs
  935. {
  936. $$ = mkunary(Oseq, mkunary(Olabel, rotater($1)));
  937. }
  938. | eqbodies stmts qual Llabs
  939. {
  940. $1->left->right = mkscope($2);
  941. $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1);
  942. }
  943. ;
  944. qual : exp
  945. | exp Lto exp
  946. {
  947. $$ = mkbin(Orange, $1, $3);
  948. }
  949. | '*'
  950. {
  951. $$ = mkn(Owild, nil, nil);
  952. $$->src = $1;
  953. }
  954. | qual Lor qual
  955. {
  956. $$ = mkbin(Oseq, $1, $3);
  957. }
  958. | error
  959. {
  960. $$ = mkn(Onothing, nil, nil);
  961. $$->src.start = curline();
  962. $$->src.stop = $$->src.start;
  963. }
  964. ;
  965. pstmts : pbodies stmts
  966. {
  967. $1->left->right = mkscope($2);
  968. $$ = $1;
  969. }
  970. ;
  971. pbodies : pqual Llabs
  972. {
  973. $$ = mkunary(Oseq, mkunary(Olabel, rotater($1)));
  974. }
  975. | pbodies stmts pqual Llabs
  976. {
  977. $1->left->right = mkscope($2);
  978. $$ = mkbin(Oseq, mkunary(Olabel, rotater($3)), $1);
  979. }
  980. ;
  981. pqual : Lid
  982. {
  983. $$ = mkname(&$<tok>1.src, $1);
  984. }
  985. | '*'
  986. {
  987. $$ = mkn(Owild, nil, nil);
  988. $$->src = $1;
  989. }
  990. | pqual Lor pqual
  991. {
  992. $$ = mkbin(Oseq, $1, $3);
  993. }
  994. | error
  995. {
  996. $$ = mkn(Onothing, nil, nil);
  997. $$->src.start = curline();
  998. $$->src.stop = $$->src.start;
  999. }
  1000. ;
  1001. zexp :
  1002. {
  1003. $$ = mkn(Onothing, nil, nil);
  1004. $$->src.start = curline();
  1005. $$->src.stop = $$->src.start;
  1006. }
  1007. | exp
  1008. ;
  1009. exp : monexp
  1010. | exp '=' exp
  1011. {
  1012. $$ = mkbin(Oas, $1, $3);
  1013. }
  1014. | exp Landeq exp
  1015. {
  1016. $$ = mkbin(Oandas, $1, $3);
  1017. }
  1018. | exp Loreq exp
  1019. {
  1020. $$ = mkbin(Ooras, $1, $3);
  1021. }
  1022. | exp Lxoreq exp
  1023. {
  1024. $$ = mkbin(Oxoras, $1, $3);
  1025. }
  1026. | exp Llsheq exp
  1027. {
  1028. $$ = mkbin(Olshas, $1, $3);
  1029. }
  1030. | exp Lrsheq exp
  1031. {
  1032. $$ = mkbin(Orshas, $1, $3);
  1033. }
  1034. | exp Laddeq exp
  1035. {
  1036. $$ = mkbin(Oaddas, $1, $3);
  1037. }
  1038. | exp Lsubeq exp
  1039. {
  1040. $$ = mkbin(Osubas, $1, $3);
  1041. }
  1042. | exp Lmuleq exp
  1043. {
  1044. $$ = mkbin(Omulas, $1, $3);
  1045. }
  1046. | exp Ldiveq exp
  1047. {
  1048. $$ = mkbin(Odivas, $1, $3);
  1049. }
  1050. | exp Lmodeq exp
  1051. {
  1052. $$ = mkbin(Omodas, $1, $3);
  1053. }
  1054. | exp Lexpeq exp
  1055. {
  1056. $$ = mkbin(Oexpas, $1, $3);
  1057. }
  1058. | exp Lcomm '=' exp
  1059. {
  1060. $$ = mkbin(Osnd, $1, $4);
  1061. }
  1062. | exp Ldeclas exp
  1063. {
  1064. $$ = mkbin(Odas, $1, $3);
  1065. }
  1066. | Lload Lid exp %prec Lload
  1067. {
  1068. $$ = mkn(Oload, $3, nil);
  1069. $$->src.start = $<tok.src.start>1;
  1070. $$->src.stop = $3->src.stop;
  1071. $$->ty = mkidtype(&$<tok.src>2, $2);
  1072. }
  1073. | exp Lexp exp
  1074. {
  1075. $$ = mkbin(Oexp, $1, $3);
  1076. }
  1077. | exp '*' exp
  1078. {
  1079. $$ = mkbin(Omul, $1, $3);
  1080. }
  1081. | exp '/' exp
  1082. {
  1083. $$ = mkbin(Odiv, $1, $3);
  1084. }
  1085. | exp '%' exp
  1086. {
  1087. $$ = mkbin(Omod, $1, $3);
  1088. }
  1089. | exp '+' exp
  1090. {
  1091. $$ = mkbin(Oadd, $1, $3);
  1092. }
  1093. | exp '-' exp
  1094. {
  1095. $$ = mkbin(Osub, $1, $3);
  1096. }
  1097. | exp Lrsh exp
  1098. {
  1099. $$ = mkbin(Orsh, $1, $3);
  1100. }
  1101. | exp Llsh exp
  1102. {
  1103. $$ = mkbin(Olsh, $1, $3);
  1104. }
  1105. | exp '<' exp
  1106. {
  1107. $$ = mkbin(Olt, $1, $3);
  1108. }
  1109. | exp '>' exp
  1110. {
  1111. $$ = mkbin(Ogt, $1, $3);
  1112. }
  1113. | exp Lleq exp
  1114. {
  1115. $$ = mkbin(Oleq, $1, $3);
  1116. }
  1117. | exp Lgeq exp
  1118. {
  1119. $$ = mkbin(Ogeq, $1, $3);
  1120. }
  1121. | exp Leq exp
  1122. {
  1123. $$ = mkbin(Oeq, $1, $3);
  1124. }
  1125. | exp Lneq exp
  1126. {
  1127. $$ = mkbin(Oneq, $1, $3);
  1128. }
  1129. | exp '&' exp
  1130. {
  1131. $$ = mkbin(Oand, $1, $3);
  1132. }
  1133. | exp '^' exp
  1134. {
  1135. $$ = mkbin(Oxor, $1, $3);
  1136. }
  1137. | exp '|' exp
  1138. {
  1139. $$ = mkbin(Oor, $1, $3);
  1140. }
  1141. | exp Lcons exp
  1142. {
  1143. $$ = mkbin(Ocons, $1, $3);
  1144. }
  1145. | exp Landand exp
  1146. {
  1147. $$ = mkbin(Oandand, $1, $3);
  1148. }
  1149. | exp Loror exp
  1150. {
  1151. $$ = mkbin(Ooror, $1, $3);
  1152. }
  1153. ;
  1154. monexp : term
  1155. | '+' monexp
  1156. {
  1157. $2->src.start = $1.start;
  1158. $$ = $2;
  1159. }
  1160. | '-' monexp
  1161. {
  1162. $$ = mkunary(Oneg, $2);
  1163. $$->src.start = $1.start;
  1164. }
  1165. | '!' monexp
  1166. {
  1167. $$ = mkunary(Onot, $2);
  1168. $$->src.start = $1.start;
  1169. }
  1170. | '~' monexp
  1171. {
  1172. $$ = mkunary(Ocomp, $2);
  1173. $$->src.start = $1.start;
  1174. }
  1175. | '*' monexp
  1176. {
  1177. $$ = mkunary(Oind, $2);
  1178. $$->src.start = $1.start;
  1179. }
  1180. | Linc monexp
  1181. {
  1182. $$ = mkunary(Opreinc, $2);
  1183. $$->src.start = $1.start;
  1184. }
  1185. | Ldec monexp
  1186. {
  1187. $$ = mkunary(Opredec, $2);
  1188. $$->src.start = $1.start;
  1189. }
  1190. | Lcomm monexp
  1191. {
  1192. $$ = mkunary(Orcv, $2);
  1193. $$->src.start = $1.start;
  1194. }
  1195. | Lhd monexp
  1196. {
  1197. $$ = mkunary(Ohd, $2);
  1198. $$->src.start = $1.start;
  1199. }
  1200. | Ltl monexp
  1201. {
  1202. $$ = mkunary(Otl, $2);
  1203. $$->src.start = $1.start;
  1204. }
  1205. | Llen monexp
  1206. {
  1207. $$ = mkunary(Olen, $2);
  1208. $$->src.start = $1.start;
  1209. }
  1210. | Lref monexp
  1211. {
  1212. $$ = mkunary(Oref, $2);
  1213. $$->src.start = $1.start;
  1214. }
  1215. | Ltagof monexp
  1216. {
  1217. $$ = mkunary(Otagof, $2);
  1218. $$->src.start = $1.start;
  1219. }
  1220. | Larray '[' exp ']' Lof type
  1221. {
  1222. $$ = mkn(Oarray, $3, nil);
  1223. $$->ty = mktype(&$1.start, &$6->src.stop, Tarray, $6, nil);
  1224. $$->src = $$->ty->src;
  1225. }
  1226. | Larray '[' exp ']' Lof '{' initlist '}'
  1227. {
  1228. $$ = mkn(Oarray, $3, $7);
  1229. $$->src.start = $1.start;
  1230. $$->src.stop = $8.stop;
  1231. }
  1232. | Larray '[' ']' Lof '{' initlist '}'
  1233. {
  1234. $$ = mkn(Onothing, nil, nil);
  1235. $$->src.start = $2.start;
  1236. $$->src.stop = $3.stop;
  1237. $$ = mkn(Oarray, $$, $6);
  1238. $$->src.start = $1.start;
  1239. $$->src.stop = $7.stop;
  1240. }
  1241. | Llist Lof '{' celist '}'
  1242. {
  1243. $$ = etolist($4);
  1244. $$->src.start = $1.start;
  1245. $$->src.stop = $5.stop;
  1246. }
  1247. | Lchan Lof type
  1248. {
  1249. $$ = mkn(Ochan, nil, nil);
  1250. $$->ty = mktype(&$1.start, &$3->src.stop, Tchan, $3, nil);
  1251. $$->src = $$->ty->src;
  1252. }
  1253. | Lchan '[' exp ']' Lof type
  1254. {
  1255. $$ = mkn(Ochan, $3, nil);
  1256. $$->ty = mktype(&$1.start, &$6->src.stop, Tchan, $6, nil);
  1257. $$->src = $$->ty->src;
  1258. }
  1259. | Larray Lof Ltid monexp
  1260. {
  1261. $$ = mkunary(Ocast, $4);
  1262. $$->ty = mktype(&$1.start, &$4->src.stop, Tarray, mkidtype(&$<tok.src>3, $3), nil);
  1263. $$->src = $$->ty->src;
  1264. }
  1265. | Ltid monexp
  1266. {
  1267. $$ = mkunary(Ocast, $2);
  1268. $$->src.start = $<tok.src>1.start;
  1269. $$->ty = mkidtype(&$$->src, $1);
  1270. }
  1271. | Lid monexp
  1272. {
  1273. $$ = mkunary(Ocast, $2);
  1274. $$->src.start = $<tok.src>1.start;
  1275. $$->ty = mkidtype(&$$->src, $1);
  1276. }
  1277. | fixtype monexp
  1278. {
  1279. $$ = mkunary(Ocast, $2);
  1280. $$->src.start = $<tok.src>1.start;
  1281. $$->ty = $1;
  1282. }
  1283. ;
  1284. term : idatom
  1285. | term '(' zelist ')'
  1286. {
  1287. $$ = mkn(Ocall, $1, $3);
  1288. $$->src.start = $1->src.start;
  1289. $$->src.stop = $4.stop;
  1290. }
  1291. | '(' elist ')'
  1292. {
  1293. $$ = $2;
  1294. if($2->op == Oseq)
  1295. $$ = mkn(Otuple, rotater($2), nil);
  1296. else
  1297. $$->flags |= PARENS;
  1298. $$->src.start = $1.start;
  1299. $$->src.stop = $3.stop;
  1300. }
  1301. | term '.' Lid
  1302. {
  1303. $$ = mkbin(Odot, $1, mkname(&$<tok.src>3, $3));
  1304. }
  1305. | term Lmdot term
  1306. {
  1307. $$ = mkbin(Omdot, $1, $3);
  1308. }
  1309. | term '[' export ']'
  1310. {
  1311. $$ = mkbin(Oindex, $1, $3);
  1312. $$->src.stop = $4.stop;
  1313. }
  1314. | term '[' zexp ':' zexp ']'
  1315. {
  1316. if($3->op == Onothing)
  1317. $3->src = $4;
  1318. if($5->op == Onothing)
  1319. $5->src = $4;
  1320. $$ = mkbin(Oslice, $1, mkbin(Oseq, $3, $5));
  1321. $$->src.stop = $6.stop;
  1322. }
  1323. | term Linc
  1324. {
  1325. $$ = mkunary(Oinc, $1);
  1326. $$->src.stop = $2.stop;
  1327. }
  1328. | term Ldec
  1329. {
  1330. $$ = mkunary(Odec, $1);
  1331. $$->src.stop = $2.stop;
  1332. }
  1333. | Lsconst
  1334. {
  1335. $$ = mksconst(&$<tok.src>1, $1);
  1336. }
  1337. | Lconst
  1338. {
  1339. $$ = mkconst(&$<tok.src>1, $1);
  1340. if($1 > 0x7fffffff || $1 < -0x7fffffff)
  1341. $$->ty = tbig;
  1342. $$ = $$;
  1343. }
  1344. | Lrconst
  1345. {
  1346. $$ = mkrconst(&$<tok.src>1, $1);
  1347. }
  1348. | term '[' exportlist ',' export ']'
  1349. {
  1350. $$ = mkbin(Oindex, $1, rotater(mkbin(Oseq, $3, $5)));
  1351. $$->src.stop = $6.stop;
  1352. }
  1353. ;
  1354. idatom : Lid
  1355. {
  1356. $$ = mkname(&$<tok.src>1, $1);
  1357. }
  1358. | Lnil
  1359. {
  1360. $$ = mknil(&$<tok.src>1);
  1361. }
  1362. ;
  1363. idterm : '(' idlist ')'
  1364. {
  1365. $$ = mkn(Otuple, rotater($2), nil);
  1366. $$->src.start = $1.start;
  1367. $$->src.stop = $3.stop;
  1368. }
  1369. ;
  1370. exportlist : export
  1371. | exportlist ',' export
  1372. {
  1373. $$ = mkbin(Oseq, $1, $3);
  1374. }
  1375. ;
  1376. export : exp
  1377. | texp
  1378. ;
  1379. texp : Ltid
  1380. {
  1381. $$ = mkn(Otype, nil, nil);
  1382. $$->ty = mkidtype(&$<tok.src>1, $1);
  1383. $$->src = $$->ty->src;
  1384. }
  1385. | Larray Lof type
  1386. {
  1387. $$ = mkn(Otype, nil, nil);
  1388. $$->ty = mktype(&$1.start, &$3->src.stop, Tarray, $3, nil);
  1389. $$->src = $$->ty->src;
  1390. }
  1391. | Llist Lof type
  1392. {
  1393. $$ = mkn(Otype, nil, nil);
  1394. $$->ty = mktype(&$1.start, &$3->src.stop, Tlist, $3, nil);
  1395. $$->src = $$->ty->src;
  1396. }
  1397. | Lcyclic type
  1398. {
  1399. $$ = mkn(Otype, nil ,nil);
  1400. $$->ty = $2;
  1401. $$->ty->flags |= CYCLIC;
  1402. $$->src = $$->ty->src;
  1403. }
  1404. ;
  1405. idexc : Lid
  1406. {
  1407. $$ = mkname(&$<tok.src>1, $1);
  1408. }
  1409. | /* empty */
  1410. {
  1411. $$ = nil;
  1412. }
  1413. ;
  1414. idlist : idterm
  1415. | idatom
  1416. | idlist ',' idterm
  1417. {
  1418. $$ = mkbin(Oseq, $1, $3);
  1419. }
  1420. | idlist ',' idatom
  1421. {
  1422. $$ = mkbin(Oseq, $1, $3);
  1423. }
  1424. ;
  1425. zelist :
  1426. {
  1427. $$ = nil;
  1428. }
  1429. | elist
  1430. {
  1431. $$ = rotater($1);
  1432. }
  1433. ;
  1434. celist : elist
  1435. | elist ','
  1436. ;
  1437. elist : exp
  1438. | elist ',' exp
  1439. {
  1440. $$ = mkbin(Oseq, $1, $3);
  1441. }
  1442. ;
  1443. initlist : elemlist
  1444. {
  1445. $$ = rotater($1);
  1446. }
  1447. | elemlist ','
  1448. {
  1449. $$ = rotater($1);
  1450. }
  1451. ;
  1452. elemlist : elem
  1453. | elemlist ',' elem
  1454. {
  1455. $$ = mkbin(Oseq, $1, $3);
  1456. }
  1457. ;
  1458. elem : exp
  1459. {
  1460. $$ = mkn(Oelem, nil, $1);
  1461. $$->src = $1->src;
  1462. }
  1463. | qual Llabs exp
  1464. {
  1465. $$ = mkbin(Oelem, rotater($1), $3);
  1466. }
  1467. ;
  1468. /*
  1469. tpoly : ids Llabs '{' dfields '}'
  1470. {
  1471. $$ = typedecl($1, mktype(&$1->src.start, &$5.stop, Tpoly, nil, nil));
  1472. $$->left = rotater($4);
  1473. }
  1474. ;
  1475. tpolys : tpoly
  1476. {
  1477. $$ = $1;
  1478. }
  1479. | tpolys tpoly
  1480. {
  1481. $$ = mkbin(Oseq, $1, $2);
  1482. }
  1483. ;
  1484. */
  1485. tpolys : tpoly dfields
  1486. {
  1487. if($1->op == Oseq)
  1488. $1->right->left = rotater($2);
  1489. else
  1490. $1->left = rotater($2);
  1491. $$ = $1;
  1492. }
  1493. ;
  1494. tpoly : ids Llabs
  1495. {
  1496. $$ = typedecl($1, mktype(&$1->src.start, &$2.stop, Tpoly, nil, nil));
  1497. }
  1498. | tpoly dfields ids Llabs
  1499. {
  1500. if($1->op == Oseq)
  1501. $1->right->left = rotater($2);
  1502. else
  1503. $1->left = rotater($2);
  1504. $$ = mkbin(Oseq, $1, typedecl($3, mktype(&$3->src.start, &$4.stop, Tpoly, nil, nil)));
  1505. }
  1506. ;
  1507. %%
  1508. static char *mkfileext(char*, char*, char*);
  1509. static void usage(void);
  1510. static int dosym;
  1511. static int toterrors;
  1512. static ulong canonnanbits[] = { 0x7fffffff, 0xffffffff};
  1513. static char* infile;
  1514. #define SLASHMOD "/module"
  1515. static char*
  1516. getroot(void)
  1517. {
  1518. int n;
  1519. char *e, *l, *s;
  1520. if((e = getenv("EMU")) != nil){
  1521. for(s = e; *e != '\0'; e++){
  1522. if(*e == '-' && *(e+1) == 'r' && (e == s || *(e-1) == ' ' || *(e-1) == '\t')){
  1523. e += 2;
  1524. l = strchr(e, ' ');
  1525. if(l != nil)
  1526. *l = '\0';
  1527. if((n = strlen(e)) > 0){
  1528. s = malloc(n+1);
  1529. strcpy(s, e);
  1530. return s;
  1531. }
  1532. }
  1533. }
  1534. }
  1535. if((e = getenv("ROOT")) != nil)
  1536. return strdup(e);
  1537. return nil;
  1538. }
  1539. void
  1540. main(int argc, char *argv[])
  1541. {
  1542. char *s, *ofile, *ext, *root;
  1543. int i;
  1544. FPinit();
  1545. FPcontrol(0, INVAL|ZDIV|OVFL|UNFL|INEX);
  1546. canonnan = canontod(canonnanbits);
  1547. fmtinstall('D', dotconv);
  1548. fmtinstall('I', instconv);
  1549. fmtinstall('K', declconv);
  1550. fmtinstall('k', storeconv);
  1551. fmtinstall('L', lineconv);
  1552. fmtinstall('M', mapconv);
  1553. fmtinstall('n', nodeconv); /* exp structure */
  1554. fmtinstall('O', opconv);
  1555. fmtinstall('g', gfltconv);
  1556. fmtinstall('Q', etconv); /* src expression with type */
  1557. fmtinstall('R', ctypeconv); /* c equivalent type */
  1558. fmtinstall('P', ctypeconv); /* c equivalent type - pointer type */
  1559. fmtinstall('T', typeconv); /* source style types */
  1560. fmtinstall('t', stypeconv); /* structurally descriptive type */
  1561. fmtinstall('U', srcconv);
  1562. fmtinstall('v', expconv); /* src expression */
  1563. fmtinstall('V', expconv); /* src expression in '' */
  1564. lexinit();
  1565. typeinit();
  1566. optabinit();
  1567. gendis = 1;
  1568. asmsym = 0;
  1569. maxerr = 20;
  1570. ofile = nil;
  1571. ext = nil;
  1572. ARGBEGIN{
  1573. case 'D':
  1574. /*
  1575. * debug flags:
  1576. *
  1577. * a alt compilation
  1578. * A array constructor compilation
  1579. * b boolean and branch compilation
  1580. * c case compilation
  1581. * d function declaration
  1582. * D descriptor generation
  1583. * e expression compilation
  1584. * E addressable expression compilation
  1585. * f print arguments for compiled functions
  1586. * F constant folding
  1587. * g print out globals
  1588. * m module declaration and type checking
  1589. * n nil references
  1590. * s print sizes of output file sections
  1591. * S type signing
  1592. * t type checking function bodies
  1593. * T timing
  1594. * v global var and constant compilation
  1595. * x adt verification
  1596. * Y tuple compilation
  1597. * z Z bug fixes
  1598. */
  1599. s = ARGF();
  1600. while(s && *s)
  1601. debug[*s++] = 1;
  1602. break;
  1603. case 'I':
  1604. s = ARGF();
  1605. if(s == nil)
  1606. usage();
  1607. addinclude(s);
  1608. break;
  1609. case 'G':
  1610. asmsym = 1;
  1611. break;
  1612. case 'S':
  1613. gendis = 0;
  1614. break;
  1615. case 'a':
  1616. emitstub = 1;
  1617. break;
  1618. case 'A':
  1619. emitstub = emitdyn = 1;
  1620. break;
  1621. case 'c':
  1622. mustcompile = 1;
  1623. break;
  1624. case 'C':
  1625. dontcompile = 1;
  1626. break;
  1627. case 'e':
  1628. maxerr = 1000;
  1629. break;
  1630. case 'f':
  1631. isfatal = 1;
  1632. break;
  1633. case 'F':
  1634. newfnptr = 1;
  1635. break;
  1636. case 'g':
  1637. dosym = 1;
  1638. break;
  1639. case 'i':
  1640. dontinline = 1;
  1641. break;
  1642. case 'o':
  1643. ofile = ARGF();
  1644. break;
  1645. case 'O':
  1646. optims = 1;
  1647. break;
  1648. case 's':
  1649. s = ARGF();
  1650. if(s != nil)
  1651. fixss = atoi(s);
  1652. break;
  1653. case 't':
  1654. emittab = ARGF();
  1655. if(emittab == nil)
  1656. usage();
  1657. break;
  1658. case 'T':
  1659. emitcode = ARGF();
  1660. if(emitcode == nil)
  1661. usage();
  1662. break;
  1663. case 'd':
  1664. emitcode = ARGF();
  1665. if(emitcode == nil)
  1666. usage();
  1667. emitdyn = 1;
  1668. break;
  1669. case 'w':
  1670. superwarn = dowarn;
  1671. dowarn = 1;
  1672. break;
  1673. case 'x':
  1674. ext = ARGF();
  1675. break;
  1676. case 'X':
  1677. signdump = ARGF();
  1678. break;
  1679. case 'y':
  1680. oldcycles = 1;
  1681. break;
  1682. case 'z':
  1683. arrayz = 1;
  1684. break;
  1685. default:
  1686. usage();
  1687. break;
  1688. }ARGEND
  1689. if((root = getroot()) != nil){
  1690. char *r;
  1691. r = malloc(strlen(root)+strlen(SLASHMOD)+1);
  1692. strcpy(r, root);
  1693. strcat(r, SLASHMOD);
  1694. addinclude(r);
  1695. free(root);
  1696. }
  1697. else
  1698. addinclude(INCPATH);
  1699. if(argc == 0){
  1700. usage();
  1701. }else if(ofile != nil){
  1702. if(argc != 1)
  1703. usage();
  1704. translate(argv[0], ofile, mkfileext(ofile, ".dis", ".sbl"));
  1705. }else{
  1706. if(ext == nil){
  1707. ext = ".s";
  1708. if(gendis)
  1709. ext = ".dis";
  1710. }
  1711. for(i = 0; i < argc; i++){
  1712. s = strrchr(argv[i], '/');
  1713. if(s == nil)
  1714. s = argv[i];
  1715. else
  1716. s++;
  1717. if(argc > 1)
  1718. print("%s:\n", argv[i]);
  1719. ofile = mkfileext(s, ".b", ext);
  1720. translate(argv[i], ofile, mkfileext(ofile, ext, ".sbl"));
  1721. }
  1722. }
  1723. if(toterrors)
  1724. exits("errors");
  1725. exits(0);
  1726. }
  1727. static void
  1728. usage(void)
  1729. {
  1730. fprint(2, "usage: limbo [-CGSacgwe] [-I incdir] [-o outfile] [-{T|t|d} module] [-D debug] file ...\n");
  1731. exits("usage");
  1732. }
  1733. static char*
  1734. mkfileext(char *file, char *oldext, char *ext)
  1735. {
  1736. char *ofile;
  1737. int n, n2;
  1738. n = strlen(file);
  1739. n2 = strlen(oldext);
  1740. if(n >= n2 && strcmp(&file[n-n2], oldext) == 0)
  1741. n -= n2;
  1742. ofile = malloc(n + strlen(ext) + 1);
  1743. memmove(ofile, file, n);
  1744. strcpy(ofile+n, ext);
  1745. return ofile;
  1746. }
  1747. void
  1748. translate(char *in, char *out, char *dbg)
  1749. {
  1750. Decl *entry;
  1751. int doemit;
  1752. infile = in;
  1753. outfile = out;
  1754. symfile = dbg;
  1755. errors = 0;
  1756. bins[0] = Bopen(in, OREAD);
  1757. if(bins[0] == nil){
  1758. fprint(2, "can't open %s: %r\n", in);
  1759. toterrors++;
  1760. return;
  1761. }
  1762. doemit = emitstub || emittab || emitcode;
  1763. if(!doemit){
  1764. bout = Bopen(out, OWRITE);
  1765. if(bout == nil){
  1766. fprint(2, "can't open %s: %r\n", out);
  1767. toterrors++;
  1768. Bterm(bins[0]);
  1769. return;
  1770. }
  1771. if(dosym){
  1772. bsym = Bopen(dbg, OWRITE);
  1773. if(bsym == nil)
  1774. fprint(2, "can't open %s: %r\n", dbg);
  1775. }
  1776. }
  1777. lexstart(in);
  1778. popscopes();
  1779. typestart();
  1780. declstart();
  1781. yyparse();
  1782. entry = typecheck(!doemit);
  1783. modcom(entry);
  1784. fns = nil;
  1785. nfns = 0;
  1786. descriptors = nil;
  1787. if(bout != nil)
  1788. Bterm(bout);
  1789. if(bsym != nil)
  1790. Bterm(bsym);
  1791. toterrors += errors;
  1792. if(errors && bout != nil)
  1793. remove(out);
  1794. if(errors && bsym != nil)
  1795. remove(dbg);
  1796. }
  1797. void
  1798. trapFPE(unsigned exception[5], int value[2])
  1799. {
  1800. /* can't happen; it's just here to keep FPinit happy. */
  1801. USED(exception);
  1802. USED(value);
  1803. }
  1804. static char *
  1805. win2inf(char *s)
  1806. {
  1807. int nt = 0;
  1808. char *t;
  1809. if(strlen(s) > 1 && s[1] == ':'){
  1810. s[1] = '/';
  1811. s++;
  1812. nt = 1;
  1813. }
  1814. for(t = s; *t != '\0'; t++){
  1815. if(*t == '\\')
  1816. *t = '/';
  1817. if(nt)
  1818. *t = tolower(*t);
  1819. }
  1820. return s;
  1821. }
  1822. static char *
  1823. cleann(char *s)
  1824. {
  1825. char *p, *r, *t;
  1826. char buf[256];
  1827. r = t = malloc(strlen(s)+1);
  1828. strcpy(t, s);
  1829. t = win2inf(t);
  1830. if(*t != '/'){
  1831. p = win2inf(getwd(buf, sizeof(buf)));
  1832. s = malloc(strlen(p)+strlen(t)+2);
  1833. strcpy(s, p);
  1834. strcat(s, "/");
  1835. strcat(s, t);
  1836. }
  1837. else{
  1838. s = malloc(strlen(t)+1);
  1839. strcpy(s, t);
  1840. }
  1841. free(r);
  1842. /* print("cleann: %s\n", p); */
  1843. return cleanname(s);
  1844. }
  1845. char *
  1846. srcpath(char *name, int nlen)
  1847. {
  1848. int l1, l2;
  1849. char *r, *srcp, *t;
  1850. srcp = cleann(infile);
  1851. r = getroot();
  1852. if(r == nil){
  1853. l1 = strlen(INCPATH);
  1854. r = malloc(l1+1);
  1855. strcpy(r, INCPATH);
  1856. if(l1 >= strlen(SLASHMOD) && strcmp(r+l1-strlen(SLASHMOD), SLASHMOD) == 0)
  1857. r[l1-strlen(SLASHMOD)] = '\0';
  1858. }
  1859. t = cleann(r);
  1860. free(r);
  1861. r = t;
  1862. /* srcp relative to r */
  1863. l1 = strlen(srcp);
  1864. l2 = strlen(r);
  1865. if(l1 >= l2 && strncmp(srcp, r, l2) == 0){
  1866. /* nothing to do */
  1867. }else
  1868. l2 = 0;
  1869. strncpy(name, srcp+l2, nlen);
  1870. name[nlen-1] = '\0';
  1871. free(r);
  1872. free(srcp);
  1873. /* print("srcpath: %s\n", name); */
  1874. return name;
  1875. }