M2P.mod 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294
  1. IMPLEMENTATION MODULE M2P;
  2. (* Parser generated by Coco/R - assuming ISO IO library will be available. *)
  3. IMPORT M2S, FileIO;
  4. IMPORT SymTab, QbeGen;
  5. CONST
  6. maxT = 82;
  7. minErrDist = 2; (* minimal distance (good tokens) between two errors *)
  8. setsize = 16; (* sets are stored in 16 bits *)
  9. TYPE
  10. SymbolSet = ARRAY [0 .. maxT DIV setsize] OF BITSET;
  11. VAR
  12. symSet: ARRAY [0 .. 11] OF SymbolSet; (*symSet[0] = allSyncSyms*)
  13. errDist: CARDINAL; (* number of symbols recognized since last error *)
  14. sym: CARDINAL; (* current input symbol *)
  15. PROCEDURE SemError (errNo: INTEGER);
  16. BEGIN
  17. IF errDist >= minErrDist THEN
  18. M2S.Error(errNo, M2S.line, M2S.col, M2S.pos);
  19. END;
  20. errDist := 0;
  21. END SemError;
  22. PROCEDURE SynError (errNo: INTEGER);
  23. BEGIN
  24. IF errDist >= minErrDist THEN
  25. M2S.Error(errNo, M2S.nextLine, M2S.nextCol, M2S.nextPos);
  26. END;
  27. errDist := 0;
  28. END SynError;
  29. PROCEDURE Get;
  30. VAR
  31. s: ARRAY [0 .. 31] OF CHAR;
  32. BEGIN
  33. REPEAT
  34. M2S.Get(sym);
  35. IF sym <= maxT THEN
  36. INC(errDist);
  37. ELSE
  38. END;
  39. UNTIL sym <= maxT
  40. END Get;
  41. PROCEDURE In (VAR s: SymbolSet; x: CARDINAL): BOOLEAN;
  42. BEGIN
  43. RETURN x MOD setsize IN s[x DIV setsize];
  44. END In;
  45. PROCEDURE Expect (n: CARDINAL);
  46. BEGIN
  47. IF sym = n THEN Get ELSE SynError(n) END
  48. END Expect;
  49. PROCEDURE ExpectWeak (n, follow: CARDINAL);
  50. BEGIN
  51. IF sym = n
  52. THEN Get
  53. ELSE SynError(n); WHILE NOT In(symSet[follow], sym) DO Get END
  54. END
  55. END ExpectWeak;
  56. PROCEDURE WeakSeparator (n, syFol, repFol: CARDINAL): BOOLEAN;
  57. VAR
  58. s: SymbolSet;
  59. i: CARDINAL;
  60. BEGIN
  61. IF sym = n
  62. THEN Get; RETURN TRUE
  63. ELSIF In(symSet[repFol], sym) THEN RETURN FALSE
  64. ELSE
  65. i := 0;
  66. WHILE i <= maxT DIV setsize DO
  67. s[i] := symSet[0, i] + symSet[syFol, i] + symSet[repFol, i]; INC(i)
  68. END;
  69. SynError(n); WHILE NOT In(s, sym) DO Get END;
  70. RETURN In(symSet[syFol], sym)
  71. END
  72. END WeakSeparator;
  73. PROCEDURE LexName (VAR Lex: ARRAY OF CHAR);
  74. BEGIN
  75. M2S.GetName(M2S.pos, M2S.len, Lex)
  76. END LexName;
  77. PROCEDURE LexString (VAR Lex: ARRAY OF CHAR);
  78. BEGIN
  79. M2S.GetString(M2S.pos, M2S.len, Lex)
  80. END LexString;
  81. PROCEDURE LookAheadName (VAR Lex: ARRAY OF CHAR);
  82. BEGIN
  83. M2S.GetName(M2S.nextPos, M2S.nextLen, Lex)
  84. END LookAheadName;
  85. PROCEDURE LookAheadString (VAR Lex: ARRAY OF CHAR);
  86. BEGIN
  87. M2S.GetString(M2S.nextPos, M2S.nextLen, Lex)
  88. END LookAheadString;
  89. PROCEDURE Successful (): BOOLEAN;
  90. BEGIN
  91. RETURN M2S.errors = 0
  92. END Successful;
  93. (* ----- FORWARD not needed in multipass compilers
  94. PROCEDURE SetItem; FORWARD;
  95. PROCEDURE MapTail; FORWARD;
  96. PROCEDURE SetItems; FORWARD;
  97. PROCEDURE MulOp (VAR op: INTEGER); FORWARD;
  98. PROCEDURE Fact (VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal); FORWARD;
  99. PROCEDURE AddOp (VAR op: INTEGER); FORWARD;
  100. PROCEDURE Term (VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal); FORWARD;
  101. PROCEDURE Rel (VAR op: INTEGER); FORWARD;
  102. PROCEDURE SimExpr (VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal); FORWARD;
  103. PROCEDURE ExprList; FORWARD;
  104. PROCEDURE CaseLabel (tsel: SymTab.TypeIndex; qsel: QbeGen.QVal;
  105. lBody: QbeGen.QVal); FORWARD;
  106. PROCEDURE CaseAlt (tsel: SymTab.TypeIndex; qsel: QbeGen.QVal;
  107. lEnd: QbeGen.QVal); FORWARD;
  108. PROCEDURE Design2 (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  109. VAR q: QbeGen.QVal; VAR qn: SymTab.Name); FORWARD;
  110. PROCEDURE ReturnStat; FORWARD;
  111. PROCEDURE WithStat; FORWARD;
  112. PROCEDURE CaseStat; FORWARD;
  113. PROCEDURE ForStat; FORWARD;
  114. PROCEDURE LoopStat; FORWARD;
  115. PROCEDURE RepeatStat; FORWARD;
  116. PROCEDURE WhileStat; FORWARD;
  117. PROCEDURE IfStat; FORWARD;
  118. PROCEDURE DesignStat; FORWARD;
  119. PROCEDURE Statement; FORWARD;
  120. PROCEDURE ActualParams; FORWARD;
  121. PROCEDURE Design (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  122. VAR q: QbeGen.QVal; VAR qn: SymTab.Name); FORWARD;
  123. PROCEDURE ParamSection; FORWARD;
  124. PROCEDURE FormalParams; FORWARD;
  125. PROCEDURE ParIdents (isV: BOOLEAN); FORWARD;
  126. PROCEDURE VarIdents; FORWARD;
  127. PROCEDURE VarDecl; FORWARD;
  128. PROCEDURE Block (pn: SymTab.Name); FORWARD;
  129. PROCEDURE MethodImpl (ct: SymTab.TypeIndex); FORWARD;
  130. PROCEDURE Parent1 (ct: SymTab.TypeIndex); FORWARD;
  131. PROCEDURE MethodHeading (VAR pn: SymTab.Name); FORWARD;
  132. PROCEDURE ClassField (ct: SymTab.TypeIndex); FORWARD;
  133. PROCEDURE Parents (ct: SymTab.TypeIndex); FORWARD;
  134. PROCEDURE ClassRest; FORWARD;
  135. PROCEDURE ClassImplRest; FORWARD;
  136. PROCEDURE ProcTypeParam; FORWARD;
  137. PROCEDURE VariantLabel; FORWARD;
  138. PROCEDURE VariantLabels; FORWARD;
  139. PROCEDURE Variant (rec: SymTab.TypeIndex); FORWARD;
  140. PROCEDURE FieldIdents (rec: SymTab.TypeIndex); FORWARD;
  141. PROCEDURE VariantList (rec: SymTab.TypeIndex); FORWARD;
  142. PROCEDURE FieldList (rec: SymTab.TypeIndex); FORWARD;
  143. PROCEDURE FieldListSequence (rec: SymTab.TypeIndex); FORWARD;
  144. PROCEDURE Bound; FORWARD;
  145. PROCEDURE Expr (VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal); FORWARD;
  146. PROCEDURE ProcType (VAR t: SymTab.TypeIndex); FORWARD;
  147. PROCEDURE PointerType (VAR t: SymTab.TypeIndex); FORWARD;
  148. PROCEDURE SetType (VAR t: SymTab.TypeIndex); FORWARD;
  149. PROCEDURE RecordType (VAR t: SymTab.TypeIndex); FORWARD;
  150. PROCEDURE ArrayType (VAR t: SymTab.TypeIndex); FORWARD;
  151. PROCEDURE Enum (VAR t: SymTab.TypeIndex); FORWARD;
  152. PROCEDURE SubrangeRest (VAR t: SymTab.TypeIndex); FORWARD;
  153. PROCEDURE TypeIdent2 (VAR t: SymTab.TypeIndex); FORWARD;
  154. PROCEDURE Type (VAR t: SymTab.TypeIndex); FORWARD;
  155. PROCEDURE TypeItem (isDef: BOOLEAN); FORWARD;
  156. PROCEDURE ImpList; FORWARD;
  157. PROCEDURE Export; FORWARD;
  158. PROCEDURE LabelList; FORWARD;
  159. PROCEDURE NestedModule; FORWARD;
  160. PROCEDURE ProcDecl; FORWARD;
  161. PROCEDURE Priority; FORWARD;
  162. PROCEDURE StatSeq; FORWARD;
  163. PROCEDURE DeclSeq; FORWARD;
  164. PROCEDURE ClassItem; FORWARD;
  165. PROCEDURE ProcHeading (VAR pn: SymTab.Name); FORWARD;
  166. PROCEDURE ConstDecl; FORWARD;
  167. PROCEDURE VarBlock; FORWARD;
  168. PROCEDURE TypeBlock (isDef: BOOLEAN); FORWARD;
  169. PROCEDURE ConstBlock; FORWARD;
  170. PROCEDURE Import; FORWARD;
  171. PROCEDURE GetIdent (VAR n: SymTab.Name); FORWARD;
  172. PROCEDURE ProgModule; FORWARD;
  173. PROCEDURE ImplUnit; FORWARD;
  174. PROCEDURE DefUnit; FORWARD;
  175. PROCEDURE Unit; FORWARD;
  176. PROCEDURE M2; FORWARD;
  177. ----- *)
  178. PROCEDURE SetItem;
  179. VAR t1, t2: SymTab.TypeIndex;
  180. q1, q2: QbeGen.QVal;
  181. BEGIN
  182. Expr(t1, q1);
  183. SemError(230);;
  184. IF (sym = 25) THEN
  185. Get;
  186. Expr(t2, q2);
  187. SemError(230);;
  188. END;
  189. END SetItem;
  190. PROCEDURE MapTail;
  191. VAR mq: SymTab.Name;
  192. et: SymTab.TypeIndex;
  193. q2: QbeGen.QVal;
  194. BEGIN
  195. WHILE (sym = 5) OR (sym = 15) OR (sym = 26) OR (sym = 59) DO
  196. IF (sym = 5) THEN
  197. Get;
  198. GetIdent(mq);
  199. SemError(230);;
  200. ELSIF (sym = 59) THEN
  201. Get;
  202. SemError(230);;
  203. ELSIF (sym = 15) THEN
  204. Get;
  205. Expr(et, q2);
  206. Expect(16);
  207. SemError(230);;
  208. ELSE
  209. Get;
  210. IF In(symSet[1], sym) THEN
  211. ActualParams;
  212. END;
  213. Expect(27);
  214. SemError(230);;
  215. END;
  216. END;
  217. END MapTail;
  218. PROCEDURE SetItems;
  219. BEGIN
  220. SetItem;
  221. WHILE (sym = 14) DO
  222. Get;
  223. SetItem;
  224. END;
  225. END SetItems;
  226. PROCEDURE MulOp (VAR op: INTEGER);
  227. BEGIN
  228. CASE sym OF
  229. 70 :
  230. Get;
  231. op := SymTab.OpTimes;;
  232. | 71 :
  233. Get;
  234. op := SymTab.OpSlash;;
  235. | 72 :
  236. Get;
  237. op := SymTab.OpDiv;;
  238. | 73 :
  239. Get;
  240. op := SymTab.OpMod;;
  241. | 74 :
  242. Get;
  243. op := SymTab.OpAnd;;
  244. | 75 :
  245. Get;
  246. op := SymTab.OpAnd;;
  247. | 76 :
  248. Get;
  249. op := 10;;
  250. | 77 :
  251. Get;
  252. op := 11;;
  253. ELSE SynError(83);
  254. END;
  255. END MulOp;
  256. PROCEDURE Fact (VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal);
  257. VAR s: ARRAY [0 .. 255] OF CHAR;
  258. et, dt, t2, b:
  259. SymTab.TypeIndex;
  260. dk: INTEGER;
  261. qd, q2: QbeGen.QVal;
  262. qn: SymTab.Name;
  263. isCh: BOOLEAN;
  264. BEGIN
  265. CASE sym OF
  266. 2 :
  267. Get;
  268. LexString(s);
  269. QbeGen.NormLit(s, q, isCh);
  270. IF isCh THEN
  271. t := SymTab.CharType()
  272. ELSE t := SymTab.IntType()
  273. END;;
  274. | 3 :
  275. Get;
  276. LexString(s);
  277. QbeGen.NormReal(s, q);
  278. t := SymTab.RealType();;
  279. | 4 :
  280. Get;
  281. LexString(s);
  282. IF SymTab.StrLen(s) <= 3 THEN
  283. t := SymTab.CharType();
  284. QbeGen.IntStr(
  285. QbeGen.CharVal(s), q)
  286. ELSE t := SymTab.NewStr();
  287. SemError(230);
  288. QbeGen.CopyOp("0", q)
  289. END;;
  290. | 78 :
  291. Get;
  292. IF In(symSet[1], sym) THEN
  293. SetItems;
  294. END;
  295. Expect(79);
  296. SemError(230);
  297. QbeGen.CopyOp("0", q);
  298. t := SymTab.InvalidType;;
  299. | 15 :
  300. Get;
  301. Expr(et, q);
  302. Expect(32);
  303. Expr(t2, q2);
  304. SemError(230);
  305. QbeGen.CopyOp("0", q);
  306. t := SymTab.InvalidType;;
  307. IF (sym = 1) THEN
  308. TypeIdent2(b);
  309. END;
  310. Expect(16);
  311. MapTail;
  312. | 1 :
  313. Design2(dt, dk, qd, qn);
  314. t := dt;
  315. QbeGen.CopyOp(qd, q);;
  316. | 26 :
  317. Get;
  318. Expr(et, q);
  319. Expect(27);
  320. t := et;;
  321. | 80 :
  322. Get;
  323. Fact(t2, q2);
  324. IF SymTab.BoolCheck(t2) THEN
  325. t := SymTab.BoolType()
  326. ELSE SemError(212);
  327. t := SymTab.InvalidType END;
  328. IF t # SymTab.InvalidType THEN
  329. QbeGen.NotQ(q2, q)
  330. ELSE QbeGen.CopyOp("0", q)
  331. END;;
  332. | 81 :
  333. Get;
  334. Fact(t2, q2);
  335. IF SymTab.BoolCheck(t2) THEN
  336. t := SymTab.BoolType()
  337. ELSE SemError(212);
  338. t := SymTab.InvalidType END;
  339. IF t # SymTab.InvalidType THEN
  340. QbeGen.NotQ(q2, q)
  341. ELSE QbeGen.CopyOp("0", q)
  342. END;;
  343. ELSE SynError(84);
  344. END;
  345. END Fact;
  346. PROCEDURE AddOp (VAR op: INTEGER);
  347. BEGIN
  348. IF (sym = 67) THEN
  349. Get;
  350. op := SymTab.OpAdd;;
  351. ELSIF (sym = 68) THEN
  352. Get;
  353. op := SymTab.OpSub;;
  354. ELSIF (sym = 69) THEN
  355. Get;
  356. op := SymTab.OpOr;;
  357. ELSE SynError(85);
  358. END;
  359. END AddOp;
  360. PROCEDURE Term (VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal);
  361. VAR t2, res2: SymTab.TypeIndex;
  362. op: INTEGER;
  363. q2, qt: QbeGen.QVal;
  364. isR: BOOLEAN;
  365. BEGIN
  366. Fact(t, q);
  367. WHILE In(symSet[2], sym) DO
  368. MulOp(op);
  369. Fact(t2, q2);
  370. IF (op = SymTab.OpAnd) THEN
  371. IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
  372. t := SymTab.BoolType()
  373. ELSE SemError(212); t := SymTab.InvalidType END;
  374. IF t # SymTab.InvalidType THEN
  375. QbeGen.NewTemp(qt);
  376. QbeGen.Op3("and", qt, q, q2, FALSE);
  377. QbeGen.CopyOp(qt, q)
  378. ELSE QbeGen.CopyOp("0", q)
  379. END
  380. ELSIF (op = 10) OR (op = 11) THEN
  381. (* << and >> : V3 word shifts; QBE shl/sar. *)
  382. IF ~SymTab.IsIntFamily(t) OR ~SymTab.IsIntFamily(t2) THEN
  383. SemError(211); t := SymTab.InvalidType END;
  384. IF t # SymTab.InvalidType THEN
  385. QbeGen.NewTemp(qt);
  386. IF op = 10 THEN QbeGen.Op3("shl", qt, q, q2, FALSE)
  387. ELSE QbeGen.Op3("sar", qt, q, q2, FALSE) END;
  388. QbeGen.CopyOp(qt, q)
  389. ELSE QbeGen.CopyOp("0", q)
  390. END
  391. ELSE
  392. IF SymTab.ArithCheck(t, t2,
  393. (op = SymTab.OpDiv) OR (op = SymTab.OpMod),
  394. res2) THEN t := res2
  395. ELSE SemError(211); t := SymTab.InvalidType END;
  396. isR := SymTab.ClassOf(t) = SymTab.ClReal;
  397. IF t # SymTab.InvalidType THEN
  398. QbeGen.NewTemp(qt);
  399. IF op = SymTab.OpTimes THEN
  400. QbeGen.Op3("mul", qt, q, q2, isR)
  401. ELSIF (op = SymTab.OpDiv)
  402. OR (op = SymTab.OpSlash) THEN
  403. QbeGen.Op3("div", qt, q, q2, isR)
  404. ELSE
  405. QbeGen.Op3("rem", qt, q, q2, isR)
  406. END;
  407. QbeGen.CopyOp(qt, q)
  408. ELSE QbeGen.CopyOp("0", q)
  409. END
  410. END;;
  411. END;
  412. END Term;
  413. PROCEDURE Rel (VAR op: INTEGER);
  414. BEGIN
  415. CASE sym OF
  416. 22 :
  417. Get;
  418. op := SymTab.OpEq;;
  419. | 61 :
  420. Get;
  421. op := SymTab.OpNeq1;;
  422. | 62 :
  423. Get;
  424. op := SymTab.OpNeq1;;
  425. | 63 :
  426. Get;
  427. op := SymTab.OpLt;;
  428. | 64 :
  429. Get;
  430. op := SymTab.OpLe;;
  431. | 65 :
  432. Get;
  433. op := SymTab.OpGt;;
  434. | 66 :
  435. Get;
  436. op := SymTab.OpGe;;
  437. ELSE SynError(86);
  438. END;
  439. END Rel;
  440. PROCEDURE SimExpr (VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal);
  441. VAR t2, res2: SymTab.TypeIndex;
  442. op: INTEGER;
  443. q2, qt: QbeGen.QVal;
  444. neg, isR: BOOLEAN;
  445. BEGIN
  446. neg := FALSE;;
  447. IF (sym = 67) OR (sym = 68) THEN
  448. IF (sym = 67) THEN
  449. Get;
  450. ELSE
  451. Get;
  452. neg := TRUE;;
  453. END;
  454. END;
  455. Term(t, q);
  456. IF neg THEN
  457. IF QbeGen.IsImm(q) THEN
  458. QbeGen.NegFold(q, q)
  459. ELSE QbeGen.NewTemp(qt);
  460. QbeGen.NegQ(q, qt,
  461. SymTab.ClassOf(t)
  462. = SymTab.ClReal);
  463. QbeGen.CopyOp(qt, q)
  464. END
  465. END;;
  466. WHILE (sym = 67) OR (sym = 68) OR (sym = 69) DO
  467. AddOp(op);
  468. Term(t2, q2);
  469. IF op = SymTab.OpOr THEN
  470. IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
  471. t := SymTab.BoolType()
  472. ELSE SemError(212); t := SymTab.InvalidType END;
  473. IF t # SymTab.InvalidType THEN
  474. QbeGen.NewTemp(qt);
  475. QbeGen.Op3("or", qt, q, q2, FALSE);
  476. QbeGen.CopyOp(qt, q)
  477. ELSE QbeGen.CopyOp("0", q)
  478. END
  479. ELSE
  480. IF SymTab.ArithCheck(t, t2, FALSE, res2) THEN
  481. t := res2
  482. ELSE SemError(211); t := SymTab.InvalidType END;
  483. isR := SymTab.ClassOf(t) = SymTab.ClReal;
  484. IF t # SymTab.InvalidType THEN
  485. QbeGen.NewTemp(qt);
  486. IF op = SymTab.OpAdd THEN
  487. QbeGen.Op3("add", qt, q, q2, isR)
  488. ELSE
  489. QbeGen.Op3("sub", qt, q, q2, isR)
  490. END;
  491. QbeGen.CopyOp(qt, q)
  492. ELSE QbeGen.CopyOp("0", q)
  493. END
  494. END;;
  495. END;
  496. END SimExpr;
  497. PROCEDURE ExprList;
  498. VAR t: SymTab.TypeIndex;
  499. q: QbeGen.QVal;
  500. BEGIN
  501. Expr(t, q);
  502. WHILE (sym = 14) DO
  503. Get;
  504. Expr(t, q);
  505. END;
  506. END ExprList;
  507. PROCEDURE CaseLabel (tsel: SymTab.TypeIndex; qsel: QbeGen.QVal;
  508. lBody: QbeGen.QVal);
  509. VAR t2, t3: SymTab.TypeIndex;
  510. q2, q3, qc, qd, qe:
  511. QbeGen.QVal;
  512. lNext: QbeGen.QVal;
  513. BEGIN
  514. Expr(t2, q2);
  515. IF (t2 #
  516. SymTab.InvalidType)
  517. & (tsel #
  518. SymTab.InvalidType)
  519. & ~SymTab.EqCheck(t2,
  520. tsel) THEN
  521. SemError(213) END;
  522. IF ~QbeGen.IsImm(q2) THEN
  523. SemError(230);
  524. QbeGen.CopyOp("0", q2)
  525. END;
  526. QbeGen.NewLabel(lNext);
  527. QbeGen.Cmp(SymTab.OpEq,
  528. qsel, q2, qc, FALSE);
  529. QbeGen.Jnz(qc, lBody, lNext);
  530. QbeGen.EmitLabel(lNext);;
  531. IF (sym = 25) THEN
  532. Get;
  533. Expr(t3, q3);
  534. IF (t3 #
  535. SymTab.InvalidType)
  536. & (tsel #
  537. SymTab.InvalidType)
  538. & ~SymTab.EqCheck(t3,
  539. tsel) THEN
  540. SemError(213) END;
  541. IF ~QbeGen.IsImm(q3) THEN
  542. SemError(230);
  543. QbeGen.CopyOp("0", q3)
  544. END;
  545. QbeGen.Cmp(SymTab.OpGe,
  546. qsel, q2, qc, FALSE);
  547. QbeGen.Cmp(SymTab.OpLe,
  548. qsel, q3, qd, FALSE);
  549. QbeGen.NewTemp(qe);
  550. QbeGen.Op3("and", qe, qc, qd,
  551. FALSE);
  552. QbeGen.NewLabel(lNext);
  553. QbeGen.Jnz(qe, lBody, lNext);
  554. QbeGen.EmitLabel(lNext);;
  555. END;
  556. END CaseLabel;
  557. PROCEDURE CaseAlt (tsel: SymTab.TypeIndex; qsel: QbeGen.QVal;
  558. lEnd: QbeGen.QVal);
  559. VAR lBody, lAfter: QbeGen.QVal;
  560. BEGIN
  561. QbeGen.NewLabel(lBody);
  562. QbeGen.NewLabel(lAfter);;
  563. CaseLabel(tsel, qsel, lBody);
  564. WHILE (sym = 14) DO
  565. Get;
  566. CaseLabel(tsel, qsel, lBody);
  567. END;
  568. Expect(32);
  569. QbeGen.Jmp(lAfter);
  570. QbeGen.EmitLabel(lBody);;
  571. IF In(symSet[3], sym) THEN
  572. StatSeq;
  573. QbeGen.Jmp(lEnd);;
  574. END;
  575. QbeGen.EmitLabel(lAfter);;
  576. END CaseAlt;
  577. PROCEDURE Design2 (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  578. VAR q: QbeGen.QVal; VAR qn: SymTab.Name);
  579. BEGIN
  580. Design(t, k, q, qn);
  581. WHILE (sym = 5) OR (sym = 15) OR (sym = 26) OR (sym = 59) DO
  582. IF (sym = 5) THEN
  583. Get;
  584. GetIdent(qn);
  585. SemError(230);
  586. t := SymTab.InvalidType;;
  587. ELSIF (sym = 59) THEN
  588. Get;
  589. SemError(230);
  590. t := SymTab.InvalidType;;
  591. ELSIF (sym = 15) THEN
  592. Get;
  593. ExprList;
  594. Expect(16);
  595. SemError(230);
  596. t := SymTab.InvalidType;;
  597. ELSE
  598. Get;
  599. IF In(symSet[1], sym) THEN
  600. ActualParams;
  601. END;
  602. Expect(27);
  603. SemError(230);
  604. t := SymTab.InvalidType;;
  605. END;
  606. END;
  607. END Design2;
  608. PROCEDURE ReturnStat;
  609. VAR t: SymTab.TypeIndex;
  610. q: QbeGen.QVal;
  611. res: SymTab.TypeIndex;
  612. hadE: BOOLEAN;
  613. BEGIN
  614. Expect(57);
  615. hadE := FALSE;;
  616. IF In(symSet[1], sym) THEN
  617. Expr(t, q);
  618. hadE := TRUE;;
  619. END;
  620. IF ~SymTab.InProc() THEN
  621. SemError(232)
  622. ELSE res := SymTab.CurRes();
  623. IF ~hadE THEN
  624. IF res #
  625. SymTab.InvalidType THEN
  626. SemError(232) END
  627. ELSIF (res =
  628. SymTab.InvalidType)
  629. OR (t #
  630. SymTab.InvalidType)
  631. & ~SymTab.Assignable(t,
  632. res) THEN
  633. SemError(232)
  634. END
  635. END;;
  636. END ReturnStat;
  637. PROCEDURE WithStat;
  638. VAR t: SymTab.TypeIndex;
  639. k: INTEGER;
  640. q: QbeGen.QVal;
  641. qn: SymTab.Name;
  642. BEGIN
  643. Expect(58);
  644. Design2(t, k, q, qn);
  645. IF ~SymTab.PushRecord(t) THEN
  646. SemError(230) END;;
  647. Expect(51);
  648. IF In(symSet[3], sym) THEN
  649. StatSeq;
  650. END;
  651. Expect(9);
  652. SymTab.PopScope;
  653. SemError(230);;
  654. END WithStat;
  655. PROCEDURE CaseStat;
  656. VAR tsel: SymTab.TypeIndex;
  657. qsel, lEnd: QbeGen.QVal;
  658. BEGIN
  659. Expect(31);
  660. Expr(tsel, qsel);
  661. QbeGen.NewLabel(lEnd);;
  662. Expect(29);
  663. IF (sym = 33) THEN
  664. Get;
  665. END;
  666. WHILE In(symSet[1], sym) DO
  667. CaseAlt(tsel, qsel, lEnd);
  668. IF (sym = 8) THEN
  669. Get;
  670. END;
  671. IF (sym = 33) THEN
  672. Get;
  673. END;
  674. END;
  675. IF (sym = 34) THEN
  676. Get;
  677. IF In(symSet[3], sym) THEN
  678. StatSeq;
  679. END;
  680. END;
  681. Expect(9);
  682. QbeGen.EmitLabel(lEnd);;
  683. END CaseStat;
  684. PROCEDURE ForStat;
  685. VAR lv: SymTab.Name;
  686. tlo, thi, tby:
  687. SymTab.TypeIndex;
  688. qlo, qhi, qby, qt, qk, qb:
  689. QbeGen.QVal;
  690. lTop, lBody, lEnd:
  691. QbeGen.QVal;
  692. by: INTEGER;
  693. ok: BOOLEAN;
  694. BEGIN
  695. Expect(55);
  696. by := 1;;
  697. GetIdent(lv);
  698. ok := SymTab.Lookup(lv);
  699. IF ~ok THEN
  700. SemError(201)
  701. ELSIF (SymTab.SymKind(lv) #
  702. SymTab.KindVar)
  703. & (SymTab.SymKind(lv) #
  704. SymTab.KindParam) THEN
  705. SemError(220); ok := FALSE
  706. ELSIF ~SymTab.IsIntFamily(
  707. SymTab.SymType(lv)) THEN
  708. SemError(220); ok := FALSE
  709. END;;
  710. Expect(46);
  711. Expr(tlo, qlo);
  712. IF ~SymTab.IsIntFamily(tlo) THEN
  713. SemError(220); ok := FALSE
  714. END;;
  715. Expect(36);
  716. Expr(thi, qhi);
  717. IF ~SymTab.IsIntFamily(thi) THEN
  718. SemError(220); ok := FALSE
  719. END;;
  720. IF (sym = 56) THEN
  721. Get;
  722. Expr(tby, qby);
  723. IF (tby #
  724. SymTab.InvalidType)
  725. & ~SymTab.IsIntFamily(tby) THEN
  726. SemError(220); ok := FALSE
  727. END;
  728. IF ~SymTab.ConstInt(qby, by) THEN
  729. SemError(230); by := 1
  730. ELSIF by = 0 THEN
  731. SemError(220); by := 1
  732. END;;
  733. END;
  734. Expect(51);
  735. IF ok THEN
  736. QbeGen.StoreVar(lv, qlo,
  737. FALSE) END;
  738. QbeGen.NewLabel(lTop);
  739. QbeGen.NewLabel(lBody);
  740. QbeGen.NewLabel(lEnd);
  741. QbeGen.EmitLabel(lTop);
  742. QbeGen.LoadVar(lv, FALSE, qt);
  743. QbeGen.NewTemp(qk);
  744. IF by > 0 THEN
  745. QbeGen.Op3("cslew", qk,
  746. qt, qhi, FALSE)
  747. ELSE QbeGen.Op3("csgew", qk,
  748. qt, qhi, FALSE)
  749. END;
  750. QbeGen.Jnz(qk, lBody, lEnd);
  751. QbeGen.EmitLabel(lBody);;
  752. IF In(symSet[3], sym) THEN
  753. StatSeq;
  754. END;
  755. Expect(9);
  756. IF ok THEN
  757. QbeGen.LoadVar(lv, FALSE,
  758. qt);
  759. QbeGen.IntStr(by, qb);
  760. QbeGen.NewTemp(qk);
  761. QbeGen.Op3("add", qk,
  762. qt, qb, FALSE);
  763. QbeGen.StoreVar(lv, qk,
  764. FALSE) END;
  765. QbeGen.Jmp(lTop);
  766. QbeGen.EmitLabel(lEnd);;
  767. END ForStat;
  768. PROCEDURE LoopStat;
  769. VAR lTop, lEnd: QbeGen.QVal;
  770. BEGIN
  771. Expect(54);
  772. QbeGen.NewLabel(lTop);
  773. QbeGen.NewLabel(lEnd);
  774. QbeGen.PushLoop(lEnd);
  775. QbeGen.EmitLabel(lTop);;
  776. IF In(symSet[3], sym) THEN
  777. StatSeq;
  778. END;
  779. Expect(9);
  780. QbeGen.Jmp(lTop);
  781. QbeGen.PopLoop;
  782. QbeGen.EmitLabel(lEnd);;
  783. END LoopStat;
  784. PROCEDURE RepeatStat;
  785. VAR t: SymTab.TypeIndex;
  786. q, lTop, lEnd: QbeGen.QVal;
  787. BEGIN
  788. Expect(52);
  789. QbeGen.NewLabel(lTop);
  790. QbeGen.NewLabel(lEnd);
  791. QbeGen.EmitLabel(lTop);;
  792. IF In(symSet[3], sym) THEN
  793. StatSeq;
  794. END;
  795. Expect(53);
  796. Expr(t, q);
  797. IF ~SymTab.BoolCheck(t) THEN
  798. SemError(214) END;
  799. QbeGen.Jnz(q, lEnd, lTop);
  800. QbeGen.EmitLabel(lEnd);;
  801. END RepeatStat;
  802. PROCEDURE WhileStat;
  803. VAR t: SymTab.TypeIndex;
  804. q, lTop, lBody, lEnd:
  805. QbeGen.QVal;
  806. BEGIN
  807. Expect(50);
  808. QbeGen.NewLabel(lTop);
  809. QbeGen.NewLabel(lBody);
  810. QbeGen.NewLabel(lEnd);
  811. QbeGen.EmitLabel(lTop);;
  812. Expr(t, q);
  813. IF ~SymTab.BoolCheck(t) THEN
  814. SemError(214) END;
  815. QbeGen.Jnz(q, lBody, lEnd);
  816. QbeGen.EmitLabel(lBody);;
  817. Expect(51);
  818. IF In(symSet[3], sym) THEN
  819. StatSeq;
  820. END;
  821. QbeGen.Jmp(lTop);;
  822. Expect(9);
  823. QbeGen.EmitLabel(lEnd);;
  824. END WhileStat;
  825. PROCEDURE IfStat;
  826. VAR t: SymTab.TypeIndex;
  827. q, lThen, lElse, lEnd:
  828. QbeGen.QVal;
  829. hasElse: BOOLEAN;
  830. BEGIN
  831. Expect(47);
  832. hasElse := FALSE;;
  833. Expr(t, q);
  834. IF ~SymTab.BoolCheck(t) THEN
  835. SemError(214) END;
  836. QbeGen.NewLabel(lThen);
  837. QbeGen.NewLabel(lElse);
  838. QbeGen.NewLabel(lEnd);
  839. QbeGen.Jnz(q, lThen, lElse);
  840. QbeGen.EmitLabel(lThen);;
  841. Expect(48);
  842. IF In(symSet[3], sym) THEN
  843. StatSeq;
  844. END;
  845. QbeGen.Jmp(lEnd);;
  846. WHILE (sym = 49) DO
  847. Get;
  848. QbeGen.EmitLabel(lElse);
  849. QbeGen.NewLabel(lElse);;
  850. Expr(t, q);
  851. IF ~SymTab.BoolCheck(t) THEN
  852. SemError(214) END;
  853. QbeGen.NewLabel(lThen);
  854. QbeGen.Jnz(q, lThen, lElse);
  855. QbeGen.EmitLabel(lThen);;
  856. Expect(48);
  857. IF In(symSet[3], sym) THEN
  858. StatSeq;
  859. END;
  860. QbeGen.Jmp(lEnd);;
  861. END;
  862. IF (sym = 34) THEN
  863. Get;
  864. QbeGen.EmitLabel(lElse);
  865. hasElse := TRUE;;
  866. IF In(symSet[3], sym) THEN
  867. StatSeq;
  868. END;
  869. END;
  870. Expect(9);
  871. IF hasElse THEN
  872. QbeGen.EmitLabel(lEnd)
  873. ELSE QbeGen.EmitLabel(lElse);
  874. QbeGen.EmitLabel(lEnd)
  875. END;;
  876. END IfStat;
  877. PROCEDURE DesignStat;
  878. VAR dt, et: SymTab.TypeIndex;
  879. dk: INTEGER;
  880. qd, qe, qt: QbeGen.QVal;
  881. qn: SymTab.Name;
  882. isR, conv: BOOLEAN;
  883. BEGIN
  884. Design2(dt, dk, qd, qn);
  885. IF (sym = 46) THEN
  886. Get;
  887. Expr(et, qe);
  888. IF (dt # SymTab.InvalidType)
  889. & (dk # SymTab.KindVar)
  890. & (dk # SymTab.KindParam) THEN
  891. SemError(210)
  892. ELSIF ~SymTab.Assignable(et,
  893. dt) THEN
  894. SemError(210) END;
  895. isR := (dt #
  896. SymTab.InvalidType)
  897. & (SymTab.ClassOf(dt)
  898. = SymTab.ClReal);
  899. conv := isR
  900. & SymTab.IsIntFamily(et);
  901. IF ((dk = SymTab.KindVar)
  902. OR (dk = SymTab.KindParam))
  903. & (dt # SymTab.InvalidType)
  904. & (et # SymTab.InvalidType) THEN
  905. IF conv THEN
  906. QbeGen.ConvIR(qe, qt);
  907. QbeGen.StoreVar(qn, qt, TRUE)
  908. ELSE
  909. QbeGen.StoreVar(qn, qe, isR)
  910. END
  911. END;;
  912. ELSIF (sym = 26) THEN
  913. Get;
  914. IF In(symSet[1], sym) THEN
  915. ActualParams;
  916. END;
  917. Expect(27);
  918. SemError(230);;
  919. ELSIF In(symSet[4], sym) THEN
  920. SemError(230);;
  921. ELSE SynError(87);
  922. END;
  923. END DesignStat;
  924. PROCEDURE Statement;
  925. VAR lx: QbeGen.QVal;
  926. lqn: SymTab.Name;
  927. BEGIN
  928. CASE sym OF
  929. 1 :
  930. DesignStat;
  931. | 47 :
  932. IfStat;
  933. | 50 :
  934. WhileStat;
  935. | 52 :
  936. RepeatStat;
  937. | 54 :
  938. LoopStat;
  939. | 55 :
  940. ForStat;
  941. | 31 :
  942. CaseStat;
  943. | 58 :
  944. WithStat;
  945. | 57 :
  946. ReturnStat;
  947. | 44 :
  948. Get;
  949. GetIdent(lqn);
  950. SemError(230);;
  951. | 45 :
  952. Get;
  953. IF QbeGen.TopLoop(lx) THEN
  954. QbeGen.Jmp(lx)
  955. ELSE SemError(230) END;;
  956. ELSE SynError(88);
  957. END;
  958. END Statement;
  959. PROCEDURE ActualParams;
  960. VAR t: SymTab.TypeIndex;
  961. q: QbeGen.QVal;
  962. BEGIN
  963. Expr(t, q);
  964. WHILE (sym = 14) DO
  965. Get;
  966. Expr(t, q);
  967. END;
  968. END ActualParams;
  969. PROCEDURE Design (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  970. VAR q: QbeGen.QVal; VAR qn: SymTab.Name);
  971. VAR n: SymTab.Name;
  972. cls: INTEGER;
  973. BEGIN
  974. GetIdent(n);
  975. QbeGen.CopyOp(n, qn);
  976. IF ~SymTab.Lookup(n) THEN
  977. SemError(201);
  978. t := SymTab.InvalidType;
  979. k := -1;
  980. QbeGen.CopyOp("0", q)
  981. ELSE
  982. t := SymTab.SymType(n);
  983. k := SymTab.SymKind(n);
  984. IF k = SymTab.KindConst THEN
  985. IF SymTab.Equal(n,
  986. "TRUE") THEN
  987. t := SymTab.BoolType();
  988. QbeGen.CopyOp("1", q)
  989. ELSIF SymTab.Equal(n,
  990. "FALSE") THEN
  991. t := SymTab.BoolType();
  992. QbeGen.CopyOp("0", q)
  993. ELSE
  994. cls := SymTab.ClassOf(t);
  995. IF (t # SymTab.InvalidType)
  996. & ((cls = SymTab.ClInt)
  997. OR (cls = SymTab.ClChar)
  998. OR (cls = SymTab.ClReal)) THEN
  999. QbeGen.LoadVar(n,
  1000. cls = SymTab.ClReal, q)
  1001. ELSE
  1002. IF t # SymTab.InvalidType
  1003. THEN SemError(230)
  1004. END;
  1005. QbeGen.CopyOp("0", q)
  1006. END
  1007. END
  1008. ELSIF (k = SymTab.KindVar)
  1009. OR (k = SymTab.KindParam) THEN
  1010. cls := SymTab.ClassOf(t);
  1011. IF (cls = SymTab.ClInt)
  1012. OR (cls = SymTab.ClBool)
  1013. OR (cls = SymTab.ClChar)
  1014. OR (cls = SymTab.ClReal) THEN
  1015. QbeGen.LoadVar(n,
  1016. cls = SymTab.ClReal, q)
  1017. ELSE SemError(230);
  1018. QbeGen.CopyOp("0", q)
  1019. END
  1020. ELSE QbeGen.CopyOp("0", q);
  1021. IF (k = SymTab.KindImport)
  1022. OR (k = SymTab.KindProc)
  1023. OR (k = SymTab.KindField) THEN
  1024. SemError(230)
  1025. END
  1026. END
  1027. END;;
  1028. END Design;
  1029. PROCEDURE ParamSection;
  1030. VAR t: SymTab.TypeIndex;
  1031. isV: BOOLEAN;
  1032. BEGIN
  1033. isV := FALSE;;
  1034. IF (sym = 38) THEN
  1035. Get;
  1036. isV := TRUE;;
  1037. END;
  1038. ParIdents(isV);
  1039. Expect(32);
  1040. Type(t);
  1041. IF NOT SymTab.FixPending(t) THEN END;;
  1042. END ParamSection;
  1043. PROCEDURE FormalParams;
  1044. BEGIN
  1045. Expect(26);
  1046. IF (sym = 1) OR (sym = 38) THEN
  1047. ParamSection;
  1048. WHILE (sym = 8) DO
  1049. Get;
  1050. ParamSection;
  1051. END;
  1052. END;
  1053. Expect(27);
  1054. END FormalParams;
  1055. PROCEDURE ParIdents (isV: BOOLEAN);
  1056. VAR n: SymTab.Name;
  1057. BEGIN
  1058. GetIdent(n);
  1059. IF ~SymTab.EnterParam(n, isV) THEN
  1060. SemError(200) END;;
  1061. WHILE (sym = 14) DO
  1062. Get;
  1063. GetIdent(n);
  1064. IF ~SymTab.EnterParam(n, isV) THEN
  1065. SemError(200) END;;
  1066. END;
  1067. END ParIdents;
  1068. PROCEDURE VarIdents;
  1069. VAR n: SymTab.Name;
  1070. t: SymTab.TypeIndex;
  1071. q: QbeGen.QVal;
  1072. BEGIN
  1073. GetIdent(n);
  1074. IF ~SymTab.EnterPending(n,
  1075. SymTab.KindVar) THEN
  1076. SemError(200) END;;
  1077. IF (sym = 15) THEN
  1078. Get;
  1079. Expr(t, q);
  1080. SemError(230);;
  1081. IF (sym = 32) THEN
  1082. Get;
  1083. Expr(t, q);
  1084. SemError(230);;
  1085. END;
  1086. Expect(16);
  1087. END;
  1088. WHILE (sym = 14) DO
  1089. Get;
  1090. GetIdent(n);
  1091. IF ~SymTab.EnterPending(n,
  1092. SymTab.KindVar) THEN
  1093. SemError(200) END;;
  1094. IF (sym = 15) THEN
  1095. Get;
  1096. Expr(t, q);
  1097. SemError(230);;
  1098. IF (sym = 32) THEN
  1099. Get;
  1100. Expr(t, q);
  1101. SemError(230);;
  1102. END;
  1103. Expect(16);
  1104. END;
  1105. END;
  1106. END VarIdents;
  1107. PROCEDURE VarDecl;
  1108. VAR nm: SymTab.Name;
  1109. t: SymTab.TypeIndex;
  1110. i: CARDINAL;
  1111. cls: INTEGER;
  1112. BEGIN
  1113. VarIdents;
  1114. Expect(32);
  1115. Type(t);
  1116. cls := SymTab.ClassOf(t);
  1117. IF (t # SymTab.InvalidType)
  1118. & (cls # SymTab.ClInt)
  1119. & (cls # SymTab.ClBool)
  1120. & (cls # SymTab.ClChar)
  1121. & (cls # SymTab.ClReal) THEN
  1122. SemError(230) END;
  1123. i := 0;
  1124. WHILE i < SymTab.PendCount() DO
  1125. SymTab.PendName(i, nm);
  1126. QbeGen.DeclVar(nm, t);
  1127. INC(i)
  1128. END;
  1129. IF NOT SymTab.FixPending(t) THEN END;;
  1130. END VarDecl;
  1131. PROCEDURE Block (pn: SymTab.Name);
  1132. VAR m2: SymTab.Name;
  1133. BEGIN
  1134. DeclSeq;
  1135. IF (sym = 11) THEN
  1136. Get;
  1137. IF In(symSet[3], sym) THEN
  1138. StatSeq;
  1139. END;
  1140. END;
  1141. Expect(9);
  1142. GetIdent(m2);
  1143. IF ~SymTab.Equal(pn, m2) THEN
  1144. SemError(202) END;;
  1145. END Block;
  1146. PROCEDURE MethodImpl (ct: SymTab.TypeIndex);
  1147. VAR pn: SymTab.Name;
  1148. BEGIN
  1149. MethodHeading(pn);
  1150. Expect(8);
  1151. IF (ct #
  1152. SymTab.InvalidType)
  1153. & ~SymTab.MethodExists(ct,
  1154. pn) THEN
  1155. SemError(201) END;;
  1156. IF (sym = 40) THEN
  1157. Get;
  1158. SymTab.MarkFwd;
  1159. SymTab.CloseProc;;
  1160. ELSIF In(symSet[5], sym) THEN
  1161. Block(pn);
  1162. SymTab.CloseProc;
  1163. SemError(230);;
  1164. ELSE SynError(89);
  1165. END;
  1166. END MethodImpl;
  1167. PROCEDURE Parent1 (ct: SymTab.TypeIndex);
  1168. VAR p: SymTab.Name;
  1169. pt: SymTab.TypeIndex;
  1170. BEGIN
  1171. GetIdent(p);
  1172. IF ~SymTab.Lookup(p) THEN
  1173. SemError(201)
  1174. ELSE pt := SymTab.SymType(p);
  1175. IF SymTab.ClassOf(pt) #
  1176. SymTab.ClClass THEN
  1177. SemError(230)
  1178. ELSE SymTab.SetParent(ct, pt)
  1179. END
  1180. END;;
  1181. END Parent1;
  1182. PROCEDURE MethodHeading (VAR pn: SymTab.Name);
  1183. VAR wantVirt: BOOLEAN;
  1184. BEGIN
  1185. wantVirt := FALSE;;
  1186. IF (sym = 23) THEN
  1187. Get;
  1188. wantVirt := TRUE;;
  1189. END;
  1190. ProcHeading(pn);
  1191. IF wantVirt THEN
  1192. SymTab.MarkVirtual END;;
  1193. END MethodHeading;
  1194. PROCEDURE ClassField (ct: SymTab.TypeIndex);
  1195. VAR n, rhs: SymTab.Name;
  1196. t: SymTab.TypeIndex;
  1197. BEGIN
  1198. GetIdent(n);
  1199. IF (sym = 22) THEN
  1200. Get;
  1201. GetIdent(rhs);
  1202. IF ~SymTab.Enter(n,
  1203. SymTab.KindConst) THEN
  1204. SemError(200) END;
  1205. IF SymTab.Lookup(rhs) THEN
  1206. SymTab.SetSymType(n,
  1207. SymTab.SymType(rhs))
  1208. END;;
  1209. ELSIF (sym = 14) OR (sym = 32) THEN
  1210. IF ~SymTab.FieldPending(ct,
  1211. n) THEN
  1212. SemError(200) END;;
  1213. WHILE (sym = 14) DO
  1214. Get;
  1215. GetIdent(n);
  1216. IF ~SymTab.FieldPending(ct,
  1217. n) THEN
  1218. SemError(200) END;;
  1219. END;
  1220. Expect(32);
  1221. TypeIdent2(t);
  1222. SymTab.FixPendingF(ct, t);;
  1223. ELSE SynError(90);
  1224. END;
  1225. END ClassField;
  1226. PROCEDURE Parents (ct: SymTab.TypeIndex);
  1227. VAR p: SymTab.Name;
  1228. BEGIN
  1229. Expect(26);
  1230. Parent1(ct);
  1231. WHILE (sym = 14) DO
  1232. Get;
  1233. GetIdent(p);
  1234. SemError(230);;
  1235. END;
  1236. Expect(27);
  1237. END Parents;
  1238. PROCEDURE ClassRest;
  1239. VAR cn, m2, pn, q: SymTab.Name;
  1240. ct: SymTab.TypeIndex;
  1241. BEGIN
  1242. GetIdent(cn);
  1243. IF ~SymTab.Enter(cn,
  1244. SymTab.KindType) THEN
  1245. SemError(200) END;
  1246. ct := SymTab.NewClass();
  1247. SymTab.SetSymType(cn, ct);
  1248. SymTab.PushClassScope(ct);;
  1249. IF (sym = 26) THEN
  1250. Parents(ct);
  1251. END;
  1252. Expect(8);
  1253. WHILE (sym = 1) DO
  1254. ClassField(ct);
  1255. Expect(8);
  1256. END;
  1257. WHILE (sym = 23) OR (sym = 37) DO
  1258. MethodHeading(pn);
  1259. Expect(8);
  1260. IF (sym = 40) THEN
  1261. Get;
  1262. SymTab.MarkFwd;
  1263. SymTab.CloseProc;;
  1264. Expect(8);
  1265. ELSIF (sym = 11) THEN
  1266. Get;
  1267. IF In(symSet[3], sym) THEN
  1268. StatSeq;
  1269. END;
  1270. Expect(9);
  1271. GetIdent(q);
  1272. IF ~SymTab.Equal(pn, q) THEN
  1273. SemError(202) END;
  1274. SymTab.CloseProc;
  1275. SemError(230);;
  1276. Expect(8);
  1277. ELSIF (sym = 9) OR (sym = 11) OR (sym = 23) OR (sym = 37) THEN
  1278. SymTab.CloseProc;;
  1279. ELSE SynError(91);
  1280. END;
  1281. END;
  1282. IF (sym = 11) THEN
  1283. Get;
  1284. SemError(230);;
  1285. IF In(symSet[3], sym) THEN
  1286. StatSeq;
  1287. END;
  1288. END;
  1289. Expect(9);
  1290. GetIdent(m2);
  1291. IF ~SymTab.Equal(cn, m2) THEN
  1292. SemError(202) END;
  1293. SymTab.PopScope;
  1294. SemError(230);;
  1295. END ClassRest;
  1296. PROCEDURE ClassImplRest;
  1297. VAR cn, m2: SymTab.Name;
  1298. ct: SymTab.TypeIndex;
  1299. BEGIN
  1300. GetIdent(cn);
  1301. IF ~SymTab.Lookup(cn) THEN
  1302. SemError(201);
  1303. ct := SymTab.InvalidType
  1304. ELSE ct := SymTab.SymType(cn);
  1305. IF SymTab.ClassOf(ct) #
  1306. SymTab.ClClass THEN
  1307. SemError(230);
  1308. ct := SymTab.InvalidType
  1309. END
  1310. END;
  1311. IF ct #
  1312. SymTab.InvalidType THEN
  1313. IF ~SymTab.PushClassMembers(
  1314. ct) THEN
  1315. SemError(230) END
  1316. END;;
  1317. Expect(8);
  1318. WHILE (sym = 23) OR (sym = 37) DO
  1319. MethodImpl(ct);
  1320. Expect(8);
  1321. END;
  1322. IF (sym = 11) THEN
  1323. Get;
  1324. QbeGen.BeginBody;;
  1325. IF In(symSet[3], sym) THEN
  1326. StatSeq;
  1327. END;
  1328. END;
  1329. Expect(9);
  1330. GetIdent(m2);
  1331. IF ~SymTab.Equal(cn, m2) THEN
  1332. SemError(202) END;
  1333. SymTab.PopScope;
  1334. SemError(230);;
  1335. END ClassImplRest;
  1336. PROCEDURE ProcTypeParam;
  1337. VAR b: SymTab.TypeIndex;
  1338. BEGIN
  1339. IF (sym = 38) THEN
  1340. Get;
  1341. END;
  1342. Type(b);
  1343. SemError(230);;
  1344. END ProcTypeParam;
  1345. PROCEDURE VariantLabel;
  1346. VAR t1, t2: SymTab.TypeIndex;
  1347. q1, q2: QbeGen.QVal;
  1348. BEGIN
  1349. Expr(t1, q1);
  1350. SemError(230);;
  1351. IF (sym = 25) THEN
  1352. Get;
  1353. Expr(t2, q2);
  1354. SemError(230);;
  1355. END;
  1356. END VariantLabel;
  1357. PROCEDURE VariantLabels;
  1358. BEGIN
  1359. VariantLabel;
  1360. WHILE (sym = 14) DO
  1361. Get;
  1362. VariantLabel;
  1363. END;
  1364. END VariantLabels;
  1365. PROCEDURE Variant (rec: SymTab.TypeIndex);
  1366. BEGIN
  1367. VariantLabels;
  1368. Expect(32);
  1369. SymTab.PushScope;;
  1370. FieldListSequence(rec);
  1371. SymTab.PopScope;;
  1372. END Variant;
  1373. PROCEDURE FieldIdents (rec: SymTab.TypeIndex);
  1374. VAR n: SymTab.Name;
  1375. t: SymTab.TypeIndex;
  1376. BEGIN
  1377. GetIdent(n);
  1378. IF ~SymTab.FieldPending(rec, n)
  1379. THEN SemError(200) END;;
  1380. WHILE (sym = 14) DO
  1381. Get;
  1382. GetIdent(n);
  1383. IF ~SymTab.FieldPending(rec, n)
  1384. THEN SemError(200) END;;
  1385. END;
  1386. Expect(32);
  1387. Type(t);
  1388. SymTab.FixPendingF(rec, t);;
  1389. END FieldIdents;
  1390. PROCEDURE VariantList (rec: SymTab.TypeIndex);
  1391. BEGIN
  1392. IF (sym = 33) THEN
  1393. Get;
  1394. END;
  1395. Variant(rec);
  1396. WHILE (sym = 33) DO
  1397. Get;
  1398. IF In(symSet[1], sym) THEN
  1399. Variant(rec);
  1400. END;
  1401. END;
  1402. IF (sym = 34) THEN
  1403. Get;
  1404. FieldListSequence(rec);
  1405. END;
  1406. END VariantList;
  1407. PROCEDURE FieldList (rec: SymTab.TypeIndex);
  1408. VAR tag: SymTab.Name;
  1409. ti: SymTab.TypeIndex;
  1410. BEGIN
  1411. IF (sym = 31) THEN
  1412. Get;
  1413. SemError(230);;
  1414. IF (sym = 1) THEN
  1415. GetIdent(tag);
  1416. Expect(32);
  1417. (* named selector *);
  1418. ELSIF (sym = 32) THEN
  1419. Get;
  1420. (* anonymous selector *);
  1421. ELSIF In(symSet[6], sym) THEN
  1422. (* no selector *);
  1423. ELSE SynError(92);
  1424. END;
  1425. Type(ti);
  1426. Expect(29);
  1427. VariantList(rec);
  1428. Expect(9);
  1429. ELSIF (sym = 1) THEN
  1430. FieldIdents(rec);
  1431. ELSE SynError(93);
  1432. END;
  1433. END FieldList;
  1434. PROCEDURE FieldListSequence (rec: SymTab.TypeIndex);
  1435. BEGIN
  1436. IF (sym = 1) OR (sym = 31) THEN
  1437. FieldList(rec);
  1438. WHILE (sym = 8) DO
  1439. Get;
  1440. IF (sym = 1) OR (sym = 31) THEN
  1441. FieldList(rec);
  1442. END;
  1443. END;
  1444. END;
  1445. END FieldListSequence;
  1446. PROCEDURE Bound;
  1447. VAR t: SymTab.TypeIndex;
  1448. q: QbeGen.QVal;
  1449. BEGIN
  1450. Expr(t, q);
  1451. IF (sym = 25) THEN
  1452. Get;
  1453. Expr(t, q);
  1454. END;
  1455. SemError(230);;
  1456. END Bound;
  1457. PROCEDURE Expr (VAR t: SymTab.TypeIndex; VAR q: QbeGen.QVal);
  1458. VAR t2: SymTab.TypeIndex;
  1459. op: INTEGER;
  1460. q2, qt: QbeGen.QVal;
  1461. isR: BOOLEAN;
  1462. BEGIN
  1463. SimExpr(t, q);
  1464. IF In(symSet[7], sym) THEN
  1465. IF In(symSet[8], sym) THEN
  1466. Rel(op);
  1467. SimExpr(t2, q2);
  1468. IF SymTab.RelCheck(t, t2, op) THEN
  1469. isR := SymTab.ClassOf(t) = SymTab.ClReal;
  1470. t := SymTab.BoolType()
  1471. ELSE SemError(213); t := SymTab.InvalidType;
  1472. isR := FALSE END;
  1473. IF t # SymTab.InvalidType THEN
  1474. QbeGen.Cmp(op, q, q2, qt, isR);
  1475. QbeGen.CopyOp(qt, q)
  1476. ELSE QbeGen.CopyOp("0", q)
  1477. END;;
  1478. ELSIF (sym = 43) THEN
  1479. Get;
  1480. SimExpr(t2, q2);
  1481. IF ~SymTab.InCheck(t, t2) THEN
  1482. SemError(222) END;
  1483. SemError(230);
  1484. QbeGen.CopyOp("0", q);
  1485. t := SymTab.InvalidType;;
  1486. ELSE
  1487. Get;
  1488. TypeIdent2(t2);
  1489. SemError(213);
  1490. SemError(230);
  1491. QbeGen.CopyOp("0", q);
  1492. t := SymTab.InvalidType;;
  1493. END;
  1494. END;
  1495. END Expr;
  1496. PROCEDURE ProcType (VAR t: SymTab.TypeIndex);
  1497. VAR b: SymTab.TypeIndex;
  1498. BEGIN
  1499. Expect(37);
  1500. t := SymTab.InvalidType;
  1501. SemError(230);;
  1502. IF (sym = 26) THEN
  1503. Get;
  1504. IF In(symSet[9], sym) THEN
  1505. ProcTypeParam;
  1506. WHILE (sym = 14) DO
  1507. Get;
  1508. ProcTypeParam;
  1509. END;
  1510. END;
  1511. Expect(27);
  1512. END;
  1513. IF (sym = 32) THEN
  1514. Get;
  1515. TypeIdent2(b);
  1516. SemError(230);;
  1517. END;
  1518. END ProcType;
  1519. PROCEDURE PointerType (VAR t: SymTab.TypeIndex);
  1520. VAR b: SymTab.TypeIndex;
  1521. BEGIN
  1522. Expect(24);
  1523. Expect(36);
  1524. Type(b);
  1525. t := SymTab.NewPtr(b);
  1526. SemError(230);;
  1527. END PointerType;
  1528. PROCEDURE SetType (VAR t: SymTab.TypeIndex);
  1529. VAR b: SymTab.TypeIndex;
  1530. BEGIN
  1531. Expect(35);
  1532. Expect(29);
  1533. IF (sym = 1) THEN
  1534. TypeIdent2(b);
  1535. t := SymTab.NewSet(b);
  1536. SemError(230);;
  1537. ELSIF (sym = 15) THEN
  1538. Get;
  1539. SubrangeRest(b);
  1540. Expect(16);
  1541. t := SymTab.NewSet(b);
  1542. SemError(230);;
  1543. ELSIF (sym = 26) THEN
  1544. Enum(b);
  1545. t := SymTab.NewSet(b);
  1546. SemError(230);;
  1547. ELSE SynError(94);
  1548. END;
  1549. END SetType;
  1550. PROCEDURE RecordType (VAR t: SymTab.TypeIndex);
  1551. VAR n: SymTab.Name;
  1552. rt: SymTab.TypeIndex;
  1553. BEGIN
  1554. Expect(30);
  1555. rt := SymTab.NewRecord();
  1556. t := rt;;
  1557. FieldListSequence(rt);
  1558. Expect(9);
  1559. SemError(230);;
  1560. END RecordType;
  1561. PROCEDURE ArrayType (VAR t: SymTab.TypeIndex);
  1562. VAR e: SymTab.TypeIndex;
  1563. i: CARDINAL;
  1564. BEGIN
  1565. Expect(28);
  1566. IF (sym = 15) THEN
  1567. Get;
  1568. Bound;
  1569. WHILE (sym = 14) DO
  1570. Get;
  1571. Bound;
  1572. END;
  1573. Expect(16);
  1574. t := SymTab.InvalidType;;
  1575. ELSIF In(symSet[1], sym) THEN
  1576. Bound;
  1577. t := SymTab.InvalidType;;
  1578. ELSIF (sym = 29) THEN
  1579. t := SymTab.InvalidType;;
  1580. ELSE SynError(95);
  1581. END;
  1582. Expect(29);
  1583. Type(e);
  1584. t := SymTab.NewOpenArray(e);
  1585. SemError(230);;
  1586. END ArrayType;
  1587. PROCEDURE Enum (VAR t: SymTab.TypeIndex);
  1588. VAR n: SymTab.Name;
  1589. BEGIN
  1590. Expect(26);
  1591. t := SymTab.NewEnum();;
  1592. GetIdent(n);
  1593. IF ~SymTab.Enter(n,
  1594. SymTab.KindConst) THEN
  1595. SemError(200) END;
  1596. SymTab.SetSymType(n, t);;
  1597. WHILE (sym = 14) DO
  1598. Get;
  1599. GetIdent(n);
  1600. IF ~SymTab.Enter(n,
  1601. SymTab.KindConst) THEN
  1602. SemError(200) END;
  1603. SymTab.SetSymType(n, t);;
  1604. END;
  1605. Expect(27);
  1606. END Enum;
  1607. PROCEDURE SubrangeRest (VAR t: SymTab.TypeIndex);
  1608. VAR tlo, thi: SymTab.TypeIndex;
  1609. qlo, qhi: QbeGen.QVal;
  1610. lo, hi: INTEGER;
  1611. BEGIN
  1612. Expr(tlo, qlo);
  1613. Expect(25);
  1614. Expr(thi, qhi);
  1615. IF (tlo = SymTab.InvalidType)
  1616. OR (thi = SymTab.InvalidType) THEN
  1617. t := SymTab.InvalidType
  1618. ELSIF (SymTab.ClassOf(tlo) #
  1619. SymTab.ClInt)
  1620. OR (SymTab.ClassOf(thi) #
  1621. SymTab.ClInt) THEN
  1622. SemError(230);
  1623. t := SymTab.InvalidType
  1624. ELSIF ~SymTab.ConstInt(qlo, lo)
  1625. OR ~SymTab.ConstInt(qhi, hi)
  1626. OR (lo > hi) THEN
  1627. SemError(230);
  1628. t := SymTab.InvalidType
  1629. ELSE t := SymTab.NewSubR(lo, hi)
  1630. END;;
  1631. END SubrangeRest;
  1632. PROCEDURE TypeIdent2 (VAR t: SymTab.TypeIndex);
  1633. VAR n: SymTab.Name;
  1634. k: INTEGER;
  1635. BEGIN
  1636. GetIdent(n);
  1637. IF ~SymTab.Lookup(n) THEN
  1638. SemError(201);
  1639. t := SymTab.InvalidType
  1640. ELSE k := SymTab.SymKind(n);
  1641. IF (k = SymTab.KindType)
  1642. OR (k = SymTab.KindPredef) THEN
  1643. t := SymTab.SymType(n)
  1644. ELSIF k = SymTab.KindImport THEN
  1645. t := SymTab.InvalidType
  1646. ELSE SemError(221);
  1647. t := SymTab.InvalidType
  1648. END
  1649. END;;
  1650. WHILE (sym = 5) DO
  1651. Get;
  1652. GetIdent(n);
  1653. SemError(230);
  1654. t := SymTab.InvalidType;;
  1655. END;
  1656. END TypeIdent2;
  1657. PROCEDURE Type (VAR t: SymTab.TypeIndex);
  1658. BEGIN
  1659. CASE sym OF
  1660. 1 :
  1661. TypeIdent2(t);
  1662. IF (sym = 15) THEN
  1663. Get;
  1664. SubrangeRest(t);
  1665. (* anchored subrange:
  1666. SHORTINT[-1..1],
  1667. SHORTCARD[0..7] *);
  1668. Expect(16);
  1669. END;
  1670. | 15 :
  1671. Get;
  1672. SubrangeRest(t);
  1673. Expect(16);
  1674. | 26 :
  1675. Enum(t);
  1676. | 28 :
  1677. ArrayType(t);
  1678. | 30 :
  1679. RecordType(t);
  1680. | 35 :
  1681. SetType(t);
  1682. | 24 :
  1683. PointerType(t);
  1684. | 23 :
  1685. Get;
  1686. Expect(24);
  1687. TypeIdent2(t);
  1688. SemError(230);;
  1689. | 37 :
  1690. ProcType(t);
  1691. ELSE SynError(96);
  1692. END;
  1693. END Type;
  1694. PROCEDURE TypeItem (isDef: BOOLEAN);
  1695. VAR n: SymTab.Name;
  1696. t: SymTab.TypeIndex;
  1697. BEGIN
  1698. GetIdent(n);
  1699. IF ~SymTab.Enter(n,
  1700. SymTab.KindType) THEN
  1701. SemError(200) END;;
  1702. IF (sym = 22) THEN
  1703. Get;
  1704. Type(t);
  1705. SymTab.SetSymType(n, t);;
  1706. ELSIF (sym = 8) THEN
  1707. IF ~isDef THEN
  1708. SemError(231) END;
  1709. SymTab.SetSymType(n,
  1710. SymTab.NewAlias());;
  1711. ELSE SynError(97);
  1712. END;
  1713. END TypeItem;
  1714. PROCEDURE ImpList;
  1715. VAR n: SymTab.Name;
  1716. BEGIN
  1717. GetIdent(n);
  1718. IF ~SymTab.Enter(n,
  1719. SymTab.KindImport) THEN
  1720. SemError(200) END;;
  1721. WHILE (sym = 14) DO
  1722. Get;
  1723. GetIdent(n);
  1724. IF ~SymTab.Enter(n,
  1725. SymTab.KindImport) THEN
  1726. SemError(200) END;;
  1727. END;
  1728. END ImpList;
  1729. PROCEDURE Export;
  1730. VAR nm: SymTab.Name;
  1731. BEGIN
  1732. Expect(17);
  1733. IF (sym = 18) THEN
  1734. Get;
  1735. END;
  1736. GetIdent(nm);
  1737. WHILE (sym = 14) DO
  1738. Get;
  1739. GetIdent(nm);
  1740. END;
  1741. Expect(8);
  1742. END Export;
  1743. PROCEDURE LabelList;
  1744. VAR nm: SymTab.Name;
  1745. BEGIN
  1746. GetIdent(nm);
  1747. SemError(230);;
  1748. WHILE (sym = 14) DO
  1749. Get;
  1750. GetIdent(nm);
  1751. SemError(230);;
  1752. END;
  1753. END LabelList;
  1754. PROCEDURE NestedModule;
  1755. VAR m1, m2: SymTab.Name;
  1756. BEGIN
  1757. Expect(7);
  1758. GetIdent(m1);
  1759. IF ~SymTab.Enter(m1,
  1760. SymTab.KindModule) THEN
  1761. SemError(200) END;
  1762. SymTab.PushScope;;
  1763. IF (sym = 15) THEN
  1764. Priority;
  1765. END;
  1766. Expect(8);
  1767. WHILE (sym = 19) OR (sym = 20) DO
  1768. Import;
  1769. END;
  1770. IF (sym = 17) THEN
  1771. Export;
  1772. END;
  1773. DeclSeq;
  1774. IF (sym = 11) THEN
  1775. Get;
  1776. IF In(symSet[3], sym) THEN
  1777. StatSeq;
  1778. END;
  1779. END;
  1780. Expect(9);
  1781. GetIdent(m2);
  1782. IF ~SymTab.Equal(m1, m2) THEN
  1783. SemError(202) END;
  1784. SymTab.PopScope;
  1785. SemError(230);;
  1786. END NestedModule;
  1787. PROCEDURE ProcDecl;
  1788. VAR pn, assem: SymTab.Name;
  1789. at: SymTab.TypeIndex;
  1790. ak: INTEGER;
  1791. aq: QbeGen.QVal;
  1792. BEGIN
  1793. ProcHeading(pn);
  1794. IF (sym = 8) THEN
  1795. Get;
  1796. IF (sym = 40) THEN
  1797. Get;
  1798. SymTab.MarkFwd;
  1799. SymTab.CloseProc;;
  1800. ELSIF (sym = 43) THEN
  1801. Get;
  1802. GetIdent(assem);
  1803. SymTab.CloseProc;
  1804. SemError(230);;
  1805. ELSIF In(symSet[5], sym) THEN
  1806. Block(pn);
  1807. SymTab.CloseProc;
  1808. SemError(230);;
  1809. ELSE SynError(98);
  1810. END;
  1811. ELSIF (sym = 22) THEN
  1812. Get;
  1813. Design(at, ak, aq, assem);
  1814. SymTab.CloseProc;
  1815. SemError(230);;
  1816. Expect(26);
  1817. IF In(symSet[1], sym) THEN
  1818. ActualParams;
  1819. END;
  1820. Expect(27);
  1821. ELSE SynError(99);
  1822. END;
  1823. END ProcDecl;
  1824. PROCEDURE Priority;
  1825. BEGIN
  1826. Expect(15);
  1827. Expect(2);
  1828. Expect(16);
  1829. SemError(230);;
  1830. END Priority;
  1831. PROCEDURE StatSeq;
  1832. BEGIN
  1833. Statement;
  1834. WHILE (sym = 8) DO
  1835. Get;
  1836. IF In(symSet[3], sym) THEN
  1837. Statement;
  1838. END;
  1839. END;
  1840. END StatSeq;
  1841. PROCEDURE DeclSeq;
  1842. BEGIN
  1843. WHILE In(symSet[10], sym) DO
  1844. CASE sym OF
  1845. 41 :
  1846. ConstBlock;
  1847. | 21 :
  1848. TypeBlock(FALSE);
  1849. | 38 :
  1850. VarBlock;
  1851. | 1 :
  1852. ConstDecl;
  1853. Expect(8);
  1854. (* manifest const, no CONST *);
  1855. | 12, 37 :
  1856. IF (sym = 12) THEN
  1857. Get;
  1858. END;
  1859. ProcDecl;
  1860. Expect(8);
  1861. | 7 :
  1862. NestedModule;
  1863. Expect(8);
  1864. | 39 :
  1865. ClassItem;
  1866. Expect(8);
  1867. | 13 :
  1868. Get;
  1869. LabelList;
  1870. Expect(8);
  1871. END;
  1872. END;
  1873. END DeclSeq;
  1874. PROCEDURE ClassItem;
  1875. BEGIN
  1876. Expect(39);
  1877. IF (sym = 10) THEN
  1878. Get;
  1879. ClassImplRest;
  1880. ELSIF (sym = 1) THEN
  1881. ClassRest;
  1882. ELSE SynError(100);
  1883. END;
  1884. END ClassItem;
  1885. PROCEDURE ProcHeading (VAR pn: SymTab.Name);
  1886. VAR t: SymTab.TypeIndex;
  1887. BEGIN
  1888. Expect(37);
  1889. GetIdent(pn);
  1890. IF ~SymTab.EnterProc(pn) THEN
  1891. IF ~SymTab.ReenterProc(pn) THEN
  1892. SemError(200) END
  1893. END;;
  1894. IF (sym = 26) THEN
  1895. FormalParams;
  1896. END;
  1897. IF (sym = 32) THEN
  1898. Get;
  1899. TypeIdent2(t);
  1900. IF NOT SymTab.SetProcRes(t) THEN END;;
  1901. END;
  1902. END ProcHeading;
  1903. PROCEDURE ConstDecl;
  1904. VAR n: SymTab.Name;
  1905. t: SymTab.TypeIndex;
  1906. qv: QbeGen.QVal;
  1907. cls: INTEGER;
  1908. BEGIN
  1909. GetIdent(n);
  1910. IF ~SymTab.Enter(n,
  1911. SymTab.KindConst) THEN
  1912. SemError(200) END;;
  1913. IF (sym = 42) THEN
  1914. Get;
  1915. SemError(230);;
  1916. Expr(t, qv);
  1917. SymTab.SetSymType(n, t);
  1918. QbeGen.DeclConst(n, "0",
  1919. SymTab.InvalidType);;
  1920. ELSIF (sym = 22) THEN
  1921. Get;
  1922. Expr(t, qv);
  1923. SymTab.SetSymType(n, t);
  1924. cls := SymTab.ClassOf(t);
  1925. IF cls = SymTab.ClStr THEN
  1926. SemError(230)
  1927. ELSIF ~QbeGen.IsImm(qv) THEN
  1928. SemError(230) END;
  1929. QbeGen.DeclConst(n, qv, t);;
  1930. ELSE SynError(101);
  1931. END;
  1932. END ConstDecl;
  1933. PROCEDURE VarBlock;
  1934. BEGIN
  1935. Expect(38);
  1936. WHILE (sym = 1) DO
  1937. VarDecl;
  1938. Expect(8);
  1939. END;
  1940. END VarBlock;
  1941. PROCEDURE TypeBlock (isDef: BOOLEAN);
  1942. BEGIN
  1943. Expect(21);
  1944. WHILE (sym = 1) OR (sym = 39) DO
  1945. IF (sym = 1) THEN
  1946. TypeItem(isDef);
  1947. Expect(8);
  1948. ELSE
  1949. ClassItem;
  1950. Expect(8);
  1951. END;
  1952. END;
  1953. END TypeBlock;
  1954. PROCEDURE ConstBlock;
  1955. BEGIN
  1956. Expect(41);
  1957. WHILE (sym = 1) DO
  1958. ConstDecl;
  1959. Expect(8);
  1960. END;
  1961. END ConstBlock;
  1962. PROCEDURE Import;
  1963. VAR n: SymTab.Name;
  1964. BEGIN
  1965. IF (sym = 19) THEN
  1966. Get;
  1967. GetIdent(n);
  1968. IF ~SymTab.Enter(n,
  1969. SymTab.KindImport) THEN
  1970. SemError(200) END;;
  1971. Expect(20);
  1972. ImpList;
  1973. Expect(8);
  1974. ELSIF (sym = 20) THEN
  1975. Get;
  1976. ImpList;
  1977. Expect(8);
  1978. ELSE SynError(102);
  1979. END;
  1980. END Import;
  1981. PROCEDURE GetIdent (VAR n: SymTab.Name);
  1982. BEGIN
  1983. Expect(1);
  1984. LexName(n);;
  1985. END GetIdent;
  1986. PROCEDURE ProgModule;
  1987. VAR m1, m2: SymTab.Name;
  1988. BEGIN
  1989. Expect(7);
  1990. GetIdent(m1);
  1991. SymTab.Init; QbeGen.OpenModule(m1);
  1992. IF ~SymTab.Enter(m1,
  1993. SymTab.KindModule) THEN
  1994. SemError(200) END;;
  1995. IF (sym = 15) THEN
  1996. Priority;
  1997. END;
  1998. Expect(8);
  1999. WHILE (sym = 19) OR (sym = 20) DO
  2000. Import;
  2001. END;
  2002. DeclSeq;
  2003. IF (sym = 11) THEN
  2004. Get;
  2005. QbeGen.BeginBody;;
  2006. IF In(symSet[3], sym) THEN
  2007. StatSeq;
  2008. END;
  2009. END;
  2010. Expect(9);
  2011. GetIdent(m2);
  2012. IF ~SymTab.Equal(m1, m2) THEN
  2013. SemError(202) END;;
  2014. QbeGen.EndModule(m1);
  2015. SymTab.PrintTable;;
  2016. END ProgModule;
  2017. PROCEDURE ImplUnit;
  2018. VAR m1, m2: SymTab.Name;
  2019. BEGIN
  2020. Expect(10);
  2021. Expect(7);
  2022. GetIdent(m1);
  2023. SymTab.Init; QbeGen.OpenModule(m1);
  2024. IF ~SymTab.Enter(m1,
  2025. SymTab.KindModule) THEN
  2026. SemError(200) END;;
  2027. Expect(8);
  2028. WHILE (sym = 19) OR (sym = 20) DO
  2029. Import;
  2030. END;
  2031. DeclSeq;
  2032. IF (sym = 11) THEN
  2033. Get;
  2034. QbeGen.BeginBody;;
  2035. IF In(symSet[3], sym) THEN
  2036. StatSeq;
  2037. END;
  2038. END;
  2039. Expect(9);
  2040. GetIdent(m2);
  2041. IF ~SymTab.Equal(m1, m2) THEN
  2042. SemError(202) END;;
  2043. QbeGen.CloseModule;
  2044. SemError(230);
  2045. SymTab.PrintTable;;
  2046. END ImplUnit;
  2047. PROCEDURE DefUnit;
  2048. VAR m1, m2, pn: SymTab.Name;
  2049. BEGIN
  2050. Expect(6);
  2051. Expect(7);
  2052. GetIdent(m1);
  2053. SymTab.Init; QbeGen.OpenModule(m1);
  2054. IF ~SymTab.Enter(m1,
  2055. SymTab.KindModule) THEN
  2056. SemError(200) END;;
  2057. Expect(8);
  2058. WHILE (sym = 19) OR (sym = 20) DO
  2059. Import;
  2060. END;
  2061. WHILE In(symSet[11], sym) DO
  2062. CASE sym OF
  2063. 41 :
  2064. ConstBlock;
  2065. | 21 :
  2066. TypeBlock(TRUE);
  2067. | 38 :
  2068. VarBlock;
  2069. | 1 :
  2070. ConstDecl;
  2071. Expect(8);
  2072. (* manifest const, no CONST *);
  2073. | 37 :
  2074. ProcHeading(pn);
  2075. Expect(8);
  2076. SymTab.CloseProc;;
  2077. | 39 :
  2078. ClassItem;
  2079. Expect(8);
  2080. END;
  2081. END;
  2082. Expect(9);
  2083. GetIdent(m2);
  2084. IF ~SymTab.Equal(m1, m2) THEN
  2085. SemError(202) END;;
  2086. QbeGen.CloseModule;
  2087. SemError(230);
  2088. SymTab.PrintTable;;
  2089. END DefUnit;
  2090. PROCEDURE Unit;
  2091. BEGIN
  2092. IF (sym = 6) THEN
  2093. DefUnit;
  2094. ELSIF (sym = 10) THEN
  2095. ImplUnit;
  2096. ELSIF (sym = 7) THEN
  2097. ProgModule;
  2098. ELSE SynError(103);
  2099. END;
  2100. END Unit;
  2101. PROCEDURE M2;
  2102. BEGIN
  2103. Unit;
  2104. Expect(5);
  2105. END M2;
  2106. PROCEDURE Parse;
  2107. BEGIN
  2108. M2S.Reset; Get;
  2109. M2;
  2110. END Parse;
  2111. BEGIN
  2112. errDist := minErrDist;
  2113. symSet[ 0, 0] := BITSET{0};
  2114. symSet[ 0, 1] := BITSET{};
  2115. symSet[ 0, 2] := BITSET{};
  2116. symSet[ 0, 3] := BITSET{};
  2117. symSet[ 0, 4] := BITSET{};
  2118. symSet[ 0, 5] := BITSET{};
  2119. symSet[ 1, 0] := BITSET{1, 2, 3, 4, 15};
  2120. symSet[ 1, 1] := BITSET{10};
  2121. symSet[ 1, 2] := BITSET{};
  2122. symSet[ 1, 3] := BITSET{};
  2123. symSet[ 1, 4] := BITSET{3, 4, 14};
  2124. symSet[ 1, 5] := BITSET{0, 1};
  2125. symSet[ 2, 0] := BITSET{};
  2126. symSet[ 2, 1] := BITSET{};
  2127. symSet[ 2, 2] := BITSET{};
  2128. symSet[ 2, 3] := BITSET{};
  2129. symSet[ 2, 4] := BITSET{6, 7, 8, 9, 10, 11, 12, 13};
  2130. symSet[ 2, 5] := BITSET{};
  2131. symSet[ 3, 0] := BITSET{1};
  2132. symSet[ 3, 1] := BITSET{15};
  2133. symSet[ 3, 2] := BITSET{12, 13, 15};
  2134. symSet[ 3, 3] := BITSET{2, 4, 6, 7, 9, 10};
  2135. symSet[ 3, 4] := BITSET{};
  2136. symSet[ 3, 5] := BITSET{};
  2137. symSet[ 4, 0] := BITSET{1, 2, 3, 4, 8, 9, 15};
  2138. symSet[ 4, 1] := BITSET{10};
  2139. symSet[ 4, 2] := BITSET{1, 2};
  2140. symSet[ 4, 3] := BITSET{1, 5};
  2141. symSet[ 4, 4] := BITSET{3, 4, 14};
  2142. symSet[ 4, 5] := BITSET{0, 1};
  2143. symSet[ 5, 0] := BITSET{1, 7, 9, 11, 12, 13};
  2144. symSet[ 5, 1] := BITSET{5};
  2145. symSet[ 5, 2] := BITSET{5, 6, 7, 9};
  2146. symSet[ 5, 3] := BITSET{};
  2147. symSet[ 5, 4] := BITSET{};
  2148. symSet[ 5, 5] := BITSET{};
  2149. symSet[ 6, 0] := BITSET{1, 15};
  2150. symSet[ 6, 1] := BITSET{7, 8, 10, 12, 14};
  2151. symSet[ 6, 2] := BITSET{3, 5};
  2152. symSet[ 6, 3] := BITSET{};
  2153. symSet[ 6, 4] := BITSET{};
  2154. symSet[ 6, 5] := BITSET{};
  2155. symSet[ 7, 0] := BITSET{};
  2156. symSet[ 7, 1] := BITSET{6};
  2157. symSet[ 7, 2] := BITSET{11};
  2158. symSet[ 7, 3] := BITSET{12, 13, 14, 15};
  2159. symSet[ 7, 4] := BITSET{0, 1, 2};
  2160. symSet[ 7, 5] := BITSET{};
  2161. symSet[ 8, 0] := BITSET{};
  2162. symSet[ 8, 1] := BITSET{6};
  2163. symSet[ 8, 2] := BITSET{};
  2164. symSet[ 8, 3] := BITSET{13, 14, 15};
  2165. symSet[ 8, 4] := BITSET{0, 1, 2};
  2166. symSet[ 8, 5] := BITSET{};
  2167. symSet[ 9, 0] := BITSET{1, 15};
  2168. symSet[ 9, 1] := BITSET{7, 8, 10, 12, 14};
  2169. symSet[ 9, 2] := BITSET{3, 5, 6};
  2170. symSet[ 9, 3] := BITSET{};
  2171. symSet[ 9, 4] := BITSET{};
  2172. symSet[ 9, 5] := BITSET{};
  2173. symSet[10, 0] := BITSET{1, 7, 12, 13};
  2174. symSet[10, 1] := BITSET{5};
  2175. symSet[10, 2] := BITSET{5, 6, 7, 9};
  2176. symSet[10, 3] := BITSET{};
  2177. symSet[10, 4] := BITSET{};
  2178. symSet[10, 5] := BITSET{};
  2179. symSet[11, 0] := BITSET{1};
  2180. symSet[11, 1] := BITSET{5};
  2181. symSet[11, 2] := BITSET{5, 6, 7, 9};
  2182. symSet[11, 3] := BITSET{};
  2183. symSet[11, 4] := BITSET{};
  2184. symSet[11, 5] := BITSET{};
  2185. END M2P.