M2cP.mod 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424
  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 = 71;
  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 ByLit (VAR v: INTEGER); FORWARD;
  107. PROCEDURE Labels (sel: SymTab.TypeIndex; tmp: INTEGER; bodyL: INTEGER); FORWARD;
  108. PROCEDURE LabelList (sel: SymTab.TypeIndex; tmp: INTEGER;
  109. VAR lB: INTEGER; VAR lN: INTEGER); FORWARD;
  110. PROCEDURE Case (sel: SymTab.TypeIndex; tmp: INTEGER; endL: INTEGER); FORWARD;
  111. PROCEDURE CallTail (pn: SymTab.Name; sfx: BOOLEAN; inExpr: BOOLEAN;
  112. VAR ok: BOOLEAN; hasDead: BOOLEAN); FORWARD;
  113. PROCEDURE DesignTail (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  114. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr;
  115. VAR sfx: BOOLEAN); FORWARD;
  116. PROCEDURE DesignHead (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  117. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr); FORWARD;
  118. PROCEDURE DispStat; FORWARD;
  119. PROCEDURE NewStat; 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(69);
  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
  191. MGen.PushInt(1); MGen.Add;
  192. MGen.FieldMask
  193. ELSE MGen.Power2 END;
  194. MGen.Or;;
  195. WHILE (sym = 10) DO
  196. Get;
  197. Elem(et, lxE, lxE2, hasR);
  198. IF ~SymTab.SetElemCheck(first, et) THEN
  199. SemError(222) END;
  200. IF hasR THEN
  201. MGen.PushInt(1); MGen.Add;
  202. MGen.FieldMask
  203. ELSE MGen.Power2 END;
  204. MGen.Or;;
  205. END;
  206. END;
  207. Expect(70);
  208. END SetLit;
  209. PROCEDURE MulOp (VAR op: INTEGER);
  210. BEGIN
  211. CASE sym OF
  212. 61 :
  213. Get;
  214. op := SymTab.OpTimes;;
  215. | 62 :
  216. Get;
  217. op := SymTab.OpSlash;;
  218. | 63 :
  219. Get;
  220. op := SymTab.OpDiv;;
  221. | 64 :
  222. Get;
  223. op := SymTab.OpMod;;
  224. | 65 :
  225. Get;
  226. op := SymTab.OpAnd;;
  227. | 66 :
  228. Get;
  229. op := SymTab.OpAnd;;
  230. ELSE SynError(72);
  231. END;
  232. END MulOp;
  233. PROCEDURE Fact (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  234. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  235. VAR s: ARRAY [0 .. 255] OF CHAR;
  236. t2, et, dt, st: SymTab.TypeIndex;
  237. dk: INTEGER;
  238. bnF: SymTab.Name;
  239. lxD, lx2: MGen.LitStr;
  240. v2: BOOLEAN;
  241. vn2: SymTab.Name;
  242. vi: INTEGER;
  243. c: CARDINAL;
  244. b: LONGCARD;
  245. sfxF: BOOLEAN;
  246. okF: BOOLEAN;
  247. BEGIN
  248. CASE sym OF
  249. 2 :
  250. Get;
  251. LexString(s);
  252. MGen.CopyName(s, lx);
  253. v := FALSE;
  254. IF MGen.ParseInt(s, vi) THEN
  255. MGen.PushInt(vi)
  256. ELSIF MGen.ParseCard(s, c) THEN
  257. MGen.PushBits(
  258. VAL(LONGCARD, c))
  259. ELSE MGen.PushInt(0)
  260. END;
  261. t := SymTab.IntType();;
  262. | 3 :
  263. Get;
  264. LexString(s);
  265. MGen.CopyName(s, lx);
  266. v := FALSE;
  267. IF MGen.ParseReal(s, b) THEN
  268. MGen.PushBits(b)
  269. ELSE MGen.PushBits(0H)
  270. END;
  271. t := SymTab.RealType();;
  272. | 4 :
  273. Get;
  274. LexString(s);
  275. v := FALSE;
  276. IF SymTab.StrLen(s) <= 3 THEN
  277. t := SymTab.CharType();
  278. MGen.CopyName(s, lx);
  279. MGen.PushInt(
  280. MGen.CharOrd(s))
  281. ELSE t := SymTab.NewStr();
  282. MGen.CopyName(s, lx);
  283. MGen.EmitString(s)
  284. END;;
  285. | 1 :
  286. DesignHead(dt, dk, bnF, TRUE, lxD);
  287. DesignTail(dt, dk, bnF, TRUE, lxD, sfxF);
  288. t := dt;
  289. MGen.CopyName(lxD, lx);
  290. IF sfxF
  291. & (t # SymTab.InvalidType)
  292. & (SymTab.ClassOf(t)
  293. # SymTab.ClArray)
  294. & (SymTab.ClassOf(t)
  295. # SymTab.ClRecord) THEN
  296. IF (SymTab.ClassOf(t)
  297. = SymTab.ClChar)
  298. OR (SymTab.ClassOf(t)
  299. = SymTab.ClBool) THEN
  300. MGen.LoadByte
  301. ELSE MGen.LoadIndir
  302. END
  303. END;
  304. v := ~sfxF
  305. & ((dk = SymTab.KindVar)
  306. OR (dk = SymTab.KindParam)
  307. OR (dk
  308. = SymTab.KindVarPar));
  309. MGen.CopyName(bnF, vn);;
  310. IF (sym = 19) THEN
  311. CallTail(bnF, sfxF, TRUE, okF, TRUE);
  312. IF okF THEN
  313. IF SymTab.SymKind(bnF)
  314. = SymTab.KindProc THEN
  315. t := SymTab.ProcRet(bnF)
  316. ELSE
  317. t := SymTab.InvalidType
  318. END
  319. ELSE t := SymTab.InvalidType
  320. END;
  321. lx[0] := 0C; v := FALSE;;
  322. END;
  323. | 19 :
  324. Get;
  325. Expr(et, lx, v, vn);
  326. Expect(20);
  327. t := et;;
  328. | 67, 68 :
  329. IF (sym = 67) THEN
  330. Get;
  331. ELSE
  332. Get;
  333. END;
  334. Fact(t2, lx2, v2, vn2);
  335. lx[0] := 0C; v := FALSE;
  336. IF SymTab.BoolCheck(t2) THEN
  337. t := SymTab.BoolType()
  338. ELSE SemError(212);
  339. t := SymTab.InvalidType END;
  340. MGen.Not;;
  341. | 69 :
  342. SetLit(st);
  343. lx[0] := 0C; v := FALSE;
  344. t := st;;
  345. ELSE SynError(73);
  346. END;
  347. END Fact;
  348. PROCEDURE AddOp (VAR op: INTEGER);
  349. BEGIN
  350. IF (sym = 59) THEN
  351. Get;
  352. op := SymTab.OpAdd;;
  353. ELSIF (sym = 46) THEN
  354. Get;
  355. op := SymTab.OpSub;;
  356. ELSIF (sym = 60) THEN
  357. Get;
  358. op := SymTab.OpOr;;
  359. ELSE SynError(74);
  360. END;
  361. END AddOp;
  362. PROCEDURE Term (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  363. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  364. VAR t2, res2: SymTab.TypeIndex;
  365. op: INTEGER;
  366. lx2: MGen.LitStr;
  367. v2: BOOLEAN;
  368. vn2: SymTab.Name;
  369. isR: BOOLEAN;
  370. mt: INTEGER;
  371. BEGIN
  372. Fact(t, lx, v, vn);
  373. WHILE In(symSet[2], sym) DO
  374. MulOp(op);
  375. Fact(t2, lx2, v2, vn2);
  376. lx[0] := 0C; v := FALSE;
  377. IF op = SymTab.OpAnd THEN
  378. IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
  379. t := SymTab.BoolType()
  380. ELSE SemError(212); t := SymTab.InvalidType END;
  381. MGen.And
  382. ELSIF (op = SymTab.OpTimes)
  383. & (t # SymTab.InvalidType)
  384. & (t2 # SymTab.InvalidType)
  385. & (SymTab.ClassOf(t) = SymTab.ClSet)
  386. & (SymTab.ClassOf(t2) = SymTab.ClSet) THEN
  387. MGen.And
  388. ELSE
  389. IF SymTab.ArithCheck(t, t2,
  390. (op = SymTab.OpDiv) OR (op = SymTab.OpMod),
  391. res2) THEN t := res2
  392. ELSE SemError(211); t := SymTab.InvalidType END;
  393. isR := (t # SymTab.InvalidType)
  394. & (SymTab.ClassOf(t) = SymTab.ClReal);
  395. IF op = SymTab.OpTimes THEN
  396. IF isR THEN MGen.RealMul ELSE MGen.MulU END
  397. ELSIF op = SymTab.OpSlash THEN
  398. IF isR THEN MGen.RealDiv ELSE MGen.DivI END
  399. ELSIF op = SymTab.OpDiv THEN
  400. MGen.DivI
  401. ELSE
  402. mt := MGen.TempGlobal();
  403. MGen.ModI(mt)
  404. END
  405. END;;
  406. END;
  407. END Term;
  408. PROCEDURE Rel (VAR op: INTEGER);
  409. BEGIN
  410. CASE sym OF
  411. 16 :
  412. Get;
  413. op := SymTab.OpEq;;
  414. | 52 :
  415. Get;
  416. op := SymTab.OpNeq1;;
  417. | 53 :
  418. Get;
  419. op := SymTab.OpNeq2;;
  420. | 54 :
  421. Get;
  422. op := SymTab.OpLt;;
  423. | 55 :
  424. Get;
  425. op := SymTab.OpLe;;
  426. | 56 :
  427. Get;
  428. op := SymTab.OpGt;;
  429. | 57 :
  430. Get;
  431. op := SymTab.OpGe;;
  432. | 58 :
  433. Get;
  434. op := SymTab.OpIn;;
  435. ELSE SynError(75);
  436. END;
  437. END Rel;
  438. PROCEDURE SimExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  439. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  440. VAR t2, res2: SymTab.TypeIndex;
  441. op: INTEGER;
  442. lx2: MGen.LitStr;
  443. v2: BOOLEAN;
  444. vn2: SymTab.Name;
  445. neg, isR: BOOLEAN;
  446. BEGIN
  447. neg := FALSE;;
  448. IF (sym = 46) OR (sym = 59) THEN
  449. IF (sym = 59) THEN
  450. Get;
  451. ELSE
  452. Get;
  453. neg := TRUE;;
  454. END;
  455. END;
  456. Term(t, lx, v, vn);
  457. IF neg THEN
  458. v := FALSE;
  459. IF MGen.IsLit(lx) THEN
  460. MGen.NegFold(lx, lx)
  461. ELSE lx[0] := 0C
  462. END;
  463. IF SymTab.ClassOf(t)
  464. = SymTab.ClReal THEN
  465. MGen.NegReal
  466. ELSE MGen.NegInt
  467. END
  468. END;;
  469. WHILE (sym = 46) OR (sym = 59) OR (sym = 60) DO
  470. AddOp(op);
  471. Term(t2, lx2, v2, vn2);
  472. lx[0] := 0C; v := FALSE;
  473. IF op = SymTab.OpOr THEN
  474. IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
  475. t := SymTab.BoolType()
  476. ELSE SemError(212); t := SymTab.InvalidType END;
  477. MGen.Or
  478. ELSIF (t # SymTab.InvalidType)
  479. & (t2 # SymTab.InvalidType)
  480. & (SymTab.ClassOf(t) = SymTab.ClSet)
  481. & (SymTab.ClassOf(t2) = SymTab.ClSet) THEN
  482. IF op = SymTab.OpAdd THEN
  483. MGen.Or
  484. ELSE
  485. MGen.PushBits(0FFFFFFFFFFFFFFFFH);
  486. MGen.BitXor;
  487. MGen.And
  488. END
  489. ELSE
  490. IF SymTab.ArithCheck(t, t2, FALSE, res2) THEN t := res2
  491. ELSE SemError(211); t := SymTab.InvalidType END;
  492. isR := (t # SymTab.InvalidType)
  493. & (SymTab.ClassOf(t) = SymTab.ClReal);
  494. IF op = SymTab.OpAdd THEN
  495. IF isR THEN MGen.RealAdd ELSE MGen.Add END
  496. ELSE
  497. IF isR THEN MGen.RealSub ELSE MGen.Sub END
  498. END
  499. END;;
  500. END;
  501. END SimExpr;
  502. PROCEDURE ByLit (VAR v: INTEGER);
  503. VAR s: ARRAY [0 .. 255] OF CHAR;
  504. BEGIN
  505. IF (sym = 2) THEN
  506. Get;
  507. LexString(s);
  508. IF ~MGen.ParseInt(s, v) THEN
  509. v := 1
  510. END;;
  511. ELSIF (sym = 46) THEN
  512. Get;
  513. Expect(2);
  514. LexString(s);
  515. IF MGen.ParseInt(s, v) THEN
  516. v := -v
  517. ELSE v := -1
  518. END;;
  519. ELSE SynError(76);
  520. END;
  521. END ByLit;
  522. PROCEDURE Labels (sel: SymTab.TypeIndex; tmp: INTEGER; bodyL: INTEGER);
  523. VAR t, t2: SymTab.TypeIndex;
  524. lx1, lx2: MGen.LitStr;
  525. v1, v2: BOOLEAN;
  526. vn1, vn2: SymTab.Name;
  527. ta, tb, chunk: INTEGER;
  528. r, hasRange: BOOLEAN;
  529. BEGIN
  530. ConstExpr(t, lx1);
  531. IF ~SymTab.EqCheck(t, sel) THEN
  532. SemError(213) END;
  533. r := (SymTab.ClassOf(sel)
  534. = SymTab.ClReal)
  535. & (SymTab.ClassOf(t)
  536. = SymTab.ClReal);
  537. ta := MGen.TempGlobal();
  538. MGen.StoreTemp(ta);
  539. hasRange := FALSE;;
  540. IF (sym = 23) THEN
  541. Get;
  542. ConstExpr(t2, lx2);
  543. IF ~SymTab.EqCheck(t2, sel) THEN
  544. SemError(213) END;
  545. tb := MGen.TempGlobal();
  546. MGen.StoreTemp(tb);
  547. hasRange := TRUE;;
  548. END;
  549. IF hasRange THEN
  550. MGen.LoadTemp(tmp);
  551. MGen.LoadTemp(ta);
  552. IF r THEN MGen.RealGe
  553. ELSE MGen.IGe END;
  554. MGen.LoadTemp(tmp);
  555. MGen.LoadTemp(tb);
  556. IF r THEN MGen.RealLe
  557. ELSE MGen.ILe END;
  558. MGen.And
  559. ELSE
  560. MGen.LoadTemp(tmp);
  561. MGen.LoadTemp(ta);
  562. IF r THEN MGen.RealEq
  563. ELSE MGen.Eq END
  564. END;
  565. chunk := MGen.NewLabel();
  566. MGen.Jz(chunk);
  567. MGen.Jmp(bodyL);
  568. MGen.DefLabel(chunk);;
  569. END Labels;
  570. PROCEDURE LabelList (sel: SymTab.TypeIndex; tmp: INTEGER;
  571. VAR lB: INTEGER; VAR lN: INTEGER);
  572. BEGIN
  573. lB := MGen.NewLabel();
  574. lN := MGen.NewLabel();;
  575. Labels(sel, tmp, lB);
  576. WHILE (sym = 10) DO
  577. Get;
  578. Labels(sel, tmp, lB);
  579. END;
  580. MGen.Jmp(lN);;
  581. END LabelList;
  582. PROCEDURE Case (sel: SymTab.TypeIndex; tmp: INTEGER; endL: INTEGER);
  583. VAR lB, lN: INTEGER;
  584. BEGIN
  585. IF In(symSet[1], sym) THEN
  586. LabelList(sel, tmp, lB, lN);
  587. Expect(17);
  588. MGen.DefLabel(lB);;
  589. StatSeq;
  590. MGen.Jmp(endL);
  591. MGen.DefLabel(lN);;
  592. END;
  593. END Case;
  594. PROCEDURE CallTail (pn: SymTab.Name; sfx: BOOLEAN; inExpr: BOOLEAN;
  595. VAR ok: BOOLEAN; hasDead: BOOLEAN);
  596. VAR t: SymTab.TypeIndex;
  597. lx: MGen.LitStr;
  598. v: BOOLEAN;
  599. vn: SymTab.Name;
  600. BEGIN
  601. Expect(19);
  602. ok := FALSE;
  603. IF hasDead THEN MGen.Drop END;
  604. MGen.ActBegin(pn);;
  605. IF In(symSet[1], sym) THEN
  606. Expr(t, lx, v, vn);
  607. IF MGen.ActValue(t, v, vn) # 0 THEN
  608. SemError(233)
  609. END;;
  610. WHILE (sym = 10) DO
  611. Get;
  612. Expr(t, lx, v, vn);
  613. IF MGen.ActValue(t, v, vn) # 0 THEN
  614. SemError(233)
  615. END;;
  616. END;
  617. END;
  618. Expect(20);
  619. IF MGen.ActEnd(pn, sfx, inExpr) # 0
  620. THEN SemError(233)
  621. ELSE ok := TRUE
  622. END;;
  623. END CallTail;
  624. PROCEDURE DesignTail (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  625. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr;
  626. VAR sfx: BOOLEAN);
  627. VAR m: SymTab.Name;
  628. it: SymTab.TypeIndex;
  629. lxI: MGen.LitStr;
  630. vI: BOOLEAN;
  631. vnI: SymTab.Name;
  632. loA: INTEGER;
  633. elemT: SymTab.TypeIndex;
  634. esl, ebytes: CARDINAL;
  635. firstT: BOOLEAN;
  636. clsI: INTEGER;
  637. BEGIN
  638. sfx := FALSE;;
  639. WHILE (sym = 7) OR (sym = 22) OR (sym = 51) DO
  640. IF (sym = 7) THEN
  641. Get;
  642. firstT := ~sfx;
  643. sfx := TRUE; lx[0] := 0C;
  644. IF ~doLoad & firstT THEN
  645. IF (k = SymTab.KindVar)
  646. OR (k = SymTab.KindParam)
  647. OR (k
  648. = SymTab.KindVarPar) THEN
  649. MGen.PushAddr(bn)
  650. ELSIF k
  651. = SymTab.KindField THEN
  652. MGen.WithAddr(bn)
  653. ELSE MGen.PushInt(0)
  654. END
  655. END;;
  656. GetIdent(m);
  657. IF t = SymTab.InvalidType THEN
  658. IF ~doLoad & firstT THEN
  659. MGen.Drop
  660. ELSIF doLoad THEN
  661. MGen.Drop; MGen.PushInt(0)
  662. END
  663. ELSIF SymTab.ClassOf(t) #
  664. SymTab.ClRecord THEN
  665. SemError(215);
  666. t := SymTab.InvalidType;
  667. IF doLoad THEN
  668. MGen.Drop; MGen.PushInt(0)
  669. ELSIF firstT THEN
  670. MGen.Drop
  671. END
  672. ELSIF ~SymTab.FieldExists(t, m) THEN
  673. SemError(216);
  674. t := SymTab.InvalidType;
  675. IF doLoad THEN
  676. MGen.Drop; MGen.PushInt(0)
  677. ELSIF firstT THEN
  678. MGen.Drop
  679. END
  680. ELSE
  681. loA := SymTab.FieldOffset(t, m);
  682. elemT := SymTab.FieldType(t, m);
  683. IF loA < 0 THEN
  684. SemError(216);
  685. t := SymTab.InvalidType;
  686. IF doLoad THEN
  687. MGen.Drop; MGen.PushInt(0)
  688. ELSIF firstT THEN
  689. MGen.Drop
  690. END
  691. ELSE
  692. MGen.FieldAdd(
  693. VAL(CARDINAL, loA));
  694. t := elemT
  695. END
  696. END;;
  697. ELSIF (sym = 22) THEN
  698. Get;
  699. firstT := ~sfx;
  700. sfx := TRUE; lx[0] := 0C;
  701. IF ~doLoad & firstT THEN
  702. IF (k = SymTab.KindVar)
  703. OR (k = SymTab.KindParam)
  704. OR (k
  705. = SymTab.KindVarPar) THEN
  706. MGen.PushAddr(bn)
  707. ELSIF k
  708. = SymTab.KindField THEN
  709. MGen.WithAddr(bn)
  710. ELSE MGen.PushInt(0)
  711. END
  712. END;;
  713. Expr(it, lxI, vI, vnI);
  714. IF t = SymTab.InvalidType THEN
  715. MGen.Drop;
  716. IF doLoad THEN
  717. MGen.Drop; MGen.PushInt(0)
  718. ELSE
  719. IF ~firstT THEN
  720. ELSE MGen.Drop
  721. END
  722. END
  723. ELSIF SymTab.ClassOf(t) #
  724. SymTab.ClArray THEN
  725. SemError(217);
  726. t := SymTab.InvalidType;
  727. MGen.Drop;
  728. IF doLoad THEN
  729. MGen.Drop; MGen.PushInt(0)
  730. ELSE
  731. IF ~firstT THEN
  732. ELSE MGen.Drop
  733. END
  734. END
  735. ELSE
  736. clsI := SymTab.ClassOf(it);
  737. IF (it
  738. # SymTab.InvalidType)
  739. & (clsI # SymTab.ClInt)
  740. & (clsI # SymTab.ClChar)
  741. & (clsI # SymTab.ClEnum)
  742. & (clsI
  743. # SymTab.ClBool) THEN
  744. SemError(218);
  745. t := SymTab.InvalidType;
  746. MGen.Drop;
  747. IF doLoad THEN
  748. MGen.Drop; MGen.PushInt(0)
  749. ELSE
  750. IF ~firstT THEN
  751. ELSE MGen.Drop
  752. END
  753. END
  754. ELSE
  755. loA := SymTab.ArrayLo(t);
  756. elemT := SymTab.ArrayElem(t);
  757. esl := SymTab.TypeSlots(elemT);
  758. IF esl = 0 THEN
  759. SemError(230);
  760. esl := 1
  761. END;
  762. IF (SymTab.ClassOf(elemT)
  763. = SymTab.ClChar)
  764. OR (SymTab.ClassOf(elemT)
  765. = SymTab.ClBool) THEN
  766. ebytes := 1
  767. ELSE ebytes := esl * 8
  768. END;
  769. MGen.IdxScale(loA, ebytes);
  770. t := elemT
  771. END
  772. END;;
  773. WHILE (sym = 10) DO
  774. Get;
  775. Expr(it, lxI, vI, vnI);
  776. IF t = SymTab.InvalidType THEN
  777. MGen.Drop;
  778. IF doLoad THEN
  779. MGen.Drop; MGen.PushInt(0);
  780. t := SymTab.InvalidType
  781. END
  782. ELSIF SymTab.ClassOf(t) #
  783. SymTab.ClArray THEN
  784. SemError(217);
  785. t := SymTab.InvalidType;
  786. MGen.Drop;
  787. IF doLoad THEN
  788. MGen.Drop; MGen.PushInt(0)
  789. END
  790. ELSE
  791. clsI := SymTab.ClassOf(it);
  792. IF (it
  793. # SymTab.InvalidType)
  794. & (clsI # SymTab.ClInt)
  795. & (clsI # SymTab.ClChar)
  796. & (clsI # SymTab.ClEnum)
  797. & (clsI
  798. # SymTab.ClBool) THEN
  799. SemError(218);
  800. t := SymTab.InvalidType;
  801. MGen.Drop;
  802. IF doLoad THEN
  803. MGen.Drop; MGen.PushInt(0)
  804. END
  805. ELSE
  806. loA := SymTab.ArrayLo(t);
  807. elemT := SymTab.ArrayElem(t);
  808. esl := SymTab.TypeSlots(elemT);
  809. IF esl = 0 THEN
  810. SemError(230);
  811. esl := 1
  812. END;
  813. IF (SymTab.ClassOf(elemT)
  814. = SymTab.ClChar)
  815. OR (SymTab.ClassOf(elemT)
  816. = SymTab.ClBool) THEN
  817. ebytes := 1
  818. ELSE ebytes := esl * 8
  819. END;
  820. MGen.IdxScale(loA, ebytes);
  821. t := elemT
  822. END
  823. END;;
  824. END;
  825. Expect(24);
  826. ELSE
  827. Get;
  828. firstT := ~sfx;
  829. sfx := TRUE; lx[0] := 0C;
  830. IF ~doLoad & firstT THEN
  831. IF (k = SymTab.KindVar)
  832. OR (k = SymTab.KindParam)
  833. OR (k
  834. = SymTab.KindVarPar) THEN
  835. MGen.PushAddr(bn)
  836. ELSIF k
  837. = SymTab.KindField THEN
  838. MGen.WithAddr(bn)
  839. ELSE MGen.PushInt(0)
  840. END
  841. END;;
  842. IF t = SymTab.InvalidType THEN
  843. IF doLoad THEN
  844. MGen.Drop; MGen.PushInt(0)
  845. ELSIF firstT THEN
  846. MGen.Drop
  847. END
  848. ELSIF SymTab.ClassOf(t) #
  849. SymTab.ClPtr THEN
  850. SemError(219);
  851. t := SymTab.InvalidType;
  852. IF doLoad THEN
  853. MGen.Drop; MGen.PushInt(0)
  854. ELSIF firstT THEN
  855. MGen.Drop
  856. END
  857. ELSE
  858. elemT := SymTab.PtrBase(t);
  859. t := elemT;
  860. IF doLoad THEN
  861. IF ~(firstT
  862. & ((k
  863. = SymTab.KindVar)
  864. OR (k
  865. = SymTab.KindParam)
  866. OR (k
  867. = SymTab.KindVarPar)))
  868. THEN
  869. MGen.LoadIndir
  870. END
  871. ELSE
  872. MGen.LoadIndir
  873. END
  874. END;;
  875. END;
  876. END;
  877. END DesignTail;
  878. PROCEDURE DesignHead (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  879. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr);
  880. VAR n: SymTab.Name;
  881. cls: INTEGER;
  882. BEGIN
  883. GetIdent(n);
  884. MGen.CopyName(n, bn);
  885. lx[0] := 0C;
  886. IF ~SymTab.Lookup(n) THEN
  887. SemError(201);
  888. t := SymTab.InvalidType; k := -1;
  889. IF doLoad THEN
  890. MGen.PushInt(0)
  891. END
  892. ELSE
  893. t := SymTab.SymType(n);
  894. k := SymTab.SymKind(n);
  895. IF k = SymTab.KindConst THEN
  896. IF SymTab.Equal(n, "TRUE") THEN
  897. t := SymTab.BoolType();
  898. MGen.CopyName("TRUE", lx);
  899. IF doLoad THEN
  900. MGen.PushInt(1)
  901. END
  902. ELSIF SymTab.Equal(n,
  903. "FALSE") THEN
  904. t := SymTab.BoolType();
  905. MGen.CopyName("FALSE", lx);
  906. IF doLoad THEN
  907. MGen.PushInt(0)
  908. END
  909. ELSE
  910. cls :=
  911. SymTab.ClassOf(t);
  912. IF (t #
  913. SymTab.InvalidType)
  914. & (cls # SymTab.ClStr)
  915. & ((cls = SymTab.ClInt)
  916. OR (cls = SymTab.ClReal)
  917. OR (cls = SymTab.ClBool)
  918. OR (cls = SymTab.ClChar)
  919. OR (cls
  920. = SymTab.ClEnum)) THEN
  921. IF doLoad THEN
  922. MGen.LoadVar(n)
  923. END
  924. ELSIF doLoad THEN
  925. MGen.PushInt(0)
  926. END
  927. END
  928. ELSIF (k = SymTab.KindVar)
  929. OR (k = SymTab.KindParam)
  930. OR (k
  931. = SymTab.KindVarPar) THEN
  932. cls := SymTab.ClassOf(t);
  933. IF (cls = SymTab.ClInt)
  934. OR (cls = SymTab.ClReal)
  935. OR (cls = SymTab.ClBool)
  936. OR (cls = SymTab.ClChar)
  937. OR (cls
  938. = SymTab.ClEnum)
  939. OR (cls
  940. = SymTab.ClSet)
  941. OR (cls
  942. = SymTab.ClPtr) THEN
  943. IF doLoad THEN
  944. MGen.PushVar(n)
  945. END
  946. ELSIF (cls
  947. = SymTab.ClArray)
  948. OR (cls
  949. = SymTab.ClRecord) THEN
  950. IF doLoad THEN
  951. MGen.PushAddr(n)
  952. END
  953. ELSIF t
  954. = SymTab.InvalidType THEN
  955. IF doLoad THEN
  956. MGen.PushInt(0)
  957. END
  958. ELSE SemError(230);
  959. IF doLoad THEN
  960. MGen.PushInt(0)
  961. END
  962. END
  963. ELSE
  964. IF doLoad THEN
  965. IF k = SymTab.KindField THEN
  966. MGen.WithAddr(n);
  967. cls := SymTab.ClassOf(t);
  968. IF (t
  969. = SymTab.InvalidType)
  970. OR (cls
  971. = SymTab.ClArray)
  972. OR (cls
  973. = SymTab.ClRecord) THEN
  974. ELSE
  975. IF (cls
  976. = SymTab.ClChar)
  977. OR (cls
  978. = SymTab.ClBool) THEN
  979. MGen.LoadByte
  980. ELSE MGen.LoadIndir
  981. END
  982. END
  983. ELSE MGen.PushInt(0)
  984. END
  985. END;
  986. IF k = SymTab.KindField THEN
  987. ELSIF k
  988. = SymTab.KindImport THEN
  989. SemError(230)
  990. END
  991. END
  992. END;;
  993. END DesignHead;
  994. PROCEDURE DispStat;
  995. VAR dt: SymTab.TypeIndex;
  996. dk: INTEGER;
  997. bnD: SymTab.Name;
  998. lxD: MGen.LitStr;
  999. sfxD: BOOLEAN;
  1000. baseT: SymTab.TypeIndex;
  1001. slD: CARDINAL;
  1002. BEGIN
  1003. Expect(50);
  1004. Expect(19);
  1005. DesignHead(dt, dk, bnD, FALSE, lxD);
  1006. DesignTail(dt, dk, bnD, FALSE, lxD, sfxD);
  1007. Expect(20);
  1008. IF dt = SymTab.InvalidType THEN
  1009. IF sfxD THEN MGen.Drop END
  1010. ELSIF SymTab.ClassOf(dt)
  1011. # SymTab.ClPtr THEN
  1012. SemError(219);
  1013. IF sfxD THEN MGen.Drop END
  1014. ELSE
  1015. baseT := SymTab.PtrBase(dt);
  1016. slD := SymTab.TypeSlots(baseT);
  1017. IF slD = 0 THEN
  1018. SemError(230);
  1019. slD := 1
  1020. END;
  1021. IF ~sfxD THEN
  1022. IF (dk = SymTab.KindVar)
  1023. OR (dk
  1024. = SymTab.KindParam)
  1025. OR (dk
  1026. = SymTab.KindVarPar) THEN
  1027. MGen.PushAddr(bnD)
  1028. ELSIF dk
  1029. = SymTab.KindField THEN
  1030. MGen.WithAddr(bnD)
  1031. ELSE MGen.PushInt(0)
  1032. END
  1033. END;
  1034. MGen.PushBytes(slD * 8);
  1035. MGen.DeallocOp
  1036. END;;
  1037. END DispStat;
  1038. PROCEDURE NewStat;
  1039. VAR dt: SymTab.TypeIndex;
  1040. dk: INTEGER;
  1041. bnN: SymTab.Name;
  1042. lxN: MGen.LitStr;
  1043. sfxN: BOOLEAN;
  1044. baseT: SymTab.TypeIndex;
  1045. slN: CARDINAL;
  1046. BEGIN
  1047. Expect(49);
  1048. Expect(19);
  1049. DesignHead(dt, dk, bnN, FALSE, lxN);
  1050. DesignTail(dt, dk, bnN, FALSE, lxN, sfxN);
  1051. Expect(20);
  1052. IF dt = SymTab.InvalidType THEN
  1053. IF sfxN THEN MGen.Drop END
  1054. ELSIF SymTab.ClassOf(dt)
  1055. # SymTab.ClPtr THEN
  1056. SemError(219);
  1057. IF sfxN THEN MGen.Drop END
  1058. ELSE
  1059. baseT := SymTab.PtrBase(dt);
  1060. slN := SymTab.TypeSlots(baseT);
  1061. IF slN = 0 THEN
  1062. SemError(230);
  1063. slN := 1
  1064. END;
  1065. IF ~sfxN THEN
  1066. IF (dk = SymTab.KindVar)
  1067. OR (dk
  1068. = SymTab.KindParam)
  1069. OR (dk
  1070. = SymTab.KindVarPar) THEN
  1071. MGen.PushAddr(bnN)
  1072. ELSIF dk
  1073. = SymTab.KindField THEN
  1074. MGen.WithAddr(bnN)
  1075. ELSE MGen.PushInt(0)
  1076. END
  1077. END;
  1078. MGen.PushBytes(slN * 8);
  1079. MGen.AllocOp
  1080. END;;
  1081. END NewStat;
  1082. PROCEDURE ReturnStat;
  1083. VAR t: SymTab.TypeIndex;
  1084. lx: MGen.LitStr;
  1085. v: BOOLEAN;
  1086. vn: SymTab.Name;
  1087. hasE, doRet, conv: BOOLEAN;
  1088. BEGIN
  1089. Expect(48);
  1090. hasE := FALSE;;
  1091. IF In(symSet[1], sym) THEN
  1092. Expr(t, lx, v, vn);
  1093. hasE := TRUE;
  1094. doRet := FALSE;
  1095. IF ~SymTab.InProc() THEN
  1096. SemError(232)
  1097. ELSIF ~SymTab.InFunction() THEN
  1098. SemError(232)
  1099. ELSIF ~SymTab.Assignable(
  1100. t, SymTab.CurRet()) THEN
  1101. SemError(232)
  1102. ELSE doRet := TRUE
  1103. END;
  1104. conv := doRet
  1105. & SymTab.IsIntFamily(t)
  1106. & (SymTab.ClassOf(
  1107. SymTab.CurRet())
  1108. = SymTab.ClReal);
  1109. IF doRet THEN
  1110. IF conv THEN
  1111. MGen.IntToReal
  1112. END;
  1113. MGen.Leave(
  1114. SymTab.CurNPar(), TRUE)
  1115. ELSE MGen.Drop
  1116. END;;
  1117. END;
  1118. IF ~hasE THEN
  1119. IF ~SymTab.InProc() THEN
  1120. SemError(232)
  1121. ELSIF SymTab.InFunction() THEN
  1122. SemError(232)
  1123. ELSE MGen.Leave(
  1124. SymTab.CurNPar(), FALSE)
  1125. END
  1126. END;;
  1127. END ReturnStat;
  1128. PROCEDURE WithStat;
  1129. VAR dt: SymTab.TypeIndex;
  1130. dk: INTEGER;
  1131. bnW: SymTab.Name;
  1132. lxW: MGen.LitStr;
  1133. sfxW: BOOLEAN;
  1134. pushed: BOOLEAN;
  1135. BEGIN
  1136. Expect(47);
  1137. DesignHead(dt, dk, bnW, FALSE, lxW);
  1138. DesignTail(dt, dk, bnW, FALSE, lxW, sfxW);
  1139. pushed := FALSE;
  1140. IF dt = SymTab.InvalidType THEN
  1141. IF sfxW THEN MGen.Drop END
  1142. ELSIF SymTab.ClassOf(dt)
  1143. # SymTab.ClRecord THEN
  1144. SemError(215);
  1145. IF sfxW THEN MGen.Drop END
  1146. ELSE
  1147. IF ~sfxW THEN
  1148. IF (dk
  1149. = SymTab.KindVar)
  1150. OR (dk
  1151. = SymTab.KindParam)
  1152. OR (dk
  1153. = SymTab.KindVarPar) THEN
  1154. MGen.PushAddr(bnW)
  1155. ELSIF dk
  1156. = SymTab.KindField THEN
  1157. MGen.WithAddr(bnW)
  1158. ELSE MGen.PushInt(0)
  1159. END
  1160. END;
  1161. MGen.WithEnter(dt);
  1162. pushed :=
  1163. SymTab.PushRecord(dt);
  1164. IF ~pushed THEN
  1165. SemError(215)
  1166. END
  1167. END;;
  1168. Expect(40);
  1169. StatSeq;
  1170. Expect(12);
  1171. IF pushed THEN
  1172. SymTab.PopScope;
  1173. MGen.WithExit
  1174. END;;
  1175. END WithStat;
  1176. PROCEDURE ForStat;
  1177. VAR n, lv: SymTab.Name;
  1178. fk: INTEGER;
  1179. lo, hi: SymTab.TypeIndex;
  1180. lxLo, lxHi: MGen.LitStr;
  1181. vLo, vHi: BOOLEAN;
  1182. vnLo, vnHi: SymTab.Name;
  1183. byV, ht: INTEGER;
  1184. lTop, lChk, lEnd: INTEGER;
  1185. neg, storable: BOOLEAN;
  1186. BEGIN
  1187. Expect(44);
  1188. GetIdent(n);
  1189. IF ~SymTab.Lookup(n) THEN
  1190. SemError(201);
  1191. fk := -1
  1192. ELSIF (SymTab.SymKind(n) #
  1193. SymTab.KindVar)
  1194. & (SymTab.SymKind(n) #
  1195. SymTab.KindParam)
  1196. & (SymTab.SymKind(n) #
  1197. SymTab.KindVarPar)
  1198. & (SymTab.SymKind(n) #
  1199. SymTab.KindField) THEN
  1200. SemError(220);
  1201. fk := -1
  1202. ELSIF (SymTab.SymType(n) #
  1203. SymTab.InvalidType)
  1204. & ~SymTab.IsIntFamily(
  1205. SymTab.SymType(n)) THEN
  1206. SemError(220);
  1207. fk := -1
  1208. ELSE
  1209. fk := SymTab.SymKind(n)
  1210. END;
  1211. MGen.CopyName(n, lv);
  1212. storable := (fk = SymTab.KindVar)
  1213. OR (fk = SymTab.KindParam)
  1214. OR (fk = SymTab.KindVarPar);
  1215. IF storable THEN
  1216. MGen.StoreSetup(lv)
  1217. END;;
  1218. Expect(32);
  1219. Expr(lo, lxLo, vLo, vnLo);
  1220. IF (lo # SymTab.InvalidType)
  1221. & ~SymTab.IsIntFamily(lo) THEN
  1222. SemError(220) END;
  1223. IF storable THEN
  1224. MGen.StoreFinish(lv)
  1225. ELSE MGen.Drop
  1226. END;;
  1227. Expect(30);
  1228. Expr(hi, lxHi, vHi, vnHi);
  1229. IF (hi # SymTab.InvalidType)
  1230. & ~SymTab.IsIntFamily(hi) THEN
  1231. SemError(220) END;
  1232. ht := MGen.TempGlobal();
  1233. MGen.StoreTemp(ht);
  1234. byV := 1; neg := FALSE;;
  1235. IF (sym = 45) THEN
  1236. Get;
  1237. ByLit(byV);
  1238. neg := byV < 0;;
  1239. END;
  1240. Expect(40);
  1241. lTop := MGen.NewLabel();
  1242. lChk := MGen.NewLabel();
  1243. lEnd := MGen.NewLabel();
  1244. MGen.Jmp(lChk);
  1245. MGen.DefLabel(lTop);;
  1246. StatSeq;
  1247. Expect(12);
  1248. MGen.PushVar(lv);
  1249. MGen.PushInt(byV);
  1250. MGen.Add;
  1251. IF storable THEN
  1252. MGen.StoreFinish(lv)
  1253. ELSE MGen.Drop
  1254. END;
  1255. MGen.DefLabel(lChk);
  1256. MGen.PushVar(lv);
  1257. MGen.LoadTemp(ht);
  1258. IF neg THEN MGen.IGe
  1259. ELSE MGen.ILe END;
  1260. MGen.Jz(lEnd);
  1261. MGen.Jmp(lTop);
  1262. MGen.DefLabel(lEnd);;
  1263. END ForStat;
  1264. PROCEDURE LoopStat;
  1265. VAR topL, exitL: INTEGER;
  1266. BEGIN
  1267. Expect(43);
  1268. topL := MGen.NewLabel();
  1269. exitL := MGen.NewLabel();
  1270. MGen.DefLabel(topL);
  1271. MGen.PushLoop(exitL);;
  1272. StatSeq;
  1273. Expect(12);
  1274. MGen.Jmp(topL);
  1275. MGen.DefLabel(exitL);
  1276. MGen.PopLoop;;
  1277. END LoopStat;
  1278. PROCEDURE RepeatStat;
  1279. VAR t: SymTab.TypeIndex;
  1280. lxC: MGen.LitStr;
  1281. vC: BOOLEAN;
  1282. vnC: SymTab.Name;
  1283. topL: INTEGER;
  1284. BEGIN
  1285. Expect(41);
  1286. topL := MGen.NewLabel();
  1287. MGen.DefLabel(topL);;
  1288. StatSeq;
  1289. Expect(42);
  1290. Expr(t, lxC, vC, vnC);
  1291. IF ~SymTab.BoolCheck(t) THEN
  1292. SemError(214) END;
  1293. MGen.Jz(topL);;
  1294. END RepeatStat;
  1295. PROCEDURE WhileStat;
  1296. VAR t: SymTab.TypeIndex;
  1297. lxC: MGen.LitStr;
  1298. vC: BOOLEAN;
  1299. vnC: SymTab.Name;
  1300. topL, endL: INTEGER;
  1301. BEGIN
  1302. Expect(39);
  1303. topL := MGen.NewLabel();
  1304. endL := MGen.NewLabel();
  1305. MGen.DefLabel(topL);;
  1306. Expr(t, lxC, vC, vnC);
  1307. IF ~SymTab.BoolCheck(t) THEN
  1308. SemError(214) END;
  1309. MGen.Jz(endL);;
  1310. Expect(40);
  1311. StatSeq;
  1312. Expect(12);
  1313. MGen.Jmp(topL);
  1314. MGen.DefLabel(endL);;
  1315. END WhileStat;
  1316. PROCEDURE CaseStat;
  1317. VAR st: SymTab.TypeIndex;
  1318. lxS: MGen.LitStr;
  1319. vS: BOOLEAN;
  1320. vnS: SymTab.Name;
  1321. tmp, endL: INTEGER;
  1322. BEGIN
  1323. Expect(37);
  1324. Expr(st, lxS, vS, vnS);
  1325. tmp := MGen.TempGlobal();
  1326. MGen.StoreTemp(tmp);
  1327. endL := MGen.NewLabel();;
  1328. Expect(26);
  1329. Case(st, tmp, endL);
  1330. WHILE (sym = 38) DO
  1331. Get;
  1332. Case(st, tmp, endL);
  1333. END;
  1334. IF (sym = 36) THEN
  1335. Get;
  1336. StatSeq;
  1337. END;
  1338. Expect(12);
  1339. MGen.DefLabel(endL);;
  1340. END CaseStat;
  1341. PROCEDURE IfStat;
  1342. VAR t: SymTab.TypeIndex;
  1343. lxC: MGen.LitStr;
  1344. vC: BOOLEAN;
  1345. vnC: SymTab.Name;
  1346. elseL, endL: INTEGER;
  1347. hasElse: BOOLEAN;
  1348. BEGIN
  1349. Expect(33);
  1350. Expr(t, lxC, vC, vnC);
  1351. IF ~SymTab.BoolCheck(t) THEN
  1352. SemError(214) END;
  1353. elseL := MGen.NewLabel();
  1354. endL := MGen.NewLabel();
  1355. MGen.Jz(elseL);
  1356. hasElse := FALSE;;
  1357. Expect(34);
  1358. StatSeq;
  1359. WHILE (sym = 35) DO
  1360. Get;
  1361. MGen.Jmp(endL);
  1362. MGen.DefLabel(elseL);;
  1363. Expr(t, lxC, vC, vnC);
  1364. IF ~SymTab.BoolCheck(t) THEN
  1365. SemError(214) END;
  1366. elseL := MGen.NewLabel();
  1367. MGen.Jz(elseL);;
  1368. Expect(34);
  1369. StatSeq;
  1370. END;
  1371. IF (sym = 36) THEN
  1372. Get;
  1373. MGen.Jmp(endL);
  1374. MGen.DefLabel(elseL);
  1375. hasElse := TRUE;;
  1376. StatSeq;
  1377. END;
  1378. Expect(12);
  1379. IF ~hasElse THEN
  1380. MGen.DefLabel(elseL)
  1381. END;
  1382. MGen.DefLabel(endL);;
  1383. END IfStat;
  1384. PROCEDURE AssignOrCall;
  1385. VAR dt, et: SymTab.TypeIndex;
  1386. dk: INTEGER;
  1387. bn: SymTab.Name;
  1388. lxD, lxe: MGen.LitStr;
  1389. vE: BOOLEAN;
  1390. vnE: SymTab.Name;
  1391. sfx: BOOLEAN;
  1392. okC: BOOLEAN;
  1393. isR, conv,
  1394. storable, pushedDst,
  1395. pushedFld: BOOLEAN;
  1396. dstBytes, srcBytes: CARDINAL;
  1397. elemDt: SymTab.TypeIndex;
  1398. BEGIN
  1399. sfx := FALSE; pushedDst := FALSE;
  1400. pushedFld := FALSE;;
  1401. DesignHead(dt, dk, bn, FALSE, lxD);
  1402. IF (sym = 7) OR (sym = 22) OR (sym = 32) OR (sym = 51) THEN
  1403. DesignTail(dt, dk, bn, FALSE, lxD, sfx);
  1404. Expect(32);
  1405. storable :=
  1406. (dk = SymTab.KindVar)
  1407. OR (dk = SymTab.KindParam)
  1408. OR (dk = SymTab.KindVarPar);
  1409. IF (dk = SymTab.KindField)
  1410. & (~sfx)
  1411. & (dt # SymTab.InvalidType) THEN
  1412. MGen.WithAddr(bn);
  1413. pushedFld := TRUE
  1414. END;
  1415. IF storable & ~sfx
  1416. & (dt # SymTab.InvalidType)
  1417. & (SymTab.ClassOf(dt)
  1418. = SymTab.ClArray) THEN
  1419. elemDt := SymTab.ArrayElem(dt);
  1420. IF SymTab.ClassOf(elemDt)
  1421. = SymTab.ClChar THEN
  1422. MGen.PushAddr(bn);
  1423. pushedDst := TRUE
  1424. END
  1425. END;
  1426. IF storable & ~sfx
  1427. & ~pushedDst THEN
  1428. IF (dt # SymTab.InvalidType)
  1429. & (SymTab.TypeSlots(dt)
  1430. > 1) THEN
  1431. ELSE MGen.StoreSetup(bn)
  1432. END
  1433. END;;
  1434. Expr(et, lxe, vE, vnE);
  1435. IF (dt # SymTab.InvalidType)
  1436. & (dk # SymTab.KindVar)
  1437. & (dk # SymTab.KindParam)
  1438. & (dk # SymTab.KindVarPar)
  1439. & (dk # SymTab.KindField)
  1440. & (dk # SymTab.KindImport) THEN
  1441. SemError(210)
  1442. ELSIF pushedDst THEN
  1443. IF et = SymTab.InvalidType THEN
  1444. MGen.Drop; MGen.Drop
  1445. ELSIF (SymTab.ClassOf(et)
  1446. # SymTab.ClStr) THEN
  1447. SemError(230);
  1448. MGen.Drop; MGen.Drop
  1449. ELSE
  1450. srcBytes :=
  1451. MGen.StrLenOf(lxe) + 1;
  1452. dstBytes :=
  1453. SymTab.TypeSlots(dt) * 8;
  1454. IF srcBytes > dstBytes THEN
  1455. SemError(210);
  1456. MGen.Drop; MGen.Drop
  1457. ELSE
  1458. MGen.PushBytes(srcBytes);
  1459. MGen.CopyBlock
  1460. END
  1461. END
  1462. ELSIF pushedFld THEN
  1463. IF et = SymTab.InvalidType THEN
  1464. MGen.Drop; MGen.Drop
  1465. ELSIF (SymTab.TypeSlots(dt) > 1) THEN
  1466. IF (SymTab.ClassOf(dt)
  1467. = SymTab.ClArray)
  1468. & (SymTab.ClassOf(
  1469. SymTab.ArrayElem(dt))
  1470. = SymTab.ClChar)
  1471. & (SymTab.ClassOf(et)
  1472. = SymTab.ClStr) THEN
  1473. srcBytes :=
  1474. MGen.StrLenOf(lxe) + 1;
  1475. dstBytes :=
  1476. SymTab.TypeSlots(dt) * 8;
  1477. IF srcBytes > dstBytes THEN
  1478. SemError(210);
  1479. MGen.Drop; MGen.Drop
  1480. ELSE
  1481. MGen.PushBytes(srcBytes);
  1482. MGen.CopyBlock
  1483. END
  1484. ELSIF ~SymTab.Assignable(et,
  1485. dt) THEN
  1486. SemError(210);
  1487. MGen.Drop; MGen.Drop
  1488. ELSE
  1489. SemError(230);
  1490. MGen.Drop; MGen.Drop
  1491. END
  1492. ELSE
  1493. IF ~SymTab.Assignable(et,
  1494. dt) THEN
  1495. SemError(210);
  1496. MGen.Drop; MGen.Drop
  1497. ELSE
  1498. isR :=
  1499. (SymTab.ClassOf(dt)
  1500. = SymTab.ClReal);
  1501. conv := isR
  1502. & SymTab.IsIntFamily(et);
  1503. IF conv THEN
  1504. MGen.IntToReal
  1505. END;
  1506. IF (SymTab.ClassOf(dt)
  1507. = SymTab.ClChar)
  1508. OR (SymTab.ClassOf(dt)
  1509. = SymTab.ClBool) THEN
  1510. MGen.StoreByte
  1511. ELSE MGen.StoreIndir0
  1512. END
  1513. END
  1514. END
  1515. ELSIF (dt # SymTab.InvalidType)
  1516. & ~sfx
  1517. & (SymTab.TypeSlots(dt) > 1) THEN
  1518. IF ~SymTab.Assignable(et, dt) THEN
  1519. SemError(210)
  1520. ELSE SemError(230)
  1521. END
  1522. ELSIF ~SymTab.Assignable(et, dt) THEN
  1523. SemError(210) END;
  1524. IF dk = SymTab.KindImport THEN
  1525. SemError(230)
  1526. END;
  1527. isR := (dt # SymTab.InvalidType)
  1528. & ~pushedDst
  1529. & ~pushedFld
  1530. & (SymTab.ClassOf(dt)
  1531. = SymTab.ClReal);
  1532. conv := isR
  1533. & SymTab.IsIntFamily(et);
  1534. IF pushedDst THEN
  1535. ELSIF pushedFld THEN
  1536. ELSIF (dt # SymTab.InvalidType)
  1537. & sfx THEN
  1538. IF conv THEN
  1539. MGen.IntToReal
  1540. END;
  1541. IF (SymTab.ClassOf(dt)
  1542. = SymTab.ClChar)
  1543. OR (SymTab.ClassOf(dt)
  1544. = SymTab.ClBool) THEN
  1545. MGen.StoreByte
  1546. ELSE MGen.StoreIndir0
  1547. END
  1548. ELSIF storable & ~sfx THEN
  1549. IF (dt # SymTab.InvalidType)
  1550. & (SymTab.TypeSlots(dt)
  1551. > 1) THEN
  1552. MGen.Drop
  1553. ELSE
  1554. IF conv THEN
  1555. MGen.IntToReal
  1556. END;
  1557. MGen.StoreFinish(bn)
  1558. END
  1559. ELSE MGen.Drop
  1560. END;;
  1561. ELSIF (sym = 19) THEN
  1562. CallTail(bn, sfx, FALSE, okC, FALSE);
  1563. ELSIF In(symSet[3], sym) THEN
  1564. MGen.ActBegin(bn);
  1565. IF MGen.ActEnd(bn, FALSE, FALSE) # 0 THEN
  1566. SemError(233)
  1567. END;;
  1568. ELSE SynError(77);
  1569. END;
  1570. END AssignOrCall;
  1571. PROCEDURE Stat;
  1572. VAR lx: INTEGER;
  1573. BEGIN
  1574. IF In(symSet[4], sym) THEN
  1575. CASE sym OF
  1576. 1 :
  1577. AssignOrCall;
  1578. | 33 :
  1579. IfStat;
  1580. | 37 :
  1581. CaseStat;
  1582. | 39 :
  1583. WhileStat;
  1584. | 41 :
  1585. RepeatStat;
  1586. | 43 :
  1587. LoopStat;
  1588. | 44 :
  1589. ForStat;
  1590. | 47 :
  1591. WithStat;
  1592. | 48 :
  1593. ReturnStat;
  1594. | 49 :
  1595. NewStat;
  1596. | 50 :
  1597. DispStat;
  1598. | 31 :
  1599. Get;
  1600. IF MGen.TopLoop(lx) THEN
  1601. MGen.Jmp(lx)
  1602. ELSE SemError(230) END;;
  1603. END;
  1604. END;
  1605. END Stat;
  1606. PROCEDURE FieldIdents (rt: SymTab.TypeIndex);
  1607. VAR n: SymTab.Name;
  1608. BEGIN
  1609. GetIdent(n);
  1610. IF ~SymTab.FieldPending(rt, n)
  1611. THEN SemError(200) END;
  1612. WHILE (sym = 10) DO
  1613. Get;
  1614. GetIdent(n);
  1615. IF ~SymTab.FieldPending(rt, n)
  1616. THEN SemError(200) END;
  1617. END;
  1618. END FieldIdents;
  1619. PROCEDURE Field (rt: SymTab.TypeIndex);
  1620. VAR et: SymTab.TypeIndex;
  1621. BEGIN
  1622. IF (sym = 1) THEN
  1623. FieldIdents(rt);
  1624. Expect(17);
  1625. Type(et);
  1626. SymTab.FixPendingF(rt, et);;
  1627. END;
  1628. END Field;
  1629. PROCEDURE FieldSeq (rt: SymTab.TypeIndex);
  1630. BEGIN
  1631. Field(rt);
  1632. WHILE (sym = 6) DO
  1633. Get;
  1634. Field(rt);
  1635. END;
  1636. END FieldSeq;
  1637. PROCEDURE Enum (VAR t: SymTab.TypeIndex);
  1638. VAR n: SymTab.Name;
  1639. ord: INTEGER;
  1640. BEGIN
  1641. Expect(19);
  1642. t := SymTab.NewEnum();
  1643. ord := 0;;
  1644. GetIdent(n);
  1645. IF ~SymTab.Enter(n,
  1646. SymTab.KindConst)
  1647. THEN SemError(200) END;
  1648. SymTab.SetSymType(n, t);
  1649. SymTab.EnumAdd(t);
  1650. MGen.DeclConstInt(n, ord);
  1651. INC(ord);;
  1652. WHILE (sym = 10) DO
  1653. Get;
  1654. GetIdent(n);
  1655. IF ~SymTab.Enter(n,
  1656. SymTab.KindConst)
  1657. THEN SemError(200) END;
  1658. SymTab.SetSymType(n, t);
  1659. SymTab.EnumAdd(t);
  1660. MGen.DeclConstInt(n, ord);
  1661. INC(ord);;
  1662. END;
  1663. Expect(20);
  1664. END Enum;
  1665. PROCEDURE PointerType (VAR t: SymTab.TypeIndex);
  1666. VAR b: SymTab.TypeIndex;
  1667. BEGIN
  1668. Expect(29);
  1669. Expect(30);
  1670. Type(b);
  1671. t := SymTab.NewPtr(b);;
  1672. END PointerType;
  1673. PROCEDURE SetType (VAR t: SymTab.TypeIndex);
  1674. VAR s: SymTab.TypeIndex;
  1675. BEGIN
  1676. Expect(28);
  1677. Expect(26);
  1678. SimpleType(s);
  1679. IF (s # SymTab.InvalidType)
  1680. & (SymTab.ClassOf(s) #
  1681. SymTab.ClInt)
  1682. & (SymTab.ClassOf(s) #
  1683. SymTab.ClChar)
  1684. & (SymTab.ClassOf(s) #
  1685. SymTab.ClEnum) THEN
  1686. SemError(224) END;
  1687. t := SymTab.NewSet(s);;
  1688. END SetType;
  1689. PROCEDURE RecordType (VAR t: SymTab.TypeIndex);
  1690. BEGIN
  1691. Expect(27);
  1692. t := SymTab.NewRecord();;
  1693. FieldSeq(t);
  1694. Expect(12);
  1695. END RecordType;
  1696. PROCEDURE ArrayType (VAR t: SymTab.TypeIndex);
  1697. VAR s, s2, e: SymTab.TypeIndex;
  1698. idx: ARRAY [0 .. 7] OF
  1699. SymTab.TypeIndex;
  1700. nc, kk: CARDINAL;
  1701. loA, hiA: INTEGER;
  1702. BEGIN
  1703. Expect(25);
  1704. SimpleType(s);
  1705. IF (s # SymTab.InvalidType)
  1706. & (SymTab.ClassOf(s) #
  1707. SymTab.ClInt)
  1708. & (SymTab.ClassOf(s) #
  1709. SymTab.ClChar)
  1710. & (SymTab.ClassOf(s) #
  1711. SymTab.ClEnum) THEN
  1712. SemError(224) END;
  1713. nc := 0;
  1714. idx[nc] := s; INC(nc);;
  1715. WHILE (sym = 10) DO
  1716. Get;
  1717. SimpleType(s2);
  1718. IF (s2 # SymTab.InvalidType)
  1719. & (SymTab.ClassOf(s2) #
  1720. SymTab.ClInt)
  1721. & (SymTab.ClassOf(s2) #
  1722. SymTab.ClChar)
  1723. & (SymTab.ClassOf(s2) #
  1724. SymTab.ClEnum) THEN
  1725. SemError(224) END;
  1726. IF nc <= HIGH(idx) THEN
  1727. idx[nc] := s2; INC(nc)
  1728. END;;
  1729. END;
  1730. Expect(26);
  1731. Type(e);
  1732. t := e;
  1733. kk := nc;
  1734. WHILE kk > 0 DO
  1735. DEC(kk);
  1736. loA := SymTab.TypeLo(idx[kk]);
  1737. hiA := SymTab.TypeHi(idx[kk]);
  1738. IF SymTab.TypeLen(idx[kk]) = 0 THEN
  1739. IF idx[kk]
  1740. # SymTab.InvalidType THEN
  1741. SemError(230)
  1742. END;
  1743. loA := 0; hiA := -1
  1744. END;
  1745. t := SymTab.NewArrayB(t,
  1746. loA, hiA)
  1747. END;;
  1748. END ArrayType;
  1749. PROCEDURE SimpleType (VAR t: SymTab.TypeIndex);
  1750. VAR t1, t2: SymTab.TypeIndex;
  1751. lx1, lx2: MGen.LitStr;
  1752. vD: BOOLEAN;
  1753. vnD: SymTab.Name;
  1754. loI, hiI: INTEGER;
  1755. lok, hik: BOOLEAN;
  1756. BEGIN
  1757. IF (sym = 1) THEN
  1758. QualIdent(t);
  1759. IF (sym = 22) THEN
  1760. Get;
  1761. MGen.NoEmitEnter; lok := FALSE; hik := FALSE;
  1762. loI := 0; hiI := -1;;
  1763. ConstExpr(t1, lx1);
  1764. IF (t1 # SymTab.InvalidType)
  1765. & (SymTab.ClassOf(t1) #
  1766. SymTab.ClInt)
  1767. & (SymTab.ClassOf(t1) #
  1768. SymTab.ClChar)
  1769. & (SymTab.ClassOf(t1) #
  1770. SymTab.ClEnum) THEN
  1771. SemError(224) END;;
  1772. Expect(23);
  1773. ConstExpr(t2, lx2);
  1774. IF (t2 # SymTab.InvalidType)
  1775. & (SymTab.ClassOf(t2) #
  1776. SymTab.ClInt)
  1777. & (SymTab.ClassOf(t2) #
  1778. SymTab.ClChar)
  1779. & (SymTab.ClassOf(t2) #
  1780. SymTab.ClEnum) THEN
  1781. SemError(224) END;;
  1782. Expect(24);
  1783. IF (t1 # SymTab.InvalidType)
  1784. & (t2 # SymTab.InvalidType) THEN
  1785. IF MGen.IsLit(lx1) THEN
  1786. IF SymTab.ClassOf(t1)
  1787. = SymTab.ClChar THEN
  1788. loI := MGen.CharOrd(lx1);
  1789. lok := TRUE
  1790. ELSIF MGen.ParseInt(lx1, loI) THEN
  1791. lok := TRUE
  1792. END
  1793. END;
  1794. IF MGen.IsLit(lx2) THEN
  1795. IF SymTab.ClassOf(t2)
  1796. = SymTab.ClChar THEN
  1797. hiI := MGen.CharOrd(lx2);
  1798. hik := TRUE
  1799. ELSIF MGen.ParseInt(lx2, hiI) THEN
  1800. hik := TRUE
  1801. END
  1802. END
  1803. END;
  1804. IF lok & hik THEN
  1805. t := SymTab.NewSubB(t1, loI, hiI)
  1806. ELSE
  1807. t := SymTab.NewSub(t1);
  1808. IF (t1 # SymTab.InvalidType)
  1809. & (t2 # SymTab.InvalidType) THEN
  1810. SemError(230)
  1811. END
  1812. END;
  1813. MGen.NoEmitExit;;
  1814. END;
  1815. ELSIF (sym = 22) THEN
  1816. Get;
  1817. MGen.NoEmitEnter; lok := FALSE;
  1818. hik := FALSE; loI := 0; hiI := -1;;
  1819. ConstExpr(t1, lx1);
  1820. IF (t1 # SymTab.InvalidType)
  1821. & (SymTab.ClassOf(t1) #
  1822. SymTab.ClInt)
  1823. & (SymTab.ClassOf(t1) #
  1824. SymTab.ClChar)
  1825. & (SymTab.ClassOf(t1) #
  1826. SymTab.ClEnum) THEN
  1827. SemError(224) END;;
  1828. Expect(23);
  1829. ConstExpr(t2, lx2);
  1830. IF (t2 # SymTab.InvalidType)
  1831. & (SymTab.ClassOf(t2) #
  1832. SymTab.ClInt)
  1833. & (SymTab.ClassOf(t2) #
  1834. SymTab.ClChar)
  1835. & (SymTab.ClassOf(t2) #
  1836. SymTab.ClEnum) THEN
  1837. SemError(224) END;;
  1838. Expect(24);
  1839. IF (t1 # SymTab.InvalidType)
  1840. & (t2 # SymTab.InvalidType) THEN
  1841. IF MGen.IsLit(lx1) THEN
  1842. IF SymTab.ClassOf(t1)
  1843. = SymTab.ClChar THEN
  1844. loI := MGen.CharOrd(lx1);
  1845. lok := TRUE
  1846. ELSIF MGen.ParseInt(lx1,
  1847. loI) THEN
  1848. lok := TRUE
  1849. END
  1850. END;
  1851. IF MGen.IsLit(lx2) THEN
  1852. IF SymTab.ClassOf(t2)
  1853. = SymTab.ClChar THEN
  1854. hiI := MGen.CharOrd(lx2);
  1855. hik := TRUE
  1856. ELSIF MGen.ParseInt(lx2,
  1857. hiI) THEN
  1858. hik := TRUE
  1859. END
  1860. END
  1861. END;
  1862. IF lok & hik THEN
  1863. t := SymTab.NewSubB(t1, loI, hiI)
  1864. ELSE
  1865. t := SymTab.NewSub(t1);
  1866. IF (t1 # SymTab.InvalidType)
  1867. & (t2 # SymTab.InvalidType) THEN
  1868. SemError(230)
  1869. END
  1870. END;
  1871. MGen.NoEmitExit;;
  1872. ELSIF (sym = 19) THEN
  1873. Enum(t);
  1874. ELSE SynError(78);
  1875. END;
  1876. END SimpleType;
  1877. PROCEDURE FPSection;
  1878. VAR isV: BOOLEAN;
  1879. nn, i: CARDINAL;
  1880. pn: ARRAY [0 .. 15] OF SymTab.Name;
  1881. n: SymTab.Name;
  1882. t: SymTab.TypeIndex;
  1883. BEGIN
  1884. isV := FALSE; nn := 0;;
  1885. IF (sym = 15) THEN
  1886. Get;
  1887. isV := TRUE;;
  1888. END;
  1889. GetIdent(n);
  1890. IF nn <= HIGH(pn) THEN
  1891. MGen.CopyName(n, pn[nn])
  1892. END;
  1893. INC(nn);;
  1894. WHILE (sym = 10) DO
  1895. Get;
  1896. GetIdent(n);
  1897. IF nn <= HIGH(pn) THEN
  1898. MGen.CopyName(n, pn[nn])
  1899. END;
  1900. INC(nn);;
  1901. END;
  1902. Expect(17);
  1903. Type(t);
  1904. IF ~isV
  1905. & (t # SymTab.InvalidType)
  1906. & (SymTab.TypeSlots(t) > 1) THEN
  1907. SemError(230)
  1908. END;
  1909. i := 0;
  1910. WHILE i < nn DO
  1911. IF i <= HIGH(pn) THEN
  1912. IF ~SymTab.EnterParam(
  1913. pn[i], isV, t) THEN
  1914. SemError(200)
  1915. END
  1916. END;
  1917. INC(i)
  1918. END;;
  1919. END FPSection;
  1920. PROCEDURE QualIdent (VAR t: SymTab.TypeIndex);
  1921. VAR n, m: SymTab.Name;
  1922. BEGIN
  1923. GetIdent(n);
  1924. IF ~SymTab.Lookup(n) THEN
  1925. SemError(201);
  1926. t := SymTab.InvalidType
  1927. ELSIF (SymTab.SymKind(n) #
  1928. SymTab.KindType)
  1929. & (SymTab.SymKind(n) #
  1930. SymTab.KindPredef)
  1931. & (SymTab.SymKind(n) #
  1932. SymTab.KindImport) THEN
  1933. SemError(221);
  1934. t := SymTab.InvalidType
  1935. ELSE t := SymTab.SymType(n) END;;
  1936. WHILE (sym = 7) DO
  1937. Get;
  1938. GetIdent(m);
  1939. t := SymTab.InvalidType;;
  1940. END;
  1941. END QualIdent;
  1942. PROCEDURE FormalParams;
  1943. BEGIN
  1944. FPSection;
  1945. WHILE (sym = 6) DO
  1946. Get;
  1947. FPSection;
  1948. END;
  1949. END FormalParams;
  1950. PROCEDURE VarIdents;
  1951. VAR n: SymTab.Name;
  1952. BEGIN
  1953. GetIdent(n);
  1954. IF ~SymTab.EnterPending(n,
  1955. SymTab.KindVar)
  1956. THEN SemError(200) END;
  1957. WHILE (sym = 10) DO
  1958. Get;
  1959. GetIdent(n);
  1960. IF ~SymTab.EnterPending(n,
  1961. SymTab.KindVar)
  1962. THEN SemError(200) END;
  1963. END;
  1964. END VarIdents;
  1965. PROCEDURE Type (VAR t: SymTab.TypeIndex);
  1966. BEGIN
  1967. IF (sym = 1) OR (sym = 19) OR (sym = 22) THEN
  1968. SimpleType(t);
  1969. ELSIF (sym = 25) THEN
  1970. ArrayType(t);
  1971. ELSIF (sym = 27) THEN
  1972. RecordType(t);
  1973. ELSIF (sym = 28) THEN
  1974. SetType(t);
  1975. ELSIF (sym = 29) THEN
  1976. PointerType(t);
  1977. ELSE SynError(79);
  1978. END;
  1979. END Type;
  1980. PROCEDURE Expr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  1981. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  1982. VAR t2: SymTab.TypeIndex;
  1983. tc, op: INTEGER;
  1984. lx2: MGen.LitStr;
  1985. v2: BOOLEAN;
  1986. vn2: SymTab.Name;
  1987. r: BOOLEAN;
  1988. BEGIN
  1989. SimExpr(t, lx, v, vn);
  1990. IF In(symSet[5], sym) THEN
  1991. Rel(op);
  1992. SimExpr(t2, lx2, v2, vn2);
  1993. lx[0] := 0C; v := FALSE;
  1994. IF op = SymTab.OpIn THEN
  1995. IF SymTab.InCheck(t, t2) THEN
  1996. t := SymTab.BoolType();
  1997. MGen.BitIn
  1998. ELSE SemError(222);
  1999. t := SymTab.InvalidType;
  2000. MGen.Drop; MGen.Drop; MGen.PushInt(0)
  2001. END
  2002. ELSIF (t # SymTab.InvalidType)
  2003. & (t2 # SymTab.InvalidType)
  2004. & ((SymTab.ClassOf(t) = SymTab.ClArray)
  2005. OR (SymTab.ClassOf(t) = SymTab.ClRecord)
  2006. OR (SymTab.ClassOf(t2) = SymTab.ClArray)
  2007. OR (SymTab.ClassOf(t2) = SymTab.ClRecord)) THEN
  2008. SemError(213); t := SymTab.InvalidType;
  2009. MGen.Drop; MGen.Drop; MGen.PushInt(0)
  2010. ELSE
  2011. tc := SymTab.ClassOf(t);
  2012. IF SymTab.RelCheck(t, t2, op) THEN
  2013. t := SymTab.BoolType()
  2014. ELSE SemError(213); t := SymTab.InvalidType END;
  2015. IF t # SymTab.InvalidType THEN
  2016. r := tc = SymTab.ClReal;
  2017. IF r THEN
  2018. IF op = SymTab.OpEq THEN MGen.RealEq
  2019. ELSIF (op = SymTab.OpNeq1)
  2020. OR (op = SymTab.OpNeq2) THEN MGen.RealNe
  2021. ELSIF op = SymTab.OpLt THEN MGen.RealLt
  2022. ELSIF op = SymTab.OpLe THEN MGen.RealLe
  2023. ELSIF op = SymTab.OpGt THEN MGen.RealGt
  2024. ELSE MGen.RealGe END
  2025. ELSE
  2026. IF op = SymTab.OpEq THEN MGen.Eq
  2027. ELSIF (op = SymTab.OpNeq1)
  2028. OR (op = SymTab.OpNeq2) THEN MGen.Neq
  2029. ELSIF op = SymTab.OpLt THEN MGen.ILt
  2030. ELSIF op = SymTab.OpLe THEN MGen.ILe
  2031. ELSIF op = SymTab.OpGt THEN MGen.IGt
  2032. ELSE MGen.IGe END
  2033. END
  2034. ELSE MGen.Drop; MGen.Drop; MGen.PushInt(0)
  2035. END
  2036. END;;
  2037. END;
  2038. END Expr;
  2039. PROCEDURE ConstExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr);
  2040. VAR vD: BOOLEAN;
  2041. vnD: SymTab.Name;
  2042. BEGIN
  2043. Expr(t, lx, vD, vnD);
  2044. END ConstExpr;
  2045. PROCEDURE ProcedureDecl;
  2046. VAR n, m: SymTab.Name;
  2047. rt: SymTab.TypeIndex;
  2048. hasR, ok: BOOLEAN;
  2049. endL: INTEGER;
  2050. BEGIN
  2051. Expect(18);
  2052. hasR := FALSE;;
  2053. GetIdent(n);
  2054. IF SymTab.IsForward(n) THEN
  2055. SymTab.ReuseProc(n)
  2056. ELSIF ~SymTab.EnterProc(n) THEN
  2057. SemError(200)
  2058. END;
  2059. SymTab.OpenProcScope;
  2060. endL := MGen.NewLabel();
  2061. MGen.Jmp(endL);;
  2062. IF (sym = 19) THEN
  2063. Get;
  2064. FormalParams;
  2065. Expect(20);
  2066. END;
  2067. IF (sym = 17) THEN
  2068. Get;
  2069. QualIdent(rt);
  2070. hasR := TRUE;;
  2071. END;
  2072. IF hasR THEN
  2073. ok := SymTab.SetProcRet(rt)
  2074. ELSE
  2075. ok := SymTab.SetProcRet(
  2076. SymTab.InvalidType)
  2077. END;
  2078. IF ~ok THEN SemError(231) END;
  2079. IF ~SymTab.VerifyProc() THEN
  2080. SemError(231)
  2081. END;;
  2082. Expect(6);
  2083. IF In(symSet[6], sym) THEN
  2084. Block(TRUE);
  2085. GetIdent(m);
  2086. IF ~SymTab.Equal(n, m) THEN
  2087. SemError(202) END;
  2088. MGen.DefLabel(endL);
  2089. SymTab.CloseProc;;
  2090. ELSIF (sym = 21) THEN
  2091. Get;
  2092. SymTab.SetForward;
  2093. SymTab.CloseProc;
  2094. MGen.DefLabel(endL);;
  2095. ELSE SynError(80);
  2096. END;
  2097. END ProcedureDecl;
  2098. PROCEDURE VarDecl;
  2099. VAR t: SymTab.TypeIndex;
  2100. i: CARDINAL;
  2101. nm: SymTab.Name;
  2102. cls: INTEGER;
  2103. sl: CARDINAL;
  2104. BEGIN
  2105. VarIdents;
  2106. Expect(17);
  2107. Type(t);
  2108. cls := SymTab.ClassOf(t);
  2109. IF (cls # SymTab.ClInt)
  2110. & (cls # SymTab.ClReal)
  2111. & (cls # SymTab.ClBool)
  2112. & (cls # SymTab.ClChar)
  2113. & (cls # SymTab.ClEnum)
  2114. & (cls # SymTab.ClSet)
  2115. & (cls # SymTab.ClArray)
  2116. & (cls # SymTab.ClRecord)
  2117. & (cls # SymTab.ClPtr) THEN
  2118. SemError(230)
  2119. END;
  2120. sl := SymTab.TypeSlots(t);
  2121. IF sl = 0 THEN
  2122. SemError(230);
  2123. sl := 1
  2124. END;
  2125. i := 0;
  2126. WHILE i < SymTab.PendCount() DO
  2127. SymTab.PendName(i, nm);
  2128. IF SymTab.SymDepth(nm) = 0 THEN
  2129. MGen.DeclVarSized(nm, sl)
  2130. END;
  2131. INC(i)
  2132. END;
  2133. SymTab.FixPending(t);;
  2134. END VarDecl;
  2135. PROCEDURE TypeDecl;
  2136. VAR n: SymTab.Name;
  2137. t0, t1: SymTab.TypeIndex;
  2138. BEGIN
  2139. GetIdent(n);
  2140. IF ~SymTab.Enter(n, SymTab.KindType)
  2141. THEN SemError(200) END;
  2142. t0 := SymTab.NewAlias();
  2143. SymTab.SetSymType(n, t0);;
  2144. Expect(16);
  2145. Type(t1);
  2146. IF t1 = t0 THEN SemError(223);
  2147. SymTab.SetTarget(t0,
  2148. SymTab.InvalidType)
  2149. ELSE SymTab.SetTarget(t0, t1) END;;
  2150. END TypeDecl;
  2151. PROCEDURE ConstDecl;
  2152. VAR n: SymTab.Name;
  2153. t: SymTab.TypeIndex;
  2154. lx: MGen.LitStr;
  2155. cls: INTEGER;
  2156. BEGIN
  2157. GetIdent(n);
  2158. IF ~SymTab.Enter(n, SymTab.KindConst)
  2159. THEN SemError(200) END;
  2160. Expect(16);
  2161. MGen.NoEmitEnter;;
  2162. ConstExpr(t, lx);
  2163. SymTab.SetSymType(n, t);
  2164. cls := SymTab.ClassOf(t);
  2165. IF cls = SymTab.ClStr THEN
  2166. SemError(230)
  2167. ELSIF ~MGen.IsLit(lx) THEN
  2168. SemError(230)
  2169. END;
  2170. MGen.DeclConst(n, lx, t);
  2171. MGen.NoEmitExit;;
  2172. END ConstDecl;
  2173. PROCEDURE StatSeq;
  2174. BEGIN
  2175. Stat;
  2176. WHILE (sym = 6) DO
  2177. Get;
  2178. Stat;
  2179. END;
  2180. END StatSeq;
  2181. PROCEDURE Declaration;
  2182. BEGIN
  2183. IF (sym = 13) THEN
  2184. Get;
  2185. WHILE (sym = 1) DO
  2186. ConstDecl;
  2187. Expect(6);
  2188. END;
  2189. ELSIF (sym = 14) THEN
  2190. Get;
  2191. WHILE (sym = 1) DO
  2192. TypeDecl;
  2193. Expect(6);
  2194. END;
  2195. ELSIF (sym = 15) THEN
  2196. Get;
  2197. WHILE (sym = 1) DO
  2198. VarDecl;
  2199. Expect(6);
  2200. END;
  2201. ELSIF (sym = 18) THEN
  2202. ProcedureDecl;
  2203. Expect(6);
  2204. ELSE SynError(81);
  2205. END;
  2206. END Declaration;
  2207. PROCEDURE ImportList;
  2208. VAR n: SymTab.Name;
  2209. BEGIN
  2210. GetIdent(n);
  2211. IF ~SymTab.Enter(n, SymTab.KindImport)
  2212. THEN SemError(200) END;
  2213. WHILE (sym = 10) DO
  2214. Get;
  2215. GetIdent(n);
  2216. IF ~SymTab.Enter(n, SymTab.KindImport)
  2217. THEN SemError(200) END;
  2218. END;
  2219. END ImportList;
  2220. PROCEDURE Block (isProc: BOOLEAN);
  2221. VAR began: BOOLEAN;
  2222. BEGIN
  2223. began := FALSE;;
  2224. WHILE (sym = 13) OR (sym = 14) OR (sym = 15) OR (sym = 18) DO
  2225. Declaration;
  2226. END;
  2227. IF (sym = 11) THEN
  2228. Get;
  2229. began := TRUE;
  2230. IF isProc THEN
  2231. MGen.ProcEntry(
  2232. SymTab.CurProc(),
  2233. SymTab.ProcNLocals())
  2234. ELSE MGen.BeginBody
  2235. END;;
  2236. StatSeq;
  2237. END;
  2238. Expect(12);
  2239. IF isProc THEN
  2240. IF ~began THEN
  2241. MGen.ProcEntry(
  2242. SymTab.CurProc(),
  2243. SymTab.ProcNLocals())
  2244. END;
  2245. IF SymTab.InFunction() THEN
  2246. MGen.PushInt(0)
  2247. END;
  2248. MGen.Leave(SymTab.CurNPar(),
  2249. SymTab.InFunction())
  2250. END;;
  2251. END Block;
  2252. PROCEDURE Import;
  2253. VAR n: SymTab.Name;
  2254. BEGIN
  2255. IF (sym = 8) THEN
  2256. Get;
  2257. GetIdent(n);
  2258. IF ~SymTab.Enter(n, SymTab.KindImport)
  2259. THEN SemError(200) END;
  2260. Expect(9);
  2261. ImportList;
  2262. Expect(6);
  2263. ELSIF (sym = 9) THEN
  2264. Get;
  2265. ImportList;
  2266. Expect(6);
  2267. ELSE SynError(82);
  2268. END;
  2269. END Import;
  2270. PROCEDURE GetIdent (VAR n: SymTab.Name);
  2271. BEGIN
  2272. Expect(1);
  2273. LexName(n);;
  2274. END GetIdent;
  2275. PROCEDURE M2c;
  2276. VAR m1, m2: SymTab.Name;
  2277. BEGIN
  2278. Expect(5);
  2279. GetIdent(m1);
  2280. SymTab.Init; MGen.OpenModule(m1);
  2281. IF ~SymTab.Enter(m1, SymTab.KindModule)
  2282. THEN SemError(200) END;
  2283. Expect(6);
  2284. WHILE (sym = 8) OR (sym = 9) DO
  2285. Import;
  2286. END;
  2287. Block(FALSE);
  2288. GetIdent(m2);
  2289. IF ~SymTab.Equal(m1, m2)
  2290. THEN SemError(202) END;
  2291. Expect(7);
  2292. IF SymTab.AnyForward() THEN
  2293. SemError(231)
  2294. END;
  2295. MGen.EndModule;
  2296. SymTab.PrintTable;;
  2297. END M2c;
  2298. PROCEDURE Parse;
  2299. BEGIN
  2300. M2cS.Reset; Get;
  2301. M2c;
  2302. END Parse;
  2303. BEGIN
  2304. errDist := minErrDist;
  2305. symSet[ 0, 0] := BITSET{0};
  2306. symSet[ 0, 1] := BITSET{};
  2307. symSet[ 0, 2] := BITSET{};
  2308. symSet[ 0, 3] := BITSET{};
  2309. symSet[ 0, 4] := BITSET{};
  2310. symSet[ 1, 0] := BITSET{1, 2, 3, 4};
  2311. symSet[ 1, 1] := BITSET{3};
  2312. symSet[ 1, 2] := BITSET{14};
  2313. symSet[ 1, 3] := BITSET{11};
  2314. symSet[ 1, 4] := BITSET{3, 4, 5};
  2315. symSet[ 2, 0] := BITSET{};
  2316. symSet[ 2, 1] := BITSET{};
  2317. symSet[ 2, 2] := BITSET{};
  2318. symSet[ 2, 3] := BITSET{13, 14, 15};
  2319. symSet[ 2, 4] := BITSET{0, 1, 2};
  2320. symSet[ 3, 0] := BITSET{6, 12};
  2321. symSet[ 3, 1] := BITSET{};
  2322. symSet[ 3, 2] := BITSET{3, 4, 6, 10};
  2323. symSet[ 3, 3] := BITSET{};
  2324. symSet[ 3, 4] := BITSET{};
  2325. symSet[ 4, 0] := BITSET{1};
  2326. symSet[ 4, 1] := BITSET{15};
  2327. symSet[ 4, 2] := BITSET{1, 5, 7, 9, 11, 12, 15};
  2328. symSet[ 4, 3] := BITSET{0, 1, 2};
  2329. symSet[ 4, 4] := BITSET{};
  2330. symSet[ 5, 0] := BITSET{};
  2331. symSet[ 5, 1] := BITSET{0};
  2332. symSet[ 5, 2] := BITSET{};
  2333. symSet[ 5, 3] := BITSET{4, 5, 6, 7, 8, 9, 10};
  2334. symSet[ 5, 4] := BITSET{};
  2335. symSet[ 6, 0] := BITSET{11, 12, 13, 14, 15};
  2336. symSet[ 6, 1] := BITSET{2};
  2337. symSet[ 6, 2] := BITSET{};
  2338. symSet[ 6, 3] := BITSET{};
  2339. symSet[ 6, 4] := BITSET{};
  2340. END M2cP.