M2cP.mod 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838
  1. IMPLEMENTATION MODULE M2cP;
  2. (* Parser generated by Coco/R - assuming ISO IO library will be available. *)
  3. IMPORT M2cS, FileIO;
  4. IMPORT SymTab, MGen;
  5. CONST
  6. maxT = 69;
  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 .. 6] 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. M2cS.Error(errNo, M2cS.line, M2cS.col, M2cS.pos);
  19. END;
  20. errDist := 0;
  21. END SemError;
  22. PROCEDURE SynError (errNo: INTEGER);
  23. BEGIN
  24. IF errDist >= minErrDist THEN
  25. M2cS.Error(errNo, M2cS.nextLine, M2cS.nextCol, M2cS.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. M2cS.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 ~ 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 ~ 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. M2cS.GetName(M2cS.pos, M2cS.len, Lex)
  76. END LexName;
  77. PROCEDURE LexString (VAR Lex: ARRAY OF CHAR);
  78. BEGIN
  79. M2cS.GetString(M2cS.pos, M2cS.len, Lex)
  80. END LexString;
  81. PROCEDURE LookAheadName (VAR Lex: ARRAY OF CHAR);
  82. BEGIN
  83. M2cS.GetName(M2cS.nextPos, M2cS.nextLen, Lex)
  84. END LookAheadName;
  85. PROCEDURE LookAheadString (VAR Lex: ARRAY OF CHAR);
  86. BEGIN
  87. M2cS.GetString(M2cS.nextPos, M2cS.nextLen, Lex)
  88. END LookAheadString;
  89. PROCEDURE Successful (): BOOLEAN;
  90. BEGIN
  91. RETURN M2cS.errors = 0
  92. END Successful;
  93. (* ----- FORWARD not needed in multipass compilers
  94. PROCEDURE Elem (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  95. VAR lx2: MGen.LitStr; VAR hasR: BOOLEAN); FORWARD;
  96. PROCEDURE SetLit (VAR t: SymTab.TypeIndex); FORWARD;
  97. PROCEDURE MulOp (VAR op: INTEGER); FORWARD;
  98. PROCEDURE Fact (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  99. VAR v: BOOLEAN; VAR vn: SymTab.Name); FORWARD;
  100. PROCEDURE AddOp (VAR op: INTEGER); FORWARD;
  101. PROCEDURE Term (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  102. VAR v: BOOLEAN; VAR vn: SymTab.Name); FORWARD;
  103. PROCEDURE Rel (VAR op: INTEGER); FORWARD;
  104. PROCEDURE SimExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  105. VAR v: BOOLEAN; VAR vn: SymTab.Name); FORWARD;
  106. PROCEDURE Design (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  107. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr); FORWARD;
  108. PROCEDURE ByLit (VAR v: INTEGER); FORWARD;
  109. PROCEDURE Labels (sel: SymTab.TypeIndex; tmp: INTEGER; bodyL: INTEGER); FORWARD;
  110. PROCEDURE LabelList (sel: SymTab.TypeIndex; tmp: INTEGER;
  111. VAR lB: INTEGER; VAR lN: INTEGER); FORWARD;
  112. PROCEDURE Case (sel: SymTab.TypeIndex; tmp: INTEGER; endL: INTEGER); FORWARD;
  113. PROCEDURE CallTail (pn: SymTab.Name; sfx: BOOLEAN; inExpr: BOOLEAN;
  114. VAR ok: BOOLEAN; hasDead: BOOLEAN); FORWARD;
  115. PROCEDURE DesignTail (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  116. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr;
  117. VAR sfx: BOOLEAN); FORWARD;
  118. PROCEDURE DesignHead (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  119. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr); FORWARD;
  120. PROCEDURE ReturnStat; FORWARD;
  121. PROCEDURE WithStat; FORWARD;
  122. PROCEDURE ForStat; FORWARD;
  123. PROCEDURE LoopStat; FORWARD;
  124. PROCEDURE RepeatStat; FORWARD;
  125. PROCEDURE WhileStat; FORWARD;
  126. PROCEDURE CaseStat; FORWARD;
  127. PROCEDURE IfStat; FORWARD;
  128. PROCEDURE AssignOrCall; FORWARD;
  129. PROCEDURE Stat; FORWARD;
  130. PROCEDURE FieldIdents (rt: SymTab.TypeIndex); FORWARD;
  131. PROCEDURE Field (rt: SymTab.TypeIndex); FORWARD;
  132. PROCEDURE FieldSeq (rt: SymTab.TypeIndex); FORWARD;
  133. PROCEDURE Enum (VAR t: SymTab.TypeIndex); FORWARD;
  134. PROCEDURE PointerType (VAR t: SymTab.TypeIndex); FORWARD;
  135. PROCEDURE SetType (VAR t: SymTab.TypeIndex); FORWARD;
  136. PROCEDURE RecordType (VAR t: SymTab.TypeIndex); FORWARD;
  137. PROCEDURE ArrayType (VAR t: SymTab.TypeIndex); FORWARD;
  138. PROCEDURE SimpleType (VAR t: SymTab.TypeIndex); FORWARD;
  139. PROCEDURE FPSection; FORWARD;
  140. PROCEDURE QualIdent (VAR t: SymTab.TypeIndex); FORWARD;
  141. PROCEDURE FormalParams; FORWARD;
  142. PROCEDURE VarIdents; FORWARD;
  143. PROCEDURE Type (VAR t: SymTab.TypeIndex); FORWARD;
  144. PROCEDURE Expr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  145. VAR v: BOOLEAN; VAR vn: SymTab.Name); FORWARD;
  146. PROCEDURE ConstExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr); FORWARD;
  147. PROCEDURE ProcedureDecl; FORWARD;
  148. PROCEDURE VarDecl; FORWARD;
  149. PROCEDURE TypeDecl; FORWARD;
  150. PROCEDURE ConstDecl; FORWARD;
  151. PROCEDURE StatSeq; FORWARD;
  152. PROCEDURE Declaration; FORWARD;
  153. PROCEDURE ImportList; FORWARD;
  154. PROCEDURE Block (isProc: BOOLEAN); FORWARD;
  155. PROCEDURE Import; FORWARD;
  156. PROCEDURE GetIdent (VAR n: SymTab.Name); FORWARD;
  157. PROCEDURE M2c; FORWARD;
  158. ----- *)
  159. PROCEDURE Elem (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  160. VAR lx2: MGen.LitStr; VAR hasR: BOOLEAN);
  161. VAR t2: SymTab.TypeIndex;
  162. vD, vD2: BOOLEAN;
  163. vnD, vnD2: SymTab.Name;
  164. BEGIN
  165. Expr(t, lx, vD, vnD);
  166. hasR := FALSE;
  167. lx2[0] := 0C;;
  168. IF (sym = 23) THEN
  169. Get;
  170. Expr(t2, lx2, vD2, vnD2);
  171. IF ~SymTab.SetElemCheck(t, t2) THEN
  172. SemError(222) END;
  173. hasR := TRUE;;
  174. END;
  175. END Elem;
  176. PROCEDURE SetLit (VAR t: SymTab.TypeIndex);
  177. VAR first, et: SymTab.TypeIndex;
  178. lxE, lxE2: MGen.LitStr;
  179. vE, vE2: BOOLEAN;
  180. vnE, vnE2: SymTab.Name;
  181. hasR: BOOLEAN;
  182. BEGIN
  183. Expect(67);
  184. MGen.PushInt(0);
  185. t := SymTab.SetFor(SymTab.IntType());;
  186. IF In(symSet[1], sym) THEN
  187. Elem(et, lxE, lxE2, hasR);
  188. first := et;
  189. t := SymTab.SetFor(et);
  190. IF hasR THEN MGen.FieldMask
  191. ELSE MGen.Power2 END;
  192. MGen.Or;;
  193. WHILE (sym = 10) DO
  194. Get;
  195. Elem(et, lxE, lxE2, hasR);
  196. IF ~SymTab.SetElemCheck(first, et) THEN
  197. SemError(222) END;
  198. IF hasR THEN MGen.FieldMask
  199. ELSE MGen.Power2 END;
  200. MGen.Or;;
  201. END;
  202. END;
  203. Expect(68);
  204. END SetLit;
  205. PROCEDURE MulOp (VAR op: INTEGER);
  206. BEGIN
  207. CASE sym OF
  208. 59 :
  209. Get;
  210. op := SymTab.OpTimes;;
  211. | 60 :
  212. Get;
  213. op := SymTab.OpSlash;;
  214. | 61 :
  215. Get;
  216. op := SymTab.OpDiv;;
  217. | 62 :
  218. Get;
  219. op := SymTab.OpMod;;
  220. | 63 :
  221. Get;
  222. op := SymTab.OpAnd;;
  223. | 64 :
  224. Get;
  225. op := SymTab.OpAnd;;
  226. ELSE SynError(70);
  227. END;
  228. END MulOp;
  229. PROCEDURE Fact (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  230. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  231. VAR s: ARRAY [0 .. 255] OF CHAR;
  232. t2, et, dt, st: SymTab.TypeIndex;
  233. dk: INTEGER;
  234. bnF: SymTab.Name;
  235. lxD, lx2: MGen.LitStr;
  236. v2: BOOLEAN;
  237. vn2: SymTab.Name;
  238. vi: INTEGER;
  239. c: CARDINAL;
  240. b: LONGCARD;
  241. sfxF: BOOLEAN;
  242. okF: BOOLEAN;
  243. BEGIN
  244. CASE sym OF
  245. 2 :
  246. Get;
  247. LexString(s);
  248. MGen.CopyName(s, lx);
  249. v := FALSE;
  250. IF MGen.ParseInt(s, vi) THEN
  251. MGen.PushInt(vi)
  252. ELSIF MGen.ParseCard(s, c) THEN
  253. MGen.PushBits(
  254. VAL(LONGCARD, c))
  255. ELSE MGen.PushInt(0)
  256. END;
  257. t := SymTab.IntType();;
  258. | 3 :
  259. Get;
  260. LexString(s);
  261. MGen.CopyName(s, lx);
  262. v := FALSE;
  263. IF MGen.ParseReal(s, b) THEN
  264. MGen.PushBits(b)
  265. ELSE MGen.PushBits(0H)
  266. END;
  267. t := SymTab.RealType();;
  268. | 4 :
  269. Get;
  270. LexString(s);
  271. v := FALSE;
  272. IF SymTab.StrLen(s) <= 3 THEN
  273. t := SymTab.CharType();
  274. MGen.CopyName(s, lx);
  275. MGen.PushInt(
  276. MGen.CharOrd(s))
  277. ELSE t := SymTab.NewStr();
  278. SemError(230);
  279. lx[0] := 0C;
  280. MGen.PushInt(0)
  281. END;;
  282. | 1 :
  283. DesignHead(dt, dk, bnF, TRUE, lxD);
  284. DesignTail(dt, dk, bnF, TRUE, lxD, sfxF);
  285. t := dt;
  286. MGen.CopyName(lxD, lx);
  287. v := ~sfxF
  288. & ((dk = SymTab.KindVar)
  289. OR (dk = SymTab.KindParam)
  290. OR (dk
  291. = SymTab.KindVarPar));
  292. MGen.CopyName(bnF, vn);;
  293. IF (sym = 19) THEN
  294. CallTail(bnF, sfxF, TRUE, okF, TRUE);
  295. IF okF THEN
  296. IF SymTab.SymKind(bnF)
  297. = SymTab.KindProc THEN
  298. t := SymTab.ProcRet(bnF)
  299. ELSE
  300. t := SymTab.InvalidType
  301. END
  302. ELSE t := SymTab.InvalidType
  303. END;
  304. lx[0] := 0C; v := FALSE;;
  305. END;
  306. | 19 :
  307. Get;
  308. Expr(et, lx, v, vn);
  309. Expect(20);
  310. t := et;;
  311. | 65, 66 :
  312. IF (sym = 65) THEN
  313. Get;
  314. ELSE
  315. Get;
  316. END;
  317. Fact(t2, lx2, v2, vn2);
  318. lx[0] := 0C; v := FALSE;
  319. IF SymTab.BoolCheck(t2) THEN
  320. t := SymTab.BoolType()
  321. ELSE SemError(212);
  322. t := SymTab.InvalidType END;
  323. MGen.Not;;
  324. | 67 :
  325. SetLit(st);
  326. lx[0] := 0C; v := FALSE;
  327. t := st;;
  328. ELSE SynError(71);
  329. END;
  330. END Fact;
  331. PROCEDURE AddOp (VAR op: INTEGER);
  332. BEGIN
  333. IF (sym = 57) THEN
  334. Get;
  335. op := SymTab.OpAdd;;
  336. ELSIF (sym = 46) THEN
  337. Get;
  338. op := SymTab.OpSub;;
  339. ELSIF (sym = 58) THEN
  340. Get;
  341. op := SymTab.OpOr;;
  342. ELSE SynError(72);
  343. END;
  344. END AddOp;
  345. PROCEDURE Term (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  346. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  347. VAR t2, res2: SymTab.TypeIndex;
  348. op: INTEGER;
  349. lx2: MGen.LitStr;
  350. v2: BOOLEAN;
  351. vn2: SymTab.Name;
  352. isR: BOOLEAN;
  353. mt: INTEGER;
  354. BEGIN
  355. Fact(t, lx, v, vn);
  356. WHILE In(symSet[2], sym) DO
  357. MulOp(op);
  358. Fact(t2, lx2, v2, vn2);
  359. lx[0] := 0C; v := FALSE;
  360. IF op = SymTab.OpAnd THEN
  361. IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
  362. t := SymTab.BoolType()
  363. ELSE SemError(212); t := SymTab.InvalidType END;
  364. MGen.And
  365. ELSE
  366. IF SymTab.ArithCheck(t, t2,
  367. (op = SymTab.OpDiv) OR (op = SymTab.OpMod),
  368. res2) THEN t := res2
  369. ELSE SemError(211); t := SymTab.InvalidType END;
  370. isR := (t # SymTab.InvalidType)
  371. & (SymTab.ClassOf(t) = SymTab.ClReal);
  372. IF op = SymTab.OpTimes THEN
  373. IF isR THEN MGen.RealMul ELSE MGen.MulU END
  374. ELSIF op = SymTab.OpSlash THEN
  375. IF isR THEN MGen.RealDiv ELSE MGen.DivI END
  376. ELSIF op = SymTab.OpDiv THEN
  377. MGen.DivI
  378. ELSE
  379. mt := MGen.TempGlobal();
  380. MGen.ModI(mt)
  381. END
  382. END;;
  383. END;
  384. END Term;
  385. PROCEDURE Rel (VAR op: INTEGER);
  386. BEGIN
  387. CASE sym OF
  388. 16 :
  389. Get;
  390. op := SymTab.OpEq;;
  391. | 50 :
  392. Get;
  393. op := SymTab.OpNeq1;;
  394. | 51 :
  395. Get;
  396. op := SymTab.OpNeq2;;
  397. | 52 :
  398. Get;
  399. op := SymTab.OpLt;;
  400. | 53 :
  401. Get;
  402. op := SymTab.OpLe;;
  403. | 54 :
  404. Get;
  405. op := SymTab.OpGt;;
  406. | 55 :
  407. Get;
  408. op := SymTab.OpGe;;
  409. | 56 :
  410. Get;
  411. op := SymTab.OpIn;;
  412. ELSE SynError(73);
  413. END;
  414. END Rel;
  415. PROCEDURE SimExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  416. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  417. VAR t2, res2: SymTab.TypeIndex;
  418. op: INTEGER;
  419. lx2: MGen.LitStr;
  420. v2: BOOLEAN;
  421. vn2: SymTab.Name;
  422. neg, isR: BOOLEAN;
  423. BEGIN
  424. neg := FALSE;;
  425. IF (sym = 46) OR (sym = 57) THEN
  426. IF (sym = 57) THEN
  427. Get;
  428. ELSE
  429. Get;
  430. neg := TRUE;;
  431. END;
  432. END;
  433. Term(t, lx, v, vn);
  434. IF neg THEN
  435. v := FALSE;
  436. IF MGen.IsLit(lx) THEN
  437. MGen.NegFold(lx, lx)
  438. ELSE lx[0] := 0C
  439. END;
  440. IF SymTab.ClassOf(t)
  441. = SymTab.ClReal THEN
  442. MGen.NegReal
  443. ELSE MGen.NegInt
  444. END
  445. END;;
  446. WHILE (sym = 46) OR (sym = 57) OR (sym = 58) DO
  447. AddOp(op);
  448. Term(t2, lx2, v2, vn2);
  449. lx[0] := 0C; v := FALSE;
  450. IF op = SymTab.OpOr THEN
  451. IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
  452. t := SymTab.BoolType()
  453. ELSE SemError(212); t := SymTab.InvalidType END;
  454. MGen.Or
  455. ELSE
  456. IF SymTab.ArithCheck(t, t2, FALSE, res2) THEN t := res2
  457. ELSE SemError(211); t := SymTab.InvalidType END;
  458. isR := (t # SymTab.InvalidType)
  459. & (SymTab.ClassOf(t) = SymTab.ClReal);
  460. IF op = SymTab.OpAdd THEN
  461. IF isR THEN MGen.RealAdd ELSE MGen.Add END
  462. ELSE
  463. IF isR THEN MGen.RealSub ELSE MGen.Sub END
  464. END
  465. END;;
  466. END;
  467. END SimExpr;
  468. PROCEDURE Design (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  469. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr);
  470. VAR sfxD: BOOLEAN;
  471. BEGIN
  472. DesignHead(t, k, bn, doLoad, lx);
  473. DesignTail(t, k, bn, doLoad, lx, sfxD);
  474. END Design;
  475. PROCEDURE ByLit (VAR v: INTEGER);
  476. VAR s: ARRAY [0 .. 255] OF CHAR;
  477. BEGIN
  478. IF (sym = 2) THEN
  479. Get;
  480. LexString(s);
  481. IF ~MGen.ParseInt(s, v) THEN
  482. v := 1
  483. END;;
  484. ELSIF (sym = 46) THEN
  485. Get;
  486. Expect(2);
  487. LexString(s);
  488. IF MGen.ParseInt(s, v) THEN
  489. v := -v
  490. ELSE v := -1
  491. END;;
  492. ELSE SynError(74);
  493. END;
  494. END ByLit;
  495. PROCEDURE Labels (sel: SymTab.TypeIndex; tmp: INTEGER; bodyL: INTEGER);
  496. VAR t, t2: SymTab.TypeIndex;
  497. lx1, lx2: MGen.LitStr;
  498. v1, v2: BOOLEAN;
  499. vn1, vn2: SymTab.Name;
  500. ta, tb, chunk: INTEGER;
  501. r, hasRange: BOOLEAN;
  502. BEGIN
  503. ConstExpr(t, lx1);
  504. IF ~SymTab.EqCheck(t, sel) THEN
  505. SemError(213) END;
  506. r := (SymTab.ClassOf(sel)
  507. = SymTab.ClReal)
  508. & (SymTab.ClassOf(t)
  509. = SymTab.ClReal);
  510. ta := MGen.TempGlobal();
  511. MGen.StoreTemp(ta);
  512. hasRange := FALSE;;
  513. IF (sym = 23) THEN
  514. Get;
  515. ConstExpr(t2, lx2);
  516. IF ~SymTab.EqCheck(t2, sel) THEN
  517. SemError(213) END;
  518. tb := MGen.TempGlobal();
  519. MGen.StoreTemp(tb);
  520. hasRange := TRUE;;
  521. END;
  522. IF hasRange THEN
  523. MGen.LoadTemp(tmp);
  524. MGen.LoadTemp(ta);
  525. IF r THEN MGen.RealGe
  526. ELSE MGen.IGe END;
  527. MGen.LoadTemp(tmp);
  528. MGen.LoadTemp(tb);
  529. IF r THEN MGen.RealLe
  530. ELSE MGen.ILe END;
  531. MGen.And
  532. ELSE
  533. MGen.LoadTemp(tmp);
  534. MGen.LoadTemp(ta);
  535. IF r THEN MGen.RealEq
  536. ELSE MGen.Eq END
  537. END;
  538. chunk := MGen.NewLabel();
  539. MGen.Jz(chunk);
  540. MGen.Jmp(bodyL);
  541. MGen.DefLabel(chunk);;
  542. END Labels;
  543. PROCEDURE LabelList (sel: SymTab.TypeIndex; tmp: INTEGER;
  544. VAR lB: INTEGER; VAR lN: INTEGER);
  545. BEGIN
  546. lB := MGen.NewLabel();
  547. lN := MGen.NewLabel();;
  548. Labels(sel, tmp, lB);
  549. WHILE (sym = 10) DO
  550. Get;
  551. Labels(sel, tmp, lB);
  552. END;
  553. MGen.Jmp(lN);;
  554. END LabelList;
  555. PROCEDURE Case (sel: SymTab.TypeIndex; tmp: INTEGER; endL: INTEGER);
  556. VAR lB, lN: INTEGER;
  557. BEGIN
  558. IF In(symSet[1], sym) THEN
  559. LabelList(sel, tmp, lB, lN);
  560. Expect(17);
  561. MGen.DefLabel(lB);;
  562. StatSeq;
  563. MGen.Jmp(endL);
  564. MGen.DefLabel(lN);;
  565. END;
  566. END Case;
  567. PROCEDURE CallTail (pn: SymTab.Name; sfx: BOOLEAN; inExpr: BOOLEAN;
  568. VAR ok: BOOLEAN; hasDead: BOOLEAN);
  569. VAR t: SymTab.TypeIndex;
  570. lx: MGen.LitStr;
  571. v: BOOLEAN;
  572. vn: SymTab.Name;
  573. BEGIN
  574. Expect(19);
  575. ok := FALSE;
  576. IF hasDead THEN MGen.Drop END;
  577. MGen.ActBegin(pn);;
  578. IF In(symSet[1], sym) THEN
  579. Expr(t, lx, v, vn);
  580. IF MGen.ActValue(t, v, vn) # 0 THEN
  581. SemError(233)
  582. END;;
  583. WHILE (sym = 10) DO
  584. Get;
  585. Expr(t, lx, v, vn);
  586. IF MGen.ActValue(t, v, vn) # 0 THEN
  587. SemError(233)
  588. END;;
  589. END;
  590. END;
  591. Expect(20);
  592. IF MGen.ActEnd(pn, sfx, inExpr) # 0
  593. THEN SemError(233)
  594. ELSE ok := TRUE
  595. END;;
  596. END CallTail;
  597. PROCEDURE DesignTail (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  598. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr;
  599. VAR sfx: BOOLEAN);
  600. VAR m: SymTab.Name;
  601. it: SymTab.TypeIndex;
  602. lxI: MGen.LitStr;
  603. vI: BOOLEAN;
  604. vnI: SymTab.Name;
  605. BEGIN
  606. sfx := FALSE;;
  607. WHILE (sym = 7) OR (sym = 22) OR (sym = 49) DO
  608. IF (sym = 7) THEN
  609. Get;
  610. sfx := TRUE; lx[0] := 0C;;
  611. GetIdent(m);
  612. IF t = SymTab.InvalidType THEN
  613. ELSIF SymTab.ClassOf(t) #
  614. SymTab.ClRecord THEN
  615. SemError(215);
  616. t := SymTab.InvalidType
  617. ELSIF ~SymTab.FieldExists(t, m) THEN
  618. SemError(216);
  619. t := SymTab.InvalidType
  620. ELSE t := SymTab.FieldType(t, m);
  621. SemError(230)
  622. END;
  623. IF doLoad THEN
  624. MGen.Drop; MGen.PushInt(0)
  625. END;;
  626. ELSIF (sym = 22) THEN
  627. Get;
  628. sfx := TRUE; lx[0] := 0C;;
  629. Expr(it, lxI, vI, vnI);
  630. MGen.Drop;
  631. IF t = SymTab.InvalidType THEN
  632. ELSIF SymTab.ClassOf(t) #
  633. SymTab.ClArray THEN
  634. SemError(217);
  635. t := SymTab.InvalidType
  636. ELSIF (it #
  637. SymTab.InvalidType)
  638. & ~SymTab.IsIntFamily(it) THEN
  639. SemError(218);
  640. t := SymTab.InvalidType
  641. ELSE t :=
  642. SymTab.ArrayElem(t);
  643. SemError(230)
  644. END;
  645. IF doLoad THEN
  646. MGen.Drop; MGen.PushInt(0)
  647. END;;
  648. WHILE (sym = 10) DO
  649. Get;
  650. Expr(it, lxI, vI, vnI);
  651. MGen.Drop;
  652. IF (it # SymTab.InvalidType)
  653. & ~SymTab.IsIntFamily(it) THEN
  654. SemError(218) END;;
  655. END;
  656. Expect(24);
  657. ELSE
  658. Get;
  659. sfx := TRUE; lx[0] := 0C;;
  660. IF t = SymTab.InvalidType THEN
  661. ELSIF SymTab.ClassOf(t) #
  662. SymTab.ClPtr THEN
  663. SemError(219);
  664. t := SymTab.InvalidType
  665. ELSE t := SymTab.PtrBase(t);
  666. SemError(230)
  667. END;
  668. IF doLoad THEN
  669. MGen.Drop; MGen.PushInt(0)
  670. END;;
  671. END;
  672. END;
  673. END DesignTail;
  674. PROCEDURE DesignHead (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  675. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr);
  676. VAR n: SymTab.Name;
  677. cls: INTEGER;
  678. BEGIN
  679. GetIdent(n);
  680. MGen.CopyName(n, bn);
  681. lx[0] := 0C;
  682. IF ~SymTab.Lookup(n) THEN
  683. SemError(201);
  684. t := SymTab.InvalidType; k := -1;
  685. IF doLoad THEN
  686. MGen.PushInt(0)
  687. END
  688. ELSE
  689. t := SymTab.SymType(n);
  690. k := SymTab.SymKind(n);
  691. IF k = SymTab.KindConst THEN
  692. IF SymTab.Equal(n, "TRUE") THEN
  693. t := SymTab.BoolType();
  694. MGen.CopyName("TRUE", lx);
  695. IF doLoad THEN
  696. MGen.PushInt(1)
  697. END
  698. ELSIF SymTab.Equal(n,
  699. "FALSE") THEN
  700. t := SymTab.BoolType();
  701. MGen.CopyName("FALSE", lx);
  702. IF doLoad THEN
  703. MGen.PushInt(0)
  704. END
  705. ELSE
  706. cls :=
  707. SymTab.ClassOf(t);
  708. IF (t #
  709. SymTab.InvalidType)
  710. & (cls # SymTab.ClStr)
  711. & ((cls = SymTab.ClInt)
  712. OR (cls = SymTab.ClReal)
  713. OR (cls = SymTab.ClBool)
  714. OR (cls = SymTab.ClChar)
  715. OR (cls
  716. = SymTab.ClEnum)) THEN
  717. IF doLoad THEN
  718. MGen.LoadVar(n)
  719. END
  720. ELSIF doLoad THEN
  721. MGen.PushInt(0)
  722. END
  723. END
  724. ELSIF (k = SymTab.KindVar)
  725. OR (k = SymTab.KindParam)
  726. OR (k
  727. = SymTab.KindVarPar) THEN
  728. cls := SymTab.ClassOf(t);
  729. IF (cls = SymTab.ClInt)
  730. OR (cls = SymTab.ClReal)
  731. OR (cls = SymTab.ClBool)
  732. OR (cls = SymTab.ClChar)
  733. OR (cls
  734. = SymTab.ClEnum)
  735. OR (cls
  736. = SymTab.ClSet) THEN
  737. IF doLoad THEN
  738. MGen.PushVar(n)
  739. END
  740. ELSE SemError(230);
  741. IF doLoad THEN
  742. MGen.PushInt(0)
  743. END
  744. END
  745. ELSE
  746. IF doLoad THEN
  747. MGen.PushInt(0)
  748. END;
  749. IF k = SymTab.KindField THEN
  750. IF ~MGen.NoSup() THEN
  751. SemError(230)
  752. END
  753. ELSIF k
  754. = SymTab.KindImport THEN
  755. SemError(230)
  756. END
  757. END
  758. END;;
  759. END DesignHead;
  760. PROCEDURE ReturnStat;
  761. VAR t: SymTab.TypeIndex;
  762. lx: MGen.LitStr;
  763. v: BOOLEAN;
  764. vn: SymTab.Name;
  765. hasE, doRet, conv: BOOLEAN;
  766. BEGIN
  767. Expect(48);
  768. hasE := FALSE;;
  769. IF In(symSet[1], sym) THEN
  770. Expr(t, lx, v, vn);
  771. hasE := TRUE;
  772. doRet := FALSE;
  773. IF ~SymTab.InProc() THEN
  774. SemError(232)
  775. ELSIF ~SymTab.InFunction() THEN
  776. SemError(232)
  777. ELSIF ~SymTab.Assignable(
  778. t, SymTab.CurRet()) THEN
  779. SemError(232)
  780. ELSE doRet := TRUE
  781. END;
  782. conv := doRet
  783. & SymTab.IsIntFamily(t)
  784. & (SymTab.ClassOf(
  785. SymTab.CurRet())
  786. = SymTab.ClReal);
  787. IF doRet THEN
  788. IF conv THEN
  789. MGen.IntToReal
  790. END;
  791. MGen.Leave(
  792. SymTab.CurNPar(), TRUE)
  793. ELSE MGen.Drop
  794. END;;
  795. END;
  796. IF ~hasE THEN
  797. IF ~SymTab.InProc() THEN
  798. SemError(232)
  799. ELSIF SymTab.InFunction() THEN
  800. SemError(232)
  801. ELSE MGen.Leave(
  802. SymTab.CurNPar(), FALSE)
  803. END
  804. END;;
  805. END ReturnStat;
  806. PROCEDURE WithStat;
  807. VAR dt: SymTab.TypeIndex;
  808. dk: INTEGER;
  809. bnW: SymTab.Name;
  810. lxW: MGen.LitStr;
  811. pushed: BOOLEAN;
  812. BEGIN
  813. Expect(47);
  814. Design(dt, dk, bnW, FALSE, lxW);
  815. pushed := FALSE;
  816. IF dt # SymTab.InvalidType THEN
  817. pushed :=
  818. SymTab.PushRecord(dt);
  819. IF ~pushed THEN
  820. SemError(215)
  821. END
  822. END;
  823. IF pushed THEN
  824. MGen.NoSupEnter;
  825. SemError(230)
  826. END;;
  827. Expect(40);
  828. StatSeq;
  829. Expect(12);
  830. IF pushed THEN
  831. SymTab.PopScope;
  832. MGen.NoSupExit
  833. END;;
  834. END WithStat;
  835. PROCEDURE ForStat;
  836. VAR n, lv: SymTab.Name;
  837. fk: INTEGER;
  838. lo, hi: SymTab.TypeIndex;
  839. lxLo, lxHi: MGen.LitStr;
  840. vLo, vHi: BOOLEAN;
  841. vnLo, vnHi: SymTab.Name;
  842. byV, ht: INTEGER;
  843. lTop, lChk, lEnd: INTEGER;
  844. neg, storable: BOOLEAN;
  845. BEGIN
  846. Expect(44);
  847. GetIdent(n);
  848. IF ~SymTab.Lookup(n) THEN
  849. SemError(201);
  850. fk := -1
  851. ELSIF (SymTab.SymKind(n) #
  852. SymTab.KindVar)
  853. & (SymTab.SymKind(n) #
  854. SymTab.KindParam)
  855. & (SymTab.SymKind(n) #
  856. SymTab.KindVarPar)
  857. & (SymTab.SymKind(n) #
  858. SymTab.KindField) THEN
  859. SemError(220);
  860. fk := -1
  861. ELSIF (SymTab.SymType(n) #
  862. SymTab.InvalidType)
  863. & ~SymTab.IsIntFamily(
  864. SymTab.SymType(n)) THEN
  865. SemError(220);
  866. fk := -1
  867. ELSE
  868. fk := SymTab.SymKind(n)
  869. END;
  870. MGen.CopyName(n, lv);
  871. storable := (fk = SymTab.KindVar)
  872. OR (fk = SymTab.KindParam)
  873. OR (fk = SymTab.KindVarPar);
  874. IF storable THEN
  875. MGen.StoreSetup(lv)
  876. END;;
  877. Expect(32);
  878. Expr(lo, lxLo, vLo, vnLo);
  879. IF (lo # SymTab.InvalidType)
  880. & ~SymTab.IsIntFamily(lo) THEN
  881. SemError(220) END;
  882. IF storable THEN
  883. MGen.StoreFinish(lv)
  884. ELSE MGen.Drop
  885. END;;
  886. Expect(30);
  887. Expr(hi, lxHi, vHi, vnHi);
  888. IF (hi # SymTab.InvalidType)
  889. & ~SymTab.IsIntFamily(hi) THEN
  890. SemError(220) END;
  891. ht := MGen.TempGlobal();
  892. MGen.StoreTemp(ht);
  893. byV := 1; neg := FALSE;;
  894. IF (sym = 45) THEN
  895. Get;
  896. ByLit(byV);
  897. neg := byV < 0;;
  898. END;
  899. Expect(40);
  900. lTop := MGen.NewLabel();
  901. lChk := MGen.NewLabel();
  902. lEnd := MGen.NewLabel();
  903. MGen.Jmp(lChk);
  904. MGen.DefLabel(lTop);;
  905. StatSeq;
  906. Expect(12);
  907. MGen.PushVar(lv);
  908. MGen.PushInt(byV);
  909. MGen.Add;
  910. IF storable THEN
  911. MGen.StoreFinish(lv)
  912. ELSE MGen.Drop
  913. END;
  914. MGen.DefLabel(lChk);
  915. MGen.PushVar(lv);
  916. MGen.LoadTemp(ht);
  917. IF neg THEN MGen.IGe
  918. ELSE MGen.ILe END;
  919. MGen.Jz(lEnd);
  920. MGen.Jmp(lTop);
  921. MGen.DefLabel(lEnd);;
  922. END ForStat;
  923. PROCEDURE LoopStat;
  924. VAR topL, exitL: INTEGER;
  925. BEGIN
  926. Expect(43);
  927. topL := MGen.NewLabel();
  928. exitL := MGen.NewLabel();
  929. MGen.DefLabel(topL);
  930. MGen.PushLoop(exitL);;
  931. StatSeq;
  932. Expect(12);
  933. MGen.Jmp(topL);
  934. MGen.DefLabel(exitL);
  935. MGen.PopLoop;;
  936. END LoopStat;
  937. PROCEDURE RepeatStat;
  938. VAR t: SymTab.TypeIndex;
  939. lxC: MGen.LitStr;
  940. vC: BOOLEAN;
  941. vnC: SymTab.Name;
  942. topL: INTEGER;
  943. BEGIN
  944. Expect(41);
  945. topL := MGen.NewLabel();
  946. MGen.DefLabel(topL);;
  947. StatSeq;
  948. Expect(42);
  949. Expr(t, lxC, vC, vnC);
  950. IF ~SymTab.BoolCheck(t) THEN
  951. SemError(214) END;
  952. MGen.Jz(topL);;
  953. END RepeatStat;
  954. PROCEDURE WhileStat;
  955. VAR t: SymTab.TypeIndex;
  956. lxC: MGen.LitStr;
  957. vC: BOOLEAN;
  958. vnC: SymTab.Name;
  959. topL, endL: INTEGER;
  960. BEGIN
  961. Expect(39);
  962. topL := MGen.NewLabel();
  963. endL := MGen.NewLabel();
  964. MGen.DefLabel(topL);;
  965. Expr(t, lxC, vC, vnC);
  966. IF ~SymTab.BoolCheck(t) THEN
  967. SemError(214) END;
  968. MGen.Jz(endL);;
  969. Expect(40);
  970. StatSeq;
  971. Expect(12);
  972. MGen.Jmp(topL);
  973. MGen.DefLabel(endL);;
  974. END WhileStat;
  975. PROCEDURE CaseStat;
  976. VAR st: SymTab.TypeIndex;
  977. lxS: MGen.LitStr;
  978. vS: BOOLEAN;
  979. vnS: SymTab.Name;
  980. tmp, endL: INTEGER;
  981. BEGIN
  982. Expect(37);
  983. Expr(st, lxS, vS, vnS);
  984. tmp := MGen.TempGlobal();
  985. MGen.StoreTemp(tmp);
  986. endL := MGen.NewLabel();;
  987. Expect(26);
  988. Case(st, tmp, endL);
  989. WHILE (sym = 38) DO
  990. Get;
  991. Case(st, tmp, endL);
  992. END;
  993. IF (sym = 36) THEN
  994. Get;
  995. StatSeq;
  996. END;
  997. Expect(12);
  998. MGen.DefLabel(endL);;
  999. END CaseStat;
  1000. PROCEDURE IfStat;
  1001. VAR t: SymTab.TypeIndex;
  1002. lxC: MGen.LitStr;
  1003. vC: BOOLEAN;
  1004. vnC: SymTab.Name;
  1005. elseL, endL: INTEGER;
  1006. hasElse: BOOLEAN;
  1007. BEGIN
  1008. Expect(33);
  1009. Expr(t, lxC, vC, vnC);
  1010. IF ~SymTab.BoolCheck(t) THEN
  1011. SemError(214) END;
  1012. elseL := MGen.NewLabel();
  1013. endL := MGen.NewLabel();
  1014. MGen.Jz(elseL);
  1015. hasElse := FALSE;;
  1016. Expect(34);
  1017. StatSeq;
  1018. WHILE (sym = 35) DO
  1019. Get;
  1020. MGen.Jmp(endL);
  1021. MGen.DefLabel(elseL);;
  1022. Expr(t, lxC, vC, vnC);
  1023. IF ~SymTab.BoolCheck(t) THEN
  1024. SemError(214) END;
  1025. elseL := MGen.NewLabel();
  1026. MGen.Jz(elseL);;
  1027. Expect(34);
  1028. StatSeq;
  1029. END;
  1030. IF (sym = 36) THEN
  1031. Get;
  1032. MGen.Jmp(endL);
  1033. MGen.DefLabel(elseL);
  1034. hasElse := TRUE;;
  1035. StatSeq;
  1036. END;
  1037. Expect(12);
  1038. IF ~hasElse THEN
  1039. MGen.DefLabel(elseL)
  1040. END;
  1041. MGen.DefLabel(endL);;
  1042. END IfStat;
  1043. PROCEDURE AssignOrCall;
  1044. VAR dt, et: SymTab.TypeIndex;
  1045. dk: INTEGER;
  1046. bn: SymTab.Name;
  1047. lxD, lxe: MGen.LitStr;
  1048. vE: BOOLEAN;
  1049. vnE: SymTab.Name;
  1050. sfx: BOOLEAN;
  1051. okC: BOOLEAN;
  1052. isR, conv,
  1053. storable: BOOLEAN;
  1054. BEGIN
  1055. sfx := FALSE;;
  1056. DesignHead(dt, dk, bn, FALSE, lxD);
  1057. IF (sym = 7) OR (sym = 22) OR (sym = 32) OR (sym = 49) THEN
  1058. DesignTail(dt, dk, bn, FALSE, lxD, sfx);
  1059. Expect(32);
  1060. storable :=
  1061. (dk = SymTab.KindVar)
  1062. OR (dk = SymTab.KindParam)
  1063. OR (dk = SymTab.KindVarPar);
  1064. IF storable THEN
  1065. MGen.StoreSetup(bn)
  1066. END;;
  1067. Expr(et, lxe, vE, vnE);
  1068. IF (dt # SymTab.InvalidType)
  1069. & (dk # SymTab.KindVar)
  1070. & (dk # SymTab.KindParam)
  1071. & (dk # SymTab.KindVarPar)
  1072. & (dk # SymTab.KindField)
  1073. & (dk # SymTab.KindImport) THEN
  1074. SemError(210)
  1075. ELSIF ~SymTab.Assignable(et, dt) THEN
  1076. SemError(210) END;
  1077. IF dk = SymTab.KindImport THEN
  1078. SemError(230)
  1079. END;
  1080. isR := (dt # SymTab.InvalidType)
  1081. & (SymTab.ClassOf(dt)
  1082. = SymTab.ClReal);
  1083. conv := isR
  1084. & SymTab.IsIntFamily(et);
  1085. IF storable THEN
  1086. IF conv THEN
  1087. MGen.IntToReal
  1088. END;
  1089. MGen.StoreFinish(bn)
  1090. ELSE MGen.Drop
  1091. END;;
  1092. ELSIF (sym = 19) THEN
  1093. CallTail(bn, sfx, FALSE, okC, FALSE);
  1094. ELSIF In(symSet[3], sym) THEN
  1095. MGen.ActBegin(bn);
  1096. IF MGen.ActEnd(bn, FALSE, FALSE) # 0 THEN
  1097. SemError(233)
  1098. END;;
  1099. ELSE SynError(75);
  1100. END;
  1101. END AssignOrCall;
  1102. PROCEDURE Stat;
  1103. VAR lx: INTEGER;
  1104. BEGIN
  1105. IF In(symSet[4], sym) THEN
  1106. CASE sym OF
  1107. 1 :
  1108. AssignOrCall;
  1109. | 33 :
  1110. IfStat;
  1111. | 37 :
  1112. CaseStat;
  1113. | 39 :
  1114. WhileStat;
  1115. | 41 :
  1116. RepeatStat;
  1117. | 43 :
  1118. LoopStat;
  1119. | 44 :
  1120. ForStat;
  1121. | 47 :
  1122. WithStat;
  1123. | 48 :
  1124. ReturnStat;
  1125. | 31 :
  1126. Get;
  1127. IF MGen.TopLoop(lx) THEN
  1128. MGen.Jmp(lx)
  1129. ELSE SemError(230) END;;
  1130. END;
  1131. END;
  1132. END Stat;
  1133. PROCEDURE FieldIdents (rt: SymTab.TypeIndex);
  1134. VAR n: SymTab.Name;
  1135. BEGIN
  1136. GetIdent(n);
  1137. IF ~SymTab.FieldPending(rt, n)
  1138. THEN SemError(200) END;
  1139. WHILE (sym = 10) DO
  1140. Get;
  1141. GetIdent(n);
  1142. IF ~SymTab.FieldPending(rt, n)
  1143. THEN SemError(200) END;
  1144. END;
  1145. END FieldIdents;
  1146. PROCEDURE Field (rt: SymTab.TypeIndex);
  1147. VAR et: SymTab.TypeIndex;
  1148. BEGIN
  1149. IF (sym = 1) THEN
  1150. FieldIdents(rt);
  1151. Expect(17);
  1152. Type(et);
  1153. SymTab.FixPendingF(rt, et);;
  1154. END;
  1155. END Field;
  1156. PROCEDURE FieldSeq (rt: SymTab.TypeIndex);
  1157. BEGIN
  1158. Field(rt);
  1159. WHILE (sym = 6) DO
  1160. Get;
  1161. Field(rt);
  1162. END;
  1163. END FieldSeq;
  1164. PROCEDURE Enum (VAR t: SymTab.TypeIndex);
  1165. VAR n: SymTab.Name;
  1166. ord: INTEGER;
  1167. BEGIN
  1168. Expect(19);
  1169. t := SymTab.NewEnum();
  1170. ord := 0;;
  1171. GetIdent(n);
  1172. IF ~SymTab.Enter(n,
  1173. SymTab.KindConst)
  1174. THEN SemError(200) END;
  1175. SymTab.SetSymType(n, t);
  1176. MGen.DeclConstInt(n, ord);
  1177. INC(ord);;
  1178. WHILE (sym = 10) DO
  1179. Get;
  1180. GetIdent(n);
  1181. IF ~SymTab.Enter(n,
  1182. SymTab.KindConst)
  1183. THEN SemError(200) END;
  1184. SymTab.SetSymType(n, t);
  1185. MGen.DeclConstInt(n, ord);
  1186. INC(ord);;
  1187. END;
  1188. Expect(20);
  1189. END Enum;
  1190. PROCEDURE PointerType (VAR t: SymTab.TypeIndex);
  1191. VAR b: SymTab.TypeIndex;
  1192. BEGIN
  1193. Expect(29);
  1194. Expect(30);
  1195. Type(b);
  1196. t := SymTab.NewPtr(b);;
  1197. END PointerType;
  1198. PROCEDURE SetType (VAR t: SymTab.TypeIndex);
  1199. VAR s: SymTab.TypeIndex;
  1200. BEGIN
  1201. Expect(28);
  1202. Expect(26);
  1203. SimpleType(s);
  1204. IF (s # SymTab.InvalidType)
  1205. & (SymTab.ClassOf(s) #
  1206. SymTab.ClInt)
  1207. & (SymTab.ClassOf(s) #
  1208. SymTab.ClChar)
  1209. & (SymTab.ClassOf(s) #
  1210. SymTab.ClEnum) THEN
  1211. SemError(224) END;
  1212. t := SymTab.NewSet(s);;
  1213. END SetType;
  1214. PROCEDURE RecordType (VAR t: SymTab.TypeIndex);
  1215. BEGIN
  1216. Expect(27);
  1217. t := SymTab.NewRecord();;
  1218. FieldSeq(t);
  1219. Expect(12);
  1220. END RecordType;
  1221. PROCEDURE ArrayType (VAR t: SymTab.TypeIndex);
  1222. VAR s, s2, e: SymTab.TypeIndex;
  1223. BEGIN
  1224. Expect(25);
  1225. SimpleType(s);
  1226. IF (s # SymTab.InvalidType)
  1227. & (SymTab.ClassOf(s) #
  1228. SymTab.ClInt)
  1229. & (SymTab.ClassOf(s) #
  1230. SymTab.ClChar)
  1231. & (SymTab.ClassOf(s) #
  1232. SymTab.ClEnum) THEN
  1233. SemError(224) END;;
  1234. WHILE (sym = 10) DO
  1235. Get;
  1236. SimpleType(s2);
  1237. IF (s2 # SymTab.InvalidType)
  1238. & (SymTab.ClassOf(s2) #
  1239. SymTab.ClInt)
  1240. & (SymTab.ClassOf(s2) #
  1241. SymTab.ClChar)
  1242. & (SymTab.ClassOf(s2) #
  1243. SymTab.ClEnum) THEN
  1244. SemError(224) END;;
  1245. END;
  1246. Expect(26);
  1247. Type(e);
  1248. t := SymTab.NewArray(e);;
  1249. END ArrayType;
  1250. PROCEDURE SimpleType (VAR t: SymTab.TypeIndex);
  1251. VAR t1, t2: SymTab.TypeIndex;
  1252. lx1, lx2: MGen.LitStr;
  1253. vD: BOOLEAN;
  1254. vnD: SymTab.Name;
  1255. BEGIN
  1256. IF (sym = 1) THEN
  1257. QualIdent(t);
  1258. IF (sym = 22) THEN
  1259. Get;
  1260. MGen.NoEmitEnter;;
  1261. ConstExpr(t1, lx1);
  1262. IF (t1 # SymTab.InvalidType)
  1263. & (SymTab.ClassOf(t1) #
  1264. SymTab.ClInt)
  1265. & (SymTab.ClassOf(t1) #
  1266. SymTab.ClChar)
  1267. & (SymTab.ClassOf(t1) #
  1268. SymTab.ClEnum) THEN
  1269. SemError(224) END;;
  1270. Expect(23);
  1271. ConstExpr(t2, lx2);
  1272. IF (t2 # SymTab.InvalidType)
  1273. & (SymTab.ClassOf(t2) #
  1274. SymTab.ClInt)
  1275. & (SymTab.ClassOf(t2) #
  1276. SymTab.ClChar)
  1277. & (SymTab.ClassOf(t2) #
  1278. SymTab.ClEnum) THEN
  1279. SemError(224) END;;
  1280. Expect(24);
  1281. t := SymTab.NewSub(t1);
  1282. MGen.NoEmitExit;;
  1283. END;
  1284. ELSIF (sym = 22) THEN
  1285. Get;
  1286. MGen.NoEmitEnter;;
  1287. ConstExpr(t1, lx1);
  1288. IF (t1 # SymTab.InvalidType)
  1289. & (SymTab.ClassOf(t1) #
  1290. SymTab.ClInt)
  1291. & (SymTab.ClassOf(t1) #
  1292. SymTab.ClChar)
  1293. & (SymTab.ClassOf(t1) #
  1294. SymTab.ClEnum) THEN
  1295. SemError(224) END;;
  1296. Expect(23);
  1297. ConstExpr(t2, lx2);
  1298. IF (t2 # SymTab.InvalidType)
  1299. & (SymTab.ClassOf(t2) #
  1300. SymTab.ClInt)
  1301. & (SymTab.ClassOf(t2) #
  1302. SymTab.ClChar)
  1303. & (SymTab.ClassOf(t2) #
  1304. SymTab.ClEnum) THEN
  1305. SemError(224) END;;
  1306. Expect(24);
  1307. t := SymTab.NewSub(t1);
  1308. MGen.NoEmitExit;;
  1309. ELSIF (sym = 19) THEN
  1310. Enum(t);
  1311. ELSE SynError(76);
  1312. END;
  1313. END SimpleType;
  1314. PROCEDURE FPSection;
  1315. VAR isV: BOOLEAN;
  1316. nn, i: CARDINAL;
  1317. pn: ARRAY [0 .. 15] OF SymTab.Name;
  1318. n: SymTab.Name;
  1319. t: SymTab.TypeIndex;
  1320. BEGIN
  1321. isV := FALSE; nn := 0;;
  1322. IF (sym = 15) THEN
  1323. Get;
  1324. isV := TRUE;;
  1325. END;
  1326. GetIdent(n);
  1327. IF nn <= HIGH(pn) THEN
  1328. MGen.CopyName(n, pn[nn])
  1329. END;
  1330. INC(nn);;
  1331. WHILE (sym = 10) DO
  1332. Get;
  1333. GetIdent(n);
  1334. IF nn <= HIGH(pn) THEN
  1335. MGen.CopyName(n, pn[nn])
  1336. END;
  1337. INC(nn);;
  1338. END;
  1339. Expect(17);
  1340. Type(t);
  1341. i := 0;
  1342. WHILE i < nn DO
  1343. IF i <= HIGH(pn) THEN
  1344. IF ~SymTab.EnterParam(
  1345. pn[i], isV, t) THEN
  1346. SemError(200)
  1347. END
  1348. END;
  1349. INC(i)
  1350. END;;
  1351. END FPSection;
  1352. PROCEDURE QualIdent (VAR t: SymTab.TypeIndex);
  1353. VAR n, m: SymTab.Name;
  1354. BEGIN
  1355. GetIdent(n);
  1356. IF ~SymTab.Lookup(n) THEN
  1357. SemError(201);
  1358. t := SymTab.InvalidType
  1359. ELSIF (SymTab.SymKind(n) #
  1360. SymTab.KindType)
  1361. & (SymTab.SymKind(n) #
  1362. SymTab.KindPredef)
  1363. & (SymTab.SymKind(n) #
  1364. SymTab.KindImport) THEN
  1365. SemError(221);
  1366. t := SymTab.InvalidType
  1367. ELSE t := SymTab.SymType(n) END;;
  1368. WHILE (sym = 7) DO
  1369. Get;
  1370. GetIdent(m);
  1371. t := SymTab.InvalidType;;
  1372. END;
  1373. END QualIdent;
  1374. PROCEDURE FormalParams;
  1375. BEGIN
  1376. FPSection;
  1377. WHILE (sym = 6) DO
  1378. Get;
  1379. FPSection;
  1380. END;
  1381. END FormalParams;
  1382. PROCEDURE VarIdents;
  1383. VAR n: SymTab.Name;
  1384. BEGIN
  1385. GetIdent(n);
  1386. IF ~SymTab.EnterPending(n,
  1387. SymTab.KindVar)
  1388. THEN SemError(200) END;
  1389. WHILE (sym = 10) DO
  1390. Get;
  1391. GetIdent(n);
  1392. IF ~SymTab.EnterPending(n,
  1393. SymTab.KindVar)
  1394. THEN SemError(200) END;
  1395. END;
  1396. END VarIdents;
  1397. PROCEDURE Type (VAR t: SymTab.TypeIndex);
  1398. BEGIN
  1399. IF (sym = 1) OR (sym = 19) OR (sym = 22) THEN
  1400. SimpleType(t);
  1401. ELSIF (sym = 25) THEN
  1402. ArrayType(t);
  1403. ELSIF (sym = 27) THEN
  1404. RecordType(t);
  1405. ELSIF (sym = 28) THEN
  1406. SetType(t);
  1407. ELSIF (sym = 29) THEN
  1408. PointerType(t);
  1409. ELSE SynError(77);
  1410. END;
  1411. END Type;
  1412. PROCEDURE Expr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  1413. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  1414. VAR t2: SymTab.TypeIndex;
  1415. tc, op: INTEGER;
  1416. lx2: MGen.LitStr;
  1417. v2: BOOLEAN;
  1418. vn2: SymTab.Name;
  1419. r: BOOLEAN;
  1420. BEGIN
  1421. SimExpr(t, lx, v, vn);
  1422. IF In(symSet[5], sym) THEN
  1423. Rel(op);
  1424. SimExpr(t2, lx2, v2, vn2);
  1425. lx[0] := 0C; v := FALSE;
  1426. IF op = SymTab.OpIn THEN
  1427. IF SymTab.InCheck(t, t2) THEN
  1428. t := SymTab.BoolType();
  1429. MGen.BitIn
  1430. ELSE SemError(222);
  1431. t := SymTab.InvalidType;
  1432. MGen.Drop; MGen.Drop; MGen.PushInt(0)
  1433. END
  1434. ELSE
  1435. tc := SymTab.ClassOf(t);
  1436. IF SymTab.RelCheck(t, t2, op) THEN
  1437. t := SymTab.BoolType()
  1438. ELSE SemError(213); t := SymTab.InvalidType END;
  1439. IF t # SymTab.InvalidType THEN
  1440. r := tc = SymTab.ClReal;
  1441. IF r THEN
  1442. IF op = SymTab.OpEq THEN MGen.RealEq
  1443. ELSIF (op = SymTab.OpNeq1)
  1444. OR (op = SymTab.OpNeq2) THEN MGen.RealNe
  1445. ELSIF op = SymTab.OpLt THEN MGen.RealLt
  1446. ELSIF op = SymTab.OpLe THEN MGen.RealLe
  1447. ELSIF op = SymTab.OpGt THEN MGen.RealGt
  1448. ELSE MGen.RealGe END
  1449. ELSE
  1450. IF op = SymTab.OpEq THEN MGen.Eq
  1451. ELSIF (op = SymTab.OpNeq1)
  1452. OR (op = SymTab.OpNeq2) THEN MGen.Neq
  1453. ELSIF op = SymTab.OpLt THEN MGen.ILt
  1454. ELSIF op = SymTab.OpLe THEN MGen.ILe
  1455. ELSIF op = SymTab.OpGt THEN MGen.IGt
  1456. ELSE MGen.IGe END
  1457. END
  1458. ELSE MGen.Drop; MGen.Drop; MGen.PushInt(0)
  1459. END
  1460. END;;
  1461. END;
  1462. END Expr;
  1463. PROCEDURE ConstExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr);
  1464. VAR vD: BOOLEAN;
  1465. vnD: SymTab.Name;
  1466. BEGIN
  1467. Expr(t, lx, vD, vnD);
  1468. END ConstExpr;
  1469. PROCEDURE ProcedureDecl;
  1470. VAR n, m: SymTab.Name;
  1471. rt: SymTab.TypeIndex;
  1472. hasR, ok: BOOLEAN;
  1473. endL: INTEGER;
  1474. BEGIN
  1475. Expect(18);
  1476. hasR := FALSE;;
  1477. GetIdent(n);
  1478. IF SymTab.IsForward(n) THEN
  1479. SymTab.ReuseProc(n)
  1480. ELSIF ~SymTab.EnterProc(n) THEN
  1481. SemError(200)
  1482. END;
  1483. SymTab.OpenProcScope;
  1484. endL := MGen.NewLabel();
  1485. MGen.Jmp(endL);;
  1486. IF (sym = 19) THEN
  1487. Get;
  1488. FormalParams;
  1489. Expect(20);
  1490. END;
  1491. IF (sym = 17) THEN
  1492. Get;
  1493. QualIdent(rt);
  1494. hasR := TRUE;;
  1495. END;
  1496. IF hasR THEN
  1497. ok := SymTab.SetProcRet(rt)
  1498. ELSE
  1499. ok := SymTab.SetProcRet(
  1500. SymTab.InvalidType)
  1501. END;
  1502. IF ~ok THEN SemError(231) END;
  1503. IF ~SymTab.VerifyProc() THEN
  1504. SemError(231)
  1505. END;;
  1506. Expect(6);
  1507. IF In(symSet[6], sym) THEN
  1508. Block(TRUE);
  1509. GetIdent(m);
  1510. IF ~SymTab.Equal(n, m) THEN
  1511. SemError(202) END;
  1512. MGen.DefLabel(endL);
  1513. SymTab.CloseProc;;
  1514. ELSIF (sym = 21) THEN
  1515. Get;
  1516. SymTab.SetForward;
  1517. SymTab.CloseProc;
  1518. MGen.DefLabel(endL);;
  1519. ELSE SynError(78);
  1520. END;
  1521. END ProcedureDecl;
  1522. PROCEDURE VarDecl;
  1523. VAR t: SymTab.TypeIndex;
  1524. i: CARDINAL;
  1525. nm: SymTab.Name;
  1526. cls: INTEGER;
  1527. BEGIN
  1528. VarIdents;
  1529. Expect(17);
  1530. Type(t);
  1531. cls := SymTab.ClassOf(t);
  1532. IF (cls # SymTab.ClInt)
  1533. & (cls # SymTab.ClReal)
  1534. & (cls # SymTab.ClBool)
  1535. & (cls # SymTab.ClChar)
  1536. & (cls # SymTab.ClEnum)
  1537. & (cls # SymTab.ClSet) THEN
  1538. SemError(230)
  1539. END;
  1540. i := 0;
  1541. WHILE i < SymTab.PendCount() DO
  1542. SymTab.PendName(i, nm);
  1543. IF SymTab.SymDepth(nm) = 0 THEN
  1544. MGen.DeclVar(nm)
  1545. END;
  1546. INC(i)
  1547. END;
  1548. SymTab.FixPending(t);;
  1549. END VarDecl;
  1550. PROCEDURE TypeDecl;
  1551. VAR n: SymTab.Name;
  1552. t0, t1: SymTab.TypeIndex;
  1553. BEGIN
  1554. GetIdent(n);
  1555. IF ~SymTab.Enter(n, SymTab.KindType)
  1556. THEN SemError(200) END;
  1557. t0 := SymTab.NewAlias();
  1558. SymTab.SetSymType(n, t0);;
  1559. Expect(16);
  1560. Type(t1);
  1561. IF t1 = t0 THEN SemError(223);
  1562. SymTab.SetTarget(t0,
  1563. SymTab.InvalidType)
  1564. ELSE SymTab.SetTarget(t0, t1) END;;
  1565. END TypeDecl;
  1566. PROCEDURE ConstDecl;
  1567. VAR n: SymTab.Name;
  1568. t: SymTab.TypeIndex;
  1569. lx: MGen.LitStr;
  1570. cls: INTEGER;
  1571. BEGIN
  1572. GetIdent(n);
  1573. IF ~SymTab.Enter(n, SymTab.KindConst)
  1574. THEN SemError(200) END;
  1575. Expect(16);
  1576. MGen.NoEmitEnter;;
  1577. ConstExpr(t, lx);
  1578. SymTab.SetSymType(n, t);
  1579. cls := SymTab.ClassOf(t);
  1580. IF cls = SymTab.ClStr THEN
  1581. SemError(230)
  1582. ELSIF ~MGen.IsLit(lx) THEN
  1583. SemError(230)
  1584. END;
  1585. MGen.DeclConst(n, lx, t);
  1586. MGen.NoEmitExit;;
  1587. END ConstDecl;
  1588. PROCEDURE StatSeq;
  1589. BEGIN
  1590. Stat;
  1591. WHILE (sym = 6) DO
  1592. Get;
  1593. Stat;
  1594. END;
  1595. END StatSeq;
  1596. PROCEDURE Declaration;
  1597. BEGIN
  1598. IF (sym = 13) THEN
  1599. Get;
  1600. WHILE (sym = 1) DO
  1601. ConstDecl;
  1602. Expect(6);
  1603. END;
  1604. ELSIF (sym = 14) THEN
  1605. Get;
  1606. WHILE (sym = 1) DO
  1607. TypeDecl;
  1608. Expect(6);
  1609. END;
  1610. ELSIF (sym = 15) THEN
  1611. Get;
  1612. WHILE (sym = 1) DO
  1613. VarDecl;
  1614. Expect(6);
  1615. END;
  1616. ELSIF (sym = 18) THEN
  1617. ProcedureDecl;
  1618. Expect(6);
  1619. ELSE SynError(79);
  1620. END;
  1621. END Declaration;
  1622. PROCEDURE ImportList;
  1623. VAR n: SymTab.Name;
  1624. BEGIN
  1625. GetIdent(n);
  1626. IF ~SymTab.Enter(n, SymTab.KindImport)
  1627. THEN SemError(200) END;
  1628. WHILE (sym = 10) DO
  1629. Get;
  1630. GetIdent(n);
  1631. IF ~SymTab.Enter(n, SymTab.KindImport)
  1632. THEN SemError(200) END;
  1633. END;
  1634. END ImportList;
  1635. PROCEDURE Block (isProc: BOOLEAN);
  1636. VAR began: BOOLEAN;
  1637. BEGIN
  1638. began := FALSE;;
  1639. WHILE (sym = 13) OR (sym = 14) OR (sym = 15) OR (sym = 18) DO
  1640. Declaration;
  1641. END;
  1642. IF (sym = 11) THEN
  1643. Get;
  1644. began := TRUE;
  1645. IF isProc THEN
  1646. MGen.ProcEntry(
  1647. SymTab.CurProc(),
  1648. SymTab.ProcNLocals())
  1649. ELSE MGen.BeginBody
  1650. END;;
  1651. StatSeq;
  1652. END;
  1653. Expect(12);
  1654. IF isProc THEN
  1655. IF ~began THEN
  1656. MGen.ProcEntry(
  1657. SymTab.CurProc(),
  1658. SymTab.ProcNLocals())
  1659. END;
  1660. IF SymTab.InFunction() THEN
  1661. MGen.PushInt(0)
  1662. END;
  1663. MGen.Leave(SymTab.CurNPar(),
  1664. SymTab.InFunction())
  1665. END;;
  1666. END Block;
  1667. PROCEDURE Import;
  1668. VAR n: SymTab.Name;
  1669. BEGIN
  1670. IF (sym = 8) THEN
  1671. Get;
  1672. GetIdent(n);
  1673. IF ~SymTab.Enter(n, SymTab.KindImport)
  1674. THEN SemError(200) END;
  1675. Expect(9);
  1676. ImportList;
  1677. Expect(6);
  1678. ELSIF (sym = 9) THEN
  1679. Get;
  1680. ImportList;
  1681. Expect(6);
  1682. ELSE SynError(80);
  1683. END;
  1684. END Import;
  1685. PROCEDURE GetIdent (VAR n: SymTab.Name);
  1686. BEGIN
  1687. Expect(1);
  1688. LexName(n);;
  1689. END GetIdent;
  1690. PROCEDURE M2c;
  1691. VAR m1, m2: SymTab.Name;
  1692. BEGIN
  1693. Expect(5);
  1694. GetIdent(m1);
  1695. SymTab.Init; MGen.OpenModule(m1);
  1696. IF ~SymTab.Enter(m1, SymTab.KindModule)
  1697. THEN SemError(200) END;
  1698. Expect(6);
  1699. WHILE (sym = 8) OR (sym = 9) DO
  1700. Import;
  1701. END;
  1702. Block(FALSE);
  1703. GetIdent(m2);
  1704. IF ~SymTab.Equal(m1, m2)
  1705. THEN SemError(202) END;
  1706. Expect(7);
  1707. IF SymTab.AnyForward() THEN
  1708. SemError(231)
  1709. END;
  1710. MGen.EndModule;
  1711. SymTab.PrintTable;;
  1712. END M2c;
  1713. PROCEDURE Parse;
  1714. BEGIN
  1715. M2cS.Reset; Get;
  1716. M2c;
  1717. END Parse;
  1718. BEGIN
  1719. errDist := minErrDist;
  1720. symSet[ 0, 0] := BITSET{0};
  1721. symSet[ 0, 1] := BITSET{};
  1722. symSet[ 0, 2] := BITSET{};
  1723. symSet[ 0, 3] := BITSET{};
  1724. symSet[ 0, 4] := BITSET{};
  1725. symSet[ 1, 0] := BITSET{1, 2, 3, 4};
  1726. symSet[ 1, 1] := BITSET{3};
  1727. symSet[ 1, 2] := BITSET{14};
  1728. symSet[ 1, 3] := BITSET{9};
  1729. symSet[ 1, 4] := BITSET{1, 2, 3};
  1730. symSet[ 2, 0] := BITSET{};
  1731. symSet[ 2, 1] := BITSET{};
  1732. symSet[ 2, 2] := BITSET{};
  1733. symSet[ 2, 3] := BITSET{11, 12, 13, 14, 15};
  1734. symSet[ 2, 4] := BITSET{0};
  1735. symSet[ 3, 0] := BITSET{6, 12};
  1736. symSet[ 3, 1] := BITSET{};
  1737. symSet[ 3, 2] := BITSET{3, 4, 6, 10};
  1738. symSet[ 3, 3] := BITSET{};
  1739. symSet[ 3, 4] := BITSET{};
  1740. symSet[ 4, 0] := BITSET{1};
  1741. symSet[ 4, 1] := BITSET{15};
  1742. symSet[ 4, 2] := BITSET{1, 5, 7, 9, 11, 12, 15};
  1743. symSet[ 4, 3] := BITSET{0};
  1744. symSet[ 4, 4] := BITSET{};
  1745. symSet[ 5, 0] := BITSET{};
  1746. symSet[ 5, 1] := BITSET{0};
  1747. symSet[ 5, 2] := BITSET{};
  1748. symSet[ 5, 3] := BITSET{2, 3, 4, 5, 6, 7, 8};
  1749. symSet[ 5, 4] := BITSET{};
  1750. symSet[ 6, 0] := BITSET{11, 12, 13, 14, 15};
  1751. symSet[ 6, 1] := BITSET{2};
  1752. symSet[ 6, 2] := BITSET{};
  1753. symSet[ 6, 3] := BITSET{};
  1754. symSet[ 6, 4] := BITSET{};
  1755. END M2cP.