M2cP.mod 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073
  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 = 77;
  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 DefProcHead; FORWARD;
  95. PROCEDURE DefDecl; FORWARD;
  96. PROCEDURE Elem (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  97. VAR lx2: MGen.LitStr; VAR hasR: BOOLEAN); FORWARD;
  98. PROCEDURE SetLit (VAR t: SymTab.TypeIndex); FORWARD;
  99. PROCEDURE MulOp (VAR op: INTEGER); FORWARD;
  100. PROCEDURE Fact (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  101. VAR v: BOOLEAN; VAR vn: SymTab.Name); FORWARD;
  102. PROCEDURE AddOp (VAR op: INTEGER); FORWARD;
  103. PROCEDURE Term (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  104. VAR v: BOOLEAN; VAR vn: SymTab.Name); FORWARD;
  105. PROCEDURE Rel (VAR op: INTEGER); FORWARD;
  106. PROCEDURE SimExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  107. VAR v: BOOLEAN; VAR vn: SymTab.Name); 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; exp: SymTab.Name; sfx: BOOLEAN;
  114. inExpr: BOOLEAN; 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 WriteStrStat; FORWARD;
  121. PROCEDURE WriteIntStat; FORWARD;
  122. PROCEDURE DispStat; FORWARD;
  123. PROCEDURE NewStat; FORWARD;
  124. PROCEDURE ReturnStat; FORWARD;
  125. PROCEDURE WithStat; FORWARD;
  126. PROCEDURE ForStat; FORWARD;
  127. PROCEDURE LoopStat; FORWARD;
  128. PROCEDURE RepeatStat; FORWARD;
  129. PROCEDURE WhileStat; FORWARD;
  130. PROCEDURE CaseStat; FORWARD;
  131. PROCEDURE IfStat; FORWARD;
  132. PROCEDURE AssignOrCall; FORWARD;
  133. PROCEDURE Stat; FORWARD;
  134. PROCEDURE FieldIdents (rt: SymTab.TypeIndex); FORWARD;
  135. PROCEDURE Field (rt: SymTab.TypeIndex); FORWARD;
  136. PROCEDURE FieldSeq (rt: SymTab.TypeIndex); FORWARD;
  137. PROCEDURE Enum (VAR t: SymTab.TypeIndex); FORWARD;
  138. PROCEDURE PointerType (VAR t: SymTab.TypeIndex); FORWARD;
  139. PROCEDURE SetType (VAR t: SymTab.TypeIndex); FORWARD;
  140. PROCEDURE RecordType (VAR t: SymTab.TypeIndex); FORWARD;
  141. PROCEDURE ArrayType (VAR t: SymTab.TypeIndex); FORWARD;
  142. PROCEDURE SimpleType (VAR t: SymTab.TypeIndex); FORWARD;
  143. PROCEDURE FPSection; FORWARD;
  144. PROCEDURE QualIdent (VAR t: SymTab.TypeIndex); FORWARD;
  145. PROCEDURE FormalParams; FORWARD;
  146. PROCEDURE VarIdents; FORWARD;
  147. PROCEDURE Type (VAR t: SymTab.TypeIndex); FORWARD;
  148. PROCEDURE Expr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  149. VAR v: BOOLEAN; VAR vn: SymTab.Name); FORWARD;
  150. PROCEDURE ConstExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr); FORWARD;
  151. PROCEDURE ModuleDecl; FORWARD;
  152. PROCEDURE ProcedureDecl; FORWARD;
  153. PROCEDURE VarDecl; FORWARD;
  154. PROCEDURE TypeDecl; FORWARD;
  155. PROCEDURE ConstDecl; FORWARD;
  156. PROCEDURE StatSeq; FORWARD;
  157. PROCEDURE Declaration; FORWARD;
  158. PROCEDURE Block (isProc: BOOLEAN); FORWARD;
  159. PROCEDURE ImpItem (mod: SymTab.Name); FORWARD;
  160. PROCEDURE GetIdent (VAR n: SymTab.Name); FORWARD;
  161. PROCEDURE Import; FORWARD;
  162. PROCEDURE ProgUnit; FORWARD;
  163. PROCEDURE ImplUnit; FORWARD;
  164. PROCEDURE DefUnit; FORWARD;
  165. PROCEDURE Unit; FORWARD;
  166. PROCEDURE M2c; FORWARD;
  167. ----- *)
  168. PROCEDURE DefProcHead;
  169. VAR n: SymTab.Name;
  170. rt: SymTab.TypeIndex;
  171. hasR, ok: BOOLEAN;
  172. BEGIN
  173. Expect(16);
  174. hasR := FALSE;;
  175. GetIdent(n);
  176. IF ~SymTab.EnterProc(n) THEN
  177. SemError(200)
  178. END;
  179. SymTab.OpenProcScope;;
  180. IF (sym = 17) THEN
  181. Get;
  182. FormalParams;
  183. Expect(18);
  184. END;
  185. IF (sym = 15) THEN
  186. Get;
  187. QualIdent(rt);
  188. hasR := TRUE;;
  189. END;
  190. IF hasR THEN
  191. ok := SymTab.SetProcRet(rt)
  192. ELSE
  193. ok := SymTab.SetProcRet(
  194. SymTab.InvalidType)
  195. END;
  196. IF ~ok THEN SemError(231) END;
  197. IF ~SymTab.VerifyProc() THEN
  198. SemError(231)
  199. END;
  200. SymTab.SetForward;
  201. SymTab.CloseProc;;
  202. Expect(8);
  203. END DefProcHead;
  204. PROCEDURE DefDecl;
  205. BEGIN
  206. IF (sym = 11) THEN
  207. Get;
  208. WHILE (sym = 1) DO
  209. ConstDecl;
  210. Expect(8);
  211. END;
  212. ELSIF (sym = 12) THEN
  213. Get;
  214. WHILE (sym = 1) DO
  215. TypeDecl;
  216. Expect(8);
  217. END;
  218. ELSIF (sym = 13) THEN
  219. Get;
  220. WHILE (sym = 1) DO
  221. VarDecl;
  222. Expect(8);
  223. END;
  224. ELSIF (sym = 16) THEN
  225. DefProcHead;
  226. ELSE SynError(78);
  227. END;
  228. END DefDecl;
  229. PROCEDURE Elem (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  230. VAR lx2: MGen.LitStr; VAR hasR: BOOLEAN);
  231. VAR t2: SymTab.TypeIndex;
  232. vD, vD2: BOOLEAN;
  233. vnD, vnD2: SymTab.Name;
  234. BEGIN
  235. Expr(t, lx, vD, vnD);
  236. hasR := FALSE;
  237. lx2[0] := 0C;;
  238. IF (sym = 24) THEN
  239. Get;
  240. Expr(t2, lx2, vD2, vnD2);
  241. IF ~SymTab.SetElemCheck(t, t2) THEN
  242. SemError(222) END;
  243. hasR := TRUE;;
  244. END;
  245. END Elem;
  246. PROCEDURE SetLit (VAR t: SymTab.TypeIndex);
  247. VAR first, et: SymTab.TypeIndex;
  248. lxE, lxE2: MGen.LitStr;
  249. vE, vE2: BOOLEAN;
  250. vnE, vnE2: SymTab.Name;
  251. hasR: BOOLEAN;
  252. BEGIN
  253. Expect(73);
  254. MGen.PushInt(0);
  255. t := SymTab.SetFor(SymTab.IntType());;
  256. IF In(symSet[1], sym) THEN
  257. Elem(et, lxE, lxE2, hasR);
  258. first := et;
  259. t := SymTab.SetFor(et);
  260. MGen.ClrStash();
  261. IF hasR THEN
  262. MGen.PushInt(1); MGen.Add;
  263. MGen.FieldMask
  264. ELSE MGen.Power2 END;
  265. MGen.Or;;
  266. WHILE (sym = 7) DO
  267. Get;
  268. Elem(et, lxE, lxE2, hasR);
  269. IF ~SymTab.SetElemCheck(first, et) THEN
  270. SemError(222) END;
  271. MGen.ClrStash();
  272. IF hasR THEN
  273. MGen.PushInt(1); MGen.Add;
  274. MGen.FieldMask
  275. ELSE MGen.Power2 END;
  276. MGen.Or;;
  277. END;
  278. END;
  279. Expect(74);
  280. END SetLit;
  281. PROCEDURE MulOp (VAR op: INTEGER);
  282. BEGIN
  283. CASE sym OF
  284. 64 :
  285. Get;
  286. op := SymTab.OpTimes;;
  287. | 65 :
  288. Get;
  289. op := SymTab.OpSlash;;
  290. | 66 :
  291. Get;
  292. op := SymTab.OpDiv;;
  293. | 67 :
  294. Get;
  295. op := SymTab.OpMod;;
  296. | 68 :
  297. Get;
  298. op := SymTab.OpAnd;;
  299. | 69 :
  300. Get;
  301. op := SymTab.OpAnd;;
  302. ELSE SynError(79);
  303. END;
  304. END MulOp;
  305. PROCEDURE Fact (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  306. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  307. VAR s: ARRAY [0 .. 255] OF CHAR;
  308. t2, et, dt, st: SymTab.TypeIndex;
  309. dk: INTEGER;
  310. bnF: SymTab.Name;
  311. lxD, lx2: MGen.LitStr;
  312. v2: BOOLEAN;
  313. vn2: SymTab.Name;
  314. vi, mpF: INTEGER;
  315. c: CARDINAL;
  316. b: LONGCARD;
  317. sfxF: BOOLEAN;
  318. okF: BOOLEAN;
  319. BEGIN
  320. CASE sym OF
  321. 2 :
  322. Get;
  323. LexString(s);
  324. MGen.CopyName(s, lx);
  325. v := FALSE; MGen.ClrStash();
  326. IF MGen.ParseInt(s, vi) THEN
  327. MGen.PushInt(vi)
  328. ELSIF MGen.ParseCard(s, c) THEN
  329. MGen.PushBits(
  330. VAL(LONGCARD, c))
  331. ELSE MGen.PushInt(0)
  332. END;
  333. t := SymTab.IntType();;
  334. | 3 :
  335. Get;
  336. LexString(s);
  337. MGen.CopyName(s, lx);
  338. v := FALSE; MGen.ClrStash();
  339. IF MGen.ParseReal(s, b) THEN
  340. MGen.PushBits(b)
  341. ELSE MGen.PushBits(0H)
  342. END;
  343. t := SymTab.RealType();;
  344. | 4 :
  345. Get;
  346. LexString(s);
  347. v := FALSE; MGen.ClrStash();
  348. IF SymTab.StrLen(s) <= 3 THEN
  349. t := SymTab.CharType();
  350. MGen.CopyName(s, lx);
  351. MGen.PushInt(
  352. MGen.CharOrd(s))
  353. ELSE t := SymTab.NewStr();
  354. MGen.CopyName(s, lx);
  355. MGen.EmitString(s)
  356. END;;
  357. | 70 :
  358. Get;
  359. Expect(17);
  360. DesignHead(dt, dk, bnF, FALSE, lxD);
  361. DesignTail(dt, dk, bnF, FALSE, lxD, sfxF);
  362. Expect(18);
  363. lx[0] := 0C; v := FALSE; MGen.ClrStash();
  364. IF dt = SymTab.InvalidType THEN
  365. IF sfxF THEN MGen.Drop END;
  366. MGen.PushInt(0);
  367. t := SymTab.InvalidType
  368. ELSIF SymTab.ClassOf(dt)
  369. # SymTab.ClArray THEN
  370. SemError(217);
  371. IF sfxF THEN MGen.Drop END;
  372. MGen.PushInt(0);
  373. t := SymTab.InvalidType
  374. ELSIF SymTab.IsOpen(dt) THEN
  375. IF sfxF THEN MGen.Drop END;
  376. IF (dk = SymTab.KindParam)
  377. OR (dk
  378. = SymTab.KindVarPar) THEN
  379. IF SymTab.CurDepth()
  380. = SymTab.SymDepth(bnF) THEN
  381. MGen.LoadLocal(
  382. SymTab.SymSlot(bnF) + 1)
  383. ELSE
  384. MGen.FrameAddr(
  385. SymTab.SymSlot(bnF) + 1,
  386. VAL(CARDINAL,
  387. SymTab.CurDepth() - 1
  388. - SymTab.SymDepth(bnF)));
  389. MGen.LoadIndir
  390. END;
  391. MGen.PushInt(1);
  392. MGen.Sub;
  393. t := SymTab.IntType()
  394. ELSE
  395. MGen.PushInt(0);
  396. t := SymTab.InvalidType
  397. END
  398. ELSE
  399. IF sfxF THEN MGen.Drop END;
  400. MGen.PushInt(
  401. SymTab.ArrayHi(dt));
  402. t := SymTab.IntType()
  403. END;;
  404. | 1 :
  405. DesignHead(dt, dk, bnF, TRUE, lxD);
  406. DesignTail(dt, dk, bnF, TRUE, lxD, sfxF);
  407. t := dt;
  408. MGen.CopyName(lxD, lx);
  409. IF sfxF
  410. & (t # SymTab.InvalidType)
  411. & MGen.ActIsVarNext()
  412. & ((dk = SymTab.KindVar)
  413. OR (dk
  414. = SymTab.KindParam)
  415. OR (dk
  416. = SymTab.KindVarPar)
  417. OR (dk
  418. = SymTab.KindField))
  419. & (SymTab.SymKind(bnF)
  420. # SymTab.KindModule)
  421. & (SymTab.ClassOf(t)
  422. # SymTab.ClChar)
  423. & (SymTab.ClassOf(t)
  424. # SymTab.ClBool) THEN
  425. MGen.StashAddr()
  426. END;
  427. IF sfxF
  428. & (t # SymTab.InvalidType)
  429. & (SymTab.ClassOf(t)
  430. # SymTab.ClArray)
  431. & (SymTab.ClassOf(t)
  432. # SymTab.ClRecord) THEN
  433. IF (SymTab.ClassOf(t)
  434. = SymTab.ClChar)
  435. OR (SymTab.ClassOf(t)
  436. = SymTab.ClBool) THEN
  437. MGen.LoadByte
  438. ELSE MGen.LoadIndir
  439. END
  440. END;
  441. v := ~sfxF
  442. & ((dk = SymTab.KindVar)
  443. OR (dk = SymTab.KindParam)
  444. OR (dk
  445. = SymTab.KindVarPar));
  446. MGen.CopyName(bnF, vn);;
  447. IF (sym = 17) THEN
  448. CallTail(bnF, lxD, sfxF, TRUE, okF, TRUE);
  449. IF okF THEN
  450. IF SymTab.SymKind(bnF)
  451. = SymTab.KindProc THEN
  452. t := SymTab.ProcRet(bnF)
  453. ELSIF (SymTab.SymKind(bnF)
  454. = SymTab.KindModule)
  455. & sfxF
  456. & (SymTab.StrLen(lxD) > 0) THEN
  457. mpF := SymTab.ExpProc(bnF,
  458. lxD);
  459. IF (mpF < 0)
  460. & (SymTab.SelfKind(bnF,
  461. lxD)
  462. = SymTab.KindProc) THEN
  463. mpF := SymTab.ProcNum(lxD)
  464. END;
  465. IF mpF >= 0 THEN
  466. t := SymTab.ProcRetByNum(mpF)
  467. ELSE
  468. t := SymTab.InvalidType
  469. END
  470. ELSE
  471. t := SymTab.InvalidType
  472. END
  473. ELSE t := SymTab.InvalidType
  474. END;
  475. lx[0] := 0C; v := FALSE;
  476. MGen.ClrStash();;
  477. END;
  478. | 17 :
  479. Get;
  480. Expr(et, lx, v, vn);
  481. Expect(18);
  482. t := et;;
  483. | 71, 72 :
  484. IF (sym = 71) THEN
  485. Get;
  486. ELSE
  487. Get;
  488. END;
  489. Fact(t2, lx2, v2, vn2);
  490. lx[0] := 0C; v := FALSE; MGen.ClrStash();
  491. IF SymTab.BoolCheck(t2) THEN
  492. t := SymTab.BoolType()
  493. ELSE SemError(212);
  494. t := SymTab.InvalidType END;
  495. MGen.Not;;
  496. | 73 :
  497. SetLit(st);
  498. lx[0] := 0C; v := FALSE; MGen.ClrStash();
  499. t := st;;
  500. ELSE SynError(80);
  501. END;
  502. END Fact;
  503. PROCEDURE AddOp (VAR op: INTEGER);
  504. BEGIN
  505. IF (sym = 62) THEN
  506. Get;
  507. op := SymTab.OpAdd;;
  508. ELSIF (sym = 47) THEN
  509. Get;
  510. op := SymTab.OpSub;;
  511. ELSIF (sym = 63) THEN
  512. Get;
  513. op := SymTab.OpOr;;
  514. ELSE SynError(81);
  515. END;
  516. END AddOp;
  517. PROCEDURE Term (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  518. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  519. VAR t2, res2: SymTab.TypeIndex;
  520. op: INTEGER;
  521. lx2: MGen.LitStr;
  522. v2: BOOLEAN;
  523. vn2: SymTab.Name;
  524. isR: BOOLEAN;
  525. mt: INTEGER;
  526. BEGIN
  527. Fact(t, lx, v, vn);
  528. WHILE In(symSet[2], sym) DO
  529. MulOp(op);
  530. Fact(t2, lx2, v2, vn2);
  531. lx[0] := 0C; v := FALSE; MGen.ClrStash();
  532. IF op = SymTab.OpAnd THEN
  533. IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
  534. t := SymTab.BoolType()
  535. ELSE SemError(212); t := SymTab.InvalidType END;
  536. MGen.And
  537. ELSIF (op = SymTab.OpTimes)
  538. & (t # SymTab.InvalidType)
  539. & (t2 # SymTab.InvalidType)
  540. & (SymTab.ClassOf(t) = SymTab.ClSet)
  541. & (SymTab.ClassOf(t2) = SymTab.ClSet) THEN
  542. MGen.And
  543. ELSE
  544. IF SymTab.ArithCheck(t, t2,
  545. (op = SymTab.OpDiv) OR (op = SymTab.OpMod),
  546. res2) THEN t := res2
  547. ELSE SemError(211); t := SymTab.InvalidType END;
  548. isR := (t # SymTab.InvalidType)
  549. & (SymTab.ClassOf(t) = SymTab.ClReal);
  550. IF op = SymTab.OpTimes THEN
  551. IF isR THEN MGen.RealMul ELSE MGen.MulU END
  552. ELSIF op = SymTab.OpSlash THEN
  553. IF isR THEN MGen.RealDiv ELSE MGen.DivI END
  554. ELSIF op = SymTab.OpDiv THEN
  555. MGen.DivI
  556. ELSE
  557. mt := MGen.TempGlobal();
  558. MGen.ModI(mt)
  559. END
  560. END;;
  561. END;
  562. END Term;
  563. PROCEDURE Rel (VAR op: INTEGER);
  564. BEGIN
  565. CASE sym OF
  566. 14 :
  567. Get;
  568. op := SymTab.OpEq;;
  569. | 55 :
  570. Get;
  571. op := SymTab.OpNeq1;;
  572. | 56 :
  573. Get;
  574. op := SymTab.OpNeq2;;
  575. | 57 :
  576. Get;
  577. op := SymTab.OpLt;;
  578. | 58 :
  579. Get;
  580. op := SymTab.OpLe;;
  581. | 59 :
  582. Get;
  583. op := SymTab.OpGt;;
  584. | 60 :
  585. Get;
  586. op := SymTab.OpGe;;
  587. | 61 :
  588. Get;
  589. op := SymTab.OpIn;;
  590. ELSE SynError(82);
  591. END;
  592. END Rel;
  593. PROCEDURE SimExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  594. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  595. VAR t2, res2: SymTab.TypeIndex;
  596. op: INTEGER;
  597. lx2: MGen.LitStr;
  598. v2: BOOLEAN;
  599. vn2: SymTab.Name;
  600. neg, isR: BOOLEAN;
  601. BEGIN
  602. neg := FALSE;;
  603. IF (sym = 47) OR (sym = 62) THEN
  604. IF (sym = 62) THEN
  605. Get;
  606. ELSE
  607. Get;
  608. neg := TRUE;;
  609. END;
  610. END;
  611. Term(t, lx, v, vn);
  612. IF neg THEN
  613. v := FALSE;
  614. MGen.ClrStash();
  615. IF MGen.IsLit(lx) THEN
  616. MGen.NegFold(lx, lx)
  617. ELSE lx[0] := 0C
  618. END;
  619. IF SymTab.ClassOf(t)
  620. = SymTab.ClReal THEN
  621. MGen.NegReal
  622. ELSE MGen.NegInt
  623. END
  624. END;;
  625. WHILE (sym = 47) OR (sym = 62) OR (sym = 63) DO
  626. AddOp(op);
  627. Term(t2, lx2, v2, vn2);
  628. lx[0] := 0C; v := FALSE; MGen.ClrStash();
  629. IF op = SymTab.OpOr THEN
  630. IF SymTab.BoolCheck(t) & SymTab.BoolCheck(t2) THEN
  631. t := SymTab.BoolType()
  632. ELSE SemError(212); t := SymTab.InvalidType END;
  633. MGen.Or
  634. ELSIF (t # SymTab.InvalidType)
  635. & (t2 # SymTab.InvalidType)
  636. & (SymTab.ClassOf(t) = SymTab.ClSet)
  637. & (SymTab.ClassOf(t2) = SymTab.ClSet) THEN
  638. IF op = SymTab.OpAdd THEN
  639. MGen.Or
  640. ELSE
  641. MGen.PushBits(0FFFFFFFFFFFFFFFFH);
  642. MGen.BitXor;
  643. MGen.And
  644. END
  645. ELSE
  646. IF SymTab.ArithCheck(t, t2, FALSE, res2) THEN t := res2
  647. ELSE SemError(211); t := SymTab.InvalidType END;
  648. isR := (t # SymTab.InvalidType)
  649. & (SymTab.ClassOf(t) = SymTab.ClReal);
  650. IF op = SymTab.OpAdd THEN
  651. IF isR THEN MGen.RealAdd ELSE MGen.Add END
  652. ELSE
  653. IF isR THEN MGen.RealSub ELSE MGen.Sub END
  654. END
  655. END;;
  656. END;
  657. END SimExpr;
  658. PROCEDURE ByLit (VAR v: INTEGER);
  659. VAR s: ARRAY [0 .. 255] OF CHAR;
  660. BEGIN
  661. IF (sym = 2) THEN
  662. Get;
  663. LexString(s);
  664. IF ~MGen.ParseInt(s, v) THEN
  665. v := 1
  666. END;;
  667. ELSIF (sym = 47) THEN
  668. Get;
  669. Expect(2);
  670. LexString(s);
  671. IF MGen.ParseInt(s, v) THEN
  672. v := -v
  673. ELSE v := -1
  674. END;;
  675. ELSE SynError(83);
  676. END;
  677. END ByLit;
  678. PROCEDURE Labels (sel: SymTab.TypeIndex; tmp: INTEGER; bodyL: INTEGER);
  679. VAR t, t2: SymTab.TypeIndex;
  680. lx1, lx2: MGen.LitStr;
  681. v1, v2: BOOLEAN;
  682. vn1, vn2: SymTab.Name;
  683. ta, tb, chunk: INTEGER;
  684. r, hasRange: BOOLEAN;
  685. BEGIN
  686. ConstExpr(t, lx1);
  687. IF ~SymTab.EqCheck(t, sel) THEN
  688. SemError(213) END;
  689. r := (SymTab.ClassOf(sel)
  690. = SymTab.ClReal)
  691. & (SymTab.ClassOf(t)
  692. = SymTab.ClReal);
  693. ta := MGen.TempGlobal();
  694. MGen.StoreTemp(ta);
  695. hasRange := FALSE;;
  696. IF (sym = 24) THEN
  697. Get;
  698. ConstExpr(t2, lx2);
  699. IF ~SymTab.EqCheck(t2, sel) THEN
  700. SemError(213) END;
  701. tb := MGen.TempGlobal();
  702. MGen.StoreTemp(tb);
  703. hasRange := TRUE;;
  704. END;
  705. IF hasRange THEN
  706. MGen.LoadTemp(tmp);
  707. MGen.LoadTemp(ta);
  708. IF r THEN MGen.RealGe
  709. ELSE MGen.IGe END;
  710. MGen.LoadTemp(tmp);
  711. MGen.LoadTemp(tb);
  712. IF r THEN MGen.RealLe
  713. ELSE MGen.ILe END;
  714. MGen.And
  715. ELSE
  716. MGen.LoadTemp(tmp);
  717. MGen.LoadTemp(ta);
  718. IF r THEN MGen.RealEq
  719. ELSE MGen.Eq END
  720. END;
  721. chunk := MGen.NewLabel();
  722. MGen.Jz(chunk);
  723. MGen.Jmp(bodyL);
  724. MGen.DefLabel(chunk);;
  725. END Labels;
  726. PROCEDURE LabelList (sel: SymTab.TypeIndex; tmp: INTEGER;
  727. VAR lB: INTEGER; VAR lN: INTEGER);
  728. BEGIN
  729. lB := MGen.NewLabel();
  730. lN := MGen.NewLabel();;
  731. Labels(sel, tmp, lB);
  732. WHILE (sym = 7) DO
  733. Get;
  734. Labels(sel, tmp, lB);
  735. END;
  736. MGen.Jmp(lN);;
  737. END LabelList;
  738. PROCEDURE Case (sel: SymTab.TypeIndex; tmp: INTEGER; endL: INTEGER);
  739. VAR lB, lN: INTEGER;
  740. BEGIN
  741. IF In(symSet[1], sym) THEN
  742. LabelList(sel, tmp, lB, lN);
  743. Expect(15);
  744. MGen.DefLabel(lB);;
  745. StatSeq;
  746. MGen.Jmp(endL);
  747. MGen.DefLabel(lN);;
  748. END;
  749. END Case;
  750. PROCEDURE CallTail (pn: SymTab.Name; exp: SymTab.Name; sfx: BOOLEAN;
  751. inExpr: BOOLEAN; VAR ok: BOOLEAN; hasDead: BOOLEAN);
  752. VAR t: SymTab.TypeIndex;
  753. lx: MGen.LitStr;
  754. v: BOOLEAN;
  755. vn: SymTab.Name;
  756. isModP: BOOLEAN;
  757. modPNum: INTEGER;
  758. modErr: BOOLEAN;
  759. BEGIN
  760. Expect(17);
  761. ok := FALSE; modErr := FALSE;
  762. isModP :=
  763. (SymTab.SymKind(pn)
  764. = SymTab.KindModule)
  765. & sfx
  766. & (SymTab.StrLen(exp) > 0);
  767. IF hasDead THEN MGen.Drop END;
  768. IF isModP THEN
  769. modPNum := SymTab.ExpProc(pn,
  770. exp);
  771. IF (modPNum < 0)
  772. & (SymTab.SelfKind(pn,
  773. exp)
  774. = SymTab.KindProc) THEN
  775. modPNum :=
  776. SymTab.ProcNum(exp)
  777. END;
  778. IF modPNum < 0 THEN
  779. IF SymTab.ExpKind(pn,
  780. exp) # -1 THEN
  781. SemError(233)
  782. END;
  783. modErr := TRUE
  784. ELSIF inExpr
  785. & (SymTab.ProcRetByNum(
  786. modPNum)
  787. = SymTab.InvalidType)
  788. THEN
  789. SemError(233);
  790. modErr := TRUE
  791. END;
  792. MGen.ActBeginNum(modPNum)
  793. ELSE
  794. MGen.ActBegin(pn)
  795. END;;
  796. IF In(symSet[1], sym) THEN
  797. Expr(t, lx, v, vn);
  798. IF isModP THEN
  799. IF ~modErr
  800. & (MGen.ActValue(t, v, vn)
  801. # 0) THEN
  802. SemError(233);
  803. modErr := TRUE
  804. END
  805. ELSIF MGen.ActValue(t, v, vn) # 0 THEN
  806. SemError(233)
  807. END;;
  808. WHILE (sym = 7) DO
  809. Get;
  810. Expr(t, lx, v, vn);
  811. IF isModP THEN
  812. IF ~modErr
  813. & (MGen.ActValue(t, v, vn)
  814. # 0) THEN
  815. SemError(233);
  816. modErr := TRUE
  817. END
  818. ELSIF MGen.ActValue(t, v, vn) # 0 THEN
  819. SemError(233)
  820. END;;
  821. END;
  822. END;
  823. Expect(18);
  824. IF isModP THEN
  825. IF ~modErr THEN
  826. IF MGen.ActEndNum(modPNum,
  827. inExpr) # 0 THEN
  828. SemError(233)
  829. ELSE ok := TRUE
  830. END
  831. END
  832. ELSIF MGen.ActEnd(pn, sfx,
  833. inExpr) # 0
  834. THEN SemError(233)
  835. ELSE ok := TRUE
  836. END;;
  837. END CallTail;
  838. PROCEDURE DesignTail (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  839. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr;
  840. VAR sfx: BOOLEAN);
  841. VAR m: SymTab.Name;
  842. it: SymTab.TypeIndex;
  843. lxI: MGen.LitStr;
  844. vI: BOOLEAN;
  845. vnI: SymTab.Name;
  846. loA: INTEGER;
  847. elemT: SymTab.TypeIndex;
  848. esl, ebytes: CARDINAL;
  849. firstT: BOOLEAN;
  850. clsI: INTEGER;
  851. sk: INTEGER;
  852. qM: SymTab.Name;
  853. BEGIN
  854. sfx := FALSE;;
  855. WHILE (sym = 22) OR (sym = 23) OR (sym = 54) DO
  856. IF (sym = 22) THEN
  857. Get;
  858. firstT := ~sfx;
  859. sfx := TRUE; lx[0] := 0C;
  860. IF ~doLoad & firstT THEN
  861. IF (k = SymTab.KindVar)
  862. OR (k = SymTab.KindParam)
  863. OR (k
  864. = SymTab.KindVarPar) THEN
  865. MGen.PushAddr(bn)
  866. ELSIF k
  867. = SymTab.KindField THEN
  868. MGen.WithAddr(bn)
  869. ELSIF k
  870. = SymTab.KindModule THEN
  871. ELSE MGen.PushInt(0)
  872. END
  873. END;;
  874. GetIdent(m);
  875. IF (k = SymTab.KindModule) THEN
  876. IF SymTab.ExpKind(bn, m) = -1 THEN
  877. sk := SymTab.SelfKind(bn, m);
  878. IF sk = SymTab.KindProc THEN
  879. MGen.CopyName(m, lx);
  880. t := SymTab.InvalidType;
  881. IF doLoad THEN
  882. MGen.Drop; MGen.PushInt(0)
  883. ELSIF firstT THEN
  884. ELSE MGen.Drop
  885. END
  886. ELSIF sk # -1 THEN
  887. t := SymTab.SymType(m);
  888. k := sk;
  889. SymTab.SelfQual(m, qM);
  890. IF doLoad THEN
  891. MGen.Drop;
  892. MGen.GlobalAddr(qM)
  893. ELSE
  894. IF firstT THEN
  895. ELSE MGen.Drop
  896. END;
  897. MGen.GlobalAddr(qM)
  898. END
  899. ELSE
  900. SemError(201);
  901. MGen.CopyName(m, lx);
  902. t := SymTab.InvalidType;
  903. IF doLoad THEN
  904. MGen.Drop; MGen.PushInt(0)
  905. ELSIF firstT THEN
  906. ELSE MGen.Drop
  907. END
  908. END
  909. ELSIF SymTab.ExpKind(bn, m)
  910. = SymTab.KindProc THEN
  911. MGen.CopyName(m, lx);
  912. t := SymTab.InvalidType;
  913. IF doLoad THEN
  914. MGen.Drop; MGen.PushInt(0)
  915. ELSIF firstT THEN
  916. ELSE MGen.Drop
  917. END
  918. ELSE
  919. t := SymTab.ExpType(bn, m);
  920. k := SymTab.ExpKind(bn, m);
  921. SymTab.ExpQual(bn, m, qM);
  922. IF doLoad THEN
  923. MGen.Drop;
  924. MGen.GlobalAddr(qM)
  925. ELSE
  926. IF firstT THEN
  927. ELSE MGen.Drop
  928. END;
  929. MGen.GlobalAddr(qM)
  930. END
  931. END
  932. ELSIF t = SymTab.InvalidType THEN
  933. IF ~doLoad & firstT THEN
  934. MGen.Drop
  935. ELSIF doLoad THEN
  936. MGen.Drop; MGen.PushInt(0)
  937. END
  938. ELSIF SymTab.ClassOf(t) #
  939. SymTab.ClRecord THEN
  940. SemError(215);
  941. t := SymTab.InvalidType;
  942. IF doLoad THEN
  943. MGen.Drop; MGen.PushInt(0)
  944. ELSIF firstT THEN
  945. MGen.Drop
  946. END
  947. ELSIF ~SymTab.FieldExists(t, m) THEN
  948. SemError(216);
  949. t := SymTab.InvalidType;
  950. IF doLoad THEN
  951. MGen.Drop; MGen.PushInt(0)
  952. ELSIF firstT THEN
  953. MGen.Drop
  954. END
  955. ELSE
  956. loA := SymTab.FieldOffset(t, m);
  957. elemT := SymTab.FieldType(t, m);
  958. IF loA < 0 THEN
  959. SemError(216);
  960. t := SymTab.InvalidType;
  961. IF doLoad THEN
  962. MGen.Drop; MGen.PushInt(0)
  963. ELSIF firstT THEN
  964. MGen.Drop
  965. END
  966. ELSE
  967. MGen.FieldAdd(
  968. VAL(CARDINAL, loA));
  969. t := elemT
  970. END
  971. END;;
  972. ELSIF (sym = 23) THEN
  973. Get;
  974. firstT := ~sfx;
  975. sfx := TRUE; lx[0] := 0C;
  976. IF ~doLoad & firstT THEN
  977. IF (k = SymTab.KindVar)
  978. OR (k = SymTab.KindParam)
  979. OR (k
  980. = SymTab.KindVarPar) THEN
  981. MGen.PushAddr(bn)
  982. ELSIF k
  983. = SymTab.KindField THEN
  984. MGen.WithAddr(bn)
  985. ELSE MGen.PushInt(0)
  986. END
  987. END;;
  988. Expr(it, lxI, vI, vnI);
  989. IF t = SymTab.InvalidType THEN
  990. MGen.Drop;
  991. IF doLoad THEN
  992. MGen.Drop; MGen.PushInt(0)
  993. ELSE
  994. IF ~firstT THEN
  995. ELSE MGen.Drop
  996. END
  997. END
  998. ELSIF SymTab.ClassOf(t) #
  999. SymTab.ClArray THEN
  1000. SemError(217);
  1001. t := SymTab.InvalidType;
  1002. MGen.Drop;
  1003. IF doLoad THEN
  1004. MGen.Drop; MGen.PushInt(0)
  1005. ELSE
  1006. IF ~firstT THEN
  1007. ELSE MGen.Drop
  1008. END
  1009. END
  1010. ELSE
  1011. clsI := SymTab.ClassOf(it);
  1012. IF (it
  1013. # SymTab.InvalidType)
  1014. & (clsI # SymTab.ClInt)
  1015. & (clsI # SymTab.ClChar)
  1016. & (clsI # SymTab.ClEnum)
  1017. & (clsI
  1018. # SymTab.ClBool) THEN
  1019. SemError(218);
  1020. t := SymTab.InvalidType;
  1021. MGen.Drop;
  1022. IF doLoad THEN
  1023. MGen.Drop; MGen.PushInt(0)
  1024. ELSE
  1025. IF ~firstT THEN
  1026. ELSE MGen.Drop
  1027. END
  1028. END
  1029. ELSE
  1030. loA := SymTab.ArrayLo(t);
  1031. elemT := SymTab.ArrayElem(t);
  1032. esl := SymTab.TypeSlots(elemT);
  1033. IF esl = 0 THEN
  1034. SemError(230);
  1035. esl := 1
  1036. END;
  1037. IF (SymTab.ClassOf(elemT)
  1038. = SymTab.ClChar)
  1039. OR (SymTab.ClassOf(elemT)
  1040. = SymTab.ClBool) THEN
  1041. ebytes := 1
  1042. ELSE ebytes := esl * 8
  1043. END;
  1044. MGen.IdxScale(loA, ebytes);
  1045. t := elemT
  1046. END
  1047. END;;
  1048. WHILE (sym = 7) DO
  1049. Get;
  1050. Expr(it, lxI, vI, vnI);
  1051. IF t = SymTab.InvalidType THEN
  1052. MGen.Drop;
  1053. IF doLoad THEN
  1054. MGen.Drop; MGen.PushInt(0);
  1055. t := SymTab.InvalidType
  1056. END
  1057. ELSIF SymTab.ClassOf(t) #
  1058. SymTab.ClArray THEN
  1059. SemError(217);
  1060. t := SymTab.InvalidType;
  1061. MGen.Drop;
  1062. IF doLoad THEN
  1063. MGen.Drop; MGen.PushInt(0)
  1064. END
  1065. ELSE
  1066. clsI := SymTab.ClassOf(it);
  1067. IF (it
  1068. # SymTab.InvalidType)
  1069. & (clsI # SymTab.ClInt)
  1070. & (clsI # SymTab.ClChar)
  1071. & (clsI # SymTab.ClEnum)
  1072. & (clsI
  1073. # SymTab.ClBool) THEN
  1074. SemError(218);
  1075. t := SymTab.InvalidType;
  1076. MGen.Drop;
  1077. IF doLoad THEN
  1078. MGen.Drop; MGen.PushInt(0)
  1079. END
  1080. ELSE
  1081. loA := SymTab.ArrayLo(t);
  1082. elemT := SymTab.ArrayElem(t);
  1083. esl := SymTab.TypeSlots(elemT);
  1084. IF esl = 0 THEN
  1085. SemError(230);
  1086. esl := 1
  1087. END;
  1088. IF (SymTab.ClassOf(elemT)
  1089. = SymTab.ClChar)
  1090. OR (SymTab.ClassOf(elemT)
  1091. = SymTab.ClBool) THEN
  1092. ebytes := 1
  1093. ELSE ebytes := esl * 8
  1094. END;
  1095. MGen.IdxScale(loA, ebytes);
  1096. t := elemT
  1097. END
  1098. END;;
  1099. END;
  1100. Expect(25);
  1101. ELSE
  1102. Get;
  1103. firstT := ~sfx;
  1104. sfx := TRUE; lx[0] := 0C;
  1105. IF ~doLoad & firstT THEN
  1106. IF (k = SymTab.KindVar)
  1107. OR (k = SymTab.KindParam)
  1108. OR (k
  1109. = SymTab.KindVarPar) THEN
  1110. MGen.PushAddr(bn)
  1111. ELSIF k
  1112. = SymTab.KindField THEN
  1113. MGen.WithAddr(bn)
  1114. ELSE MGen.PushInt(0)
  1115. END
  1116. END;;
  1117. IF t = SymTab.InvalidType THEN
  1118. IF doLoad THEN
  1119. MGen.Drop; MGen.PushInt(0)
  1120. ELSIF firstT THEN
  1121. MGen.Drop
  1122. END
  1123. ELSIF SymTab.ClassOf(t) #
  1124. SymTab.ClPtr THEN
  1125. SemError(219);
  1126. t := SymTab.InvalidType;
  1127. IF doLoad THEN
  1128. MGen.Drop; MGen.PushInt(0)
  1129. ELSIF firstT THEN
  1130. MGen.Drop
  1131. END
  1132. ELSE
  1133. elemT := SymTab.PtrBase(t);
  1134. t := elemT;
  1135. IF doLoad THEN
  1136. IF ~(firstT
  1137. & ((k
  1138. = SymTab.KindVar)
  1139. OR (k
  1140. = SymTab.KindParam)
  1141. OR (k
  1142. = SymTab.KindVarPar)))
  1143. THEN
  1144. MGen.LoadIndir
  1145. END
  1146. ELSE
  1147. MGen.LoadIndir
  1148. END
  1149. END;;
  1150. END;
  1151. END;
  1152. END DesignTail;
  1153. PROCEDURE DesignHead (VAR t: SymTab.TypeIndex; VAR k: INTEGER;
  1154. VAR bn: SymTab.Name; doLoad: BOOLEAN; VAR lx: MGen.LitStr);
  1155. VAR n: SymTab.Name;
  1156. cls: INTEGER;
  1157. BEGIN
  1158. GetIdent(n);
  1159. MGen.CopyName(n, bn);
  1160. lx[0] := 0C;
  1161. IF ~SymTab.Lookup(n) THEN
  1162. SemError(201);
  1163. t := SymTab.InvalidType; k := -1;
  1164. IF doLoad THEN
  1165. MGen.PushInt(0)
  1166. END
  1167. ELSE
  1168. t := SymTab.SymType(n);
  1169. k := SymTab.SymKind(n);
  1170. IF k = SymTab.KindConst THEN
  1171. IF SymTab.Equal(n, "TRUE") THEN
  1172. t := SymTab.BoolType();
  1173. MGen.CopyName("TRUE", lx);
  1174. IF doLoad THEN
  1175. MGen.PushInt(1)
  1176. END
  1177. ELSIF SymTab.Equal(n,
  1178. "FALSE") THEN
  1179. t := SymTab.BoolType();
  1180. MGen.CopyName("FALSE", lx);
  1181. IF doLoad THEN
  1182. MGen.PushInt(0)
  1183. END
  1184. ELSE
  1185. cls :=
  1186. SymTab.ClassOf(t);
  1187. IF (t #
  1188. SymTab.InvalidType)
  1189. & (cls # SymTab.ClStr)
  1190. & ((cls = SymTab.ClInt)
  1191. OR (cls = SymTab.ClReal)
  1192. OR (cls = SymTab.ClBool)
  1193. OR (cls = SymTab.ClChar)
  1194. OR (cls
  1195. = SymTab.ClEnum)) THEN
  1196. IF doLoad THEN
  1197. MGen.LoadVar(n)
  1198. END
  1199. ELSIF doLoad THEN
  1200. MGen.PushInt(0)
  1201. END
  1202. END
  1203. ELSIF (k = SymTab.KindVar)
  1204. OR (k = SymTab.KindParam)
  1205. OR (k
  1206. = SymTab.KindVarPar) THEN
  1207. cls := SymTab.ClassOf(t);
  1208. IF (cls = SymTab.ClInt)
  1209. OR (cls = SymTab.ClReal)
  1210. OR (cls = SymTab.ClBool)
  1211. OR (cls = SymTab.ClChar)
  1212. OR (cls
  1213. = SymTab.ClEnum)
  1214. OR (cls
  1215. = SymTab.ClSet)
  1216. OR (cls
  1217. = SymTab.ClPtr) THEN
  1218. IF doLoad THEN
  1219. MGen.PushVar(n)
  1220. END
  1221. ELSIF (cls
  1222. = SymTab.ClArray)
  1223. OR (cls
  1224. = SymTab.ClRecord) THEN
  1225. IF doLoad THEN
  1226. MGen.PushAddr(n)
  1227. END
  1228. ELSIF t
  1229. = SymTab.InvalidType THEN
  1230. IF doLoad THEN
  1231. MGen.PushInt(0)
  1232. END
  1233. ELSE SemError(230);
  1234. IF doLoad THEN
  1235. MGen.PushInt(0)
  1236. END
  1237. END
  1238. ELSE
  1239. IF doLoad THEN
  1240. IF k = SymTab.KindField THEN
  1241. MGen.WithAddr(n);
  1242. cls := SymTab.ClassOf(t);
  1243. IF (t
  1244. = SymTab.InvalidType)
  1245. OR (cls
  1246. = SymTab.ClArray)
  1247. OR (cls
  1248. = SymTab.ClRecord) THEN
  1249. ELSE
  1250. IF (cls
  1251. = SymTab.ClChar)
  1252. OR (cls
  1253. = SymTab.ClBool) THEN
  1254. MGen.LoadByte
  1255. ELSE MGen.LoadIndir
  1256. END
  1257. END
  1258. ELSE MGen.PushInt(0)
  1259. END
  1260. END;
  1261. IF k = SymTab.KindField THEN
  1262. ELSIF k
  1263. = SymTab.KindImport THEN
  1264. SemError(230)
  1265. END
  1266. END
  1267. END;;
  1268. END DesignHead;
  1269. PROCEDURE WriteStrStat;
  1270. VAR t: SymTab.TypeIndex;
  1271. lx: MGen.LitStr;
  1272. v: BOOLEAN;
  1273. vn: SymTab.Name;
  1274. BEGIN
  1275. Expect(53);
  1276. Expect(17);
  1277. Expr(t, lx, v, vn);
  1278. Expect(18);
  1279. IF t = SymTab.InvalidType THEN
  1280. MGen.Drop
  1281. ELSIF (SymTab.ClassOf(t)
  1282. = SymTab.ClStr) THEN
  1283. MGen.PushInt(1);
  1284. MGen.SysCall
  1285. ELSIF (SymTab.ClassOf(t)
  1286. = SymTab.ClArray)
  1287. & (SymTab.ClassOf(
  1288. SymTab.ArrayElem(t))
  1289. = SymTab.ClChar) THEN
  1290. MGen.PushInt(1);
  1291. MGen.SysCall
  1292. ELSE
  1293. SemError(210);
  1294. MGen.Drop
  1295. END;;
  1296. END WriteStrStat;
  1297. PROCEDURE WriteIntStat;
  1298. VAR t: SymTab.TypeIndex;
  1299. lx: MGen.LitStr;
  1300. v: BOOLEAN;
  1301. vn: SymTab.Name;
  1302. BEGIN
  1303. Expect(52);
  1304. Expect(17);
  1305. Expr(t, lx, v, vn);
  1306. Expect(18);
  1307. IF t = SymTab.InvalidType THEN
  1308. MGen.Drop
  1309. ELSIF ~SymTab.IsIntFamily(t) THEN
  1310. SemError(210);
  1311. MGen.Drop
  1312. ELSE
  1313. MGen.CallPrint
  1314. END;;
  1315. END WriteIntStat;
  1316. PROCEDURE DispStat;
  1317. VAR dt: SymTab.TypeIndex;
  1318. dk: INTEGER;
  1319. bnD: SymTab.Name;
  1320. lxD: MGen.LitStr;
  1321. sfxD: BOOLEAN;
  1322. baseT: SymTab.TypeIndex;
  1323. slD: CARDINAL;
  1324. BEGIN
  1325. Expect(51);
  1326. Expect(17);
  1327. DesignHead(dt, dk, bnD, FALSE, lxD);
  1328. DesignTail(dt, dk, bnD, FALSE, lxD, sfxD);
  1329. Expect(18);
  1330. IF dt = SymTab.InvalidType THEN
  1331. IF sfxD THEN MGen.Drop END
  1332. ELSIF SymTab.ClassOf(dt)
  1333. # SymTab.ClPtr THEN
  1334. SemError(219);
  1335. IF sfxD THEN MGen.Drop END
  1336. ELSE
  1337. baseT := SymTab.PtrBase(dt);
  1338. slD := SymTab.TypeSlots(baseT);
  1339. IF slD = 0 THEN
  1340. SemError(230);
  1341. slD := 1
  1342. END;
  1343. IF ~sfxD THEN
  1344. IF (dk = SymTab.KindVar)
  1345. OR (dk
  1346. = SymTab.KindParam)
  1347. OR (dk
  1348. = SymTab.KindVarPar) THEN
  1349. MGen.PushAddr(bnD)
  1350. ELSIF dk
  1351. = SymTab.KindField THEN
  1352. MGen.WithAddr(bnD)
  1353. ELSE MGen.PushInt(0)
  1354. END
  1355. END;
  1356. MGen.PushBytes(slD * 8);
  1357. MGen.DeallocOp
  1358. END;;
  1359. END DispStat;
  1360. PROCEDURE NewStat;
  1361. VAR dt: SymTab.TypeIndex;
  1362. dk: INTEGER;
  1363. bnN: SymTab.Name;
  1364. lxN: MGen.LitStr;
  1365. sfxN: BOOLEAN;
  1366. baseT: SymTab.TypeIndex;
  1367. slN: CARDINAL;
  1368. BEGIN
  1369. Expect(50);
  1370. Expect(17);
  1371. DesignHead(dt, dk, bnN, FALSE, lxN);
  1372. DesignTail(dt, dk, bnN, FALSE, lxN, sfxN);
  1373. Expect(18);
  1374. IF dt = SymTab.InvalidType THEN
  1375. IF sfxN THEN MGen.Drop END
  1376. ELSIF SymTab.ClassOf(dt)
  1377. # SymTab.ClPtr THEN
  1378. SemError(219);
  1379. IF sfxN THEN MGen.Drop END
  1380. ELSE
  1381. baseT := SymTab.PtrBase(dt);
  1382. slN := SymTab.TypeSlots(baseT);
  1383. IF slN = 0 THEN
  1384. SemError(230);
  1385. slN := 1
  1386. END;
  1387. IF ~sfxN THEN
  1388. IF (dk = SymTab.KindVar)
  1389. OR (dk
  1390. = SymTab.KindParam)
  1391. OR (dk
  1392. = SymTab.KindVarPar) THEN
  1393. MGen.PushAddr(bnN)
  1394. ELSIF dk
  1395. = SymTab.KindField THEN
  1396. MGen.WithAddr(bnN)
  1397. ELSE MGen.PushInt(0)
  1398. END
  1399. END;
  1400. MGen.PushBytes(slN * 8);
  1401. MGen.AllocOp
  1402. END;;
  1403. END NewStat;
  1404. PROCEDURE ReturnStat;
  1405. VAR t: SymTab.TypeIndex;
  1406. lx: MGen.LitStr;
  1407. v: BOOLEAN;
  1408. vn: SymTab.Name;
  1409. hasE, doRet, conv: BOOLEAN;
  1410. BEGIN
  1411. Expect(49);
  1412. hasE := FALSE;;
  1413. IF In(symSet[1], sym) THEN
  1414. Expr(t, lx, v, vn);
  1415. hasE := TRUE;
  1416. doRet := FALSE;
  1417. IF ~SymTab.InProc() THEN
  1418. SemError(232)
  1419. ELSIF ~SymTab.InFunction() THEN
  1420. SemError(232)
  1421. ELSIF ~SymTab.Assignable(
  1422. t, SymTab.CurRet()) THEN
  1423. SemError(232)
  1424. ELSE doRet := TRUE
  1425. END;
  1426. conv := doRet
  1427. & SymTab.IsIntFamily(t)
  1428. & (SymTab.ClassOf(
  1429. SymTab.CurRet())
  1430. = SymTab.ClReal);
  1431. IF doRet THEN
  1432. IF conv THEN
  1433. MGen.IntToReal
  1434. END;
  1435. MGen.Leave(
  1436. SymTab.CurNPar(), TRUE)
  1437. ELSE MGen.Drop
  1438. END;;
  1439. END;
  1440. IF ~hasE THEN
  1441. IF ~SymTab.InProc() THEN
  1442. SemError(232)
  1443. ELSIF SymTab.InFunction() THEN
  1444. SemError(232)
  1445. ELSE MGen.Leave(
  1446. SymTab.CurNPar(), FALSE)
  1447. END
  1448. END;;
  1449. END ReturnStat;
  1450. PROCEDURE WithStat;
  1451. VAR dt: SymTab.TypeIndex;
  1452. dk: INTEGER;
  1453. bnW: SymTab.Name;
  1454. lxW: MGen.LitStr;
  1455. sfxW: BOOLEAN;
  1456. pushed: BOOLEAN;
  1457. BEGIN
  1458. Expect(48);
  1459. DesignHead(dt, dk, bnW, FALSE, lxW);
  1460. DesignTail(dt, dk, bnW, FALSE, lxW, sfxW);
  1461. pushed := FALSE;
  1462. IF dt = SymTab.InvalidType THEN
  1463. IF sfxW THEN MGen.Drop END
  1464. ELSIF SymTab.ClassOf(dt)
  1465. # SymTab.ClRecord THEN
  1466. SemError(215);
  1467. IF sfxW THEN MGen.Drop END
  1468. ELSE
  1469. IF ~sfxW THEN
  1470. IF (dk
  1471. = SymTab.KindVar)
  1472. OR (dk
  1473. = SymTab.KindParam)
  1474. OR (dk
  1475. = SymTab.KindVarPar) THEN
  1476. MGen.PushAddr(bnW)
  1477. ELSIF dk
  1478. = SymTab.KindField THEN
  1479. MGen.WithAddr(bnW)
  1480. ELSE MGen.PushInt(0)
  1481. END
  1482. END;
  1483. MGen.WithEnter(dt);
  1484. pushed :=
  1485. SymTab.PushRecord(dt);
  1486. IF ~pushed THEN
  1487. SemError(215)
  1488. END
  1489. END;;
  1490. Expect(41);
  1491. StatSeq;
  1492. Expect(10);
  1493. IF pushed THEN
  1494. SymTab.PopScope;
  1495. MGen.WithExit
  1496. END;;
  1497. END WithStat;
  1498. PROCEDURE ForStat;
  1499. VAR n, lv: SymTab.Name;
  1500. fk: INTEGER;
  1501. lo, hi: SymTab.TypeIndex;
  1502. lxLo, lxHi: MGen.LitStr;
  1503. vLo, vHi: BOOLEAN;
  1504. vnLo, vnHi: SymTab.Name;
  1505. byV, ht: INTEGER;
  1506. lTop, lChk, lEnd: INTEGER;
  1507. neg, storable: BOOLEAN;
  1508. BEGIN
  1509. Expect(45);
  1510. GetIdent(n);
  1511. IF ~SymTab.Lookup(n) THEN
  1512. SemError(201);
  1513. fk := -1
  1514. ELSIF (SymTab.SymKind(n) #
  1515. SymTab.KindVar)
  1516. & (SymTab.SymKind(n) #
  1517. SymTab.KindParam)
  1518. & (SymTab.SymKind(n) #
  1519. SymTab.KindVarPar)
  1520. & (SymTab.SymKind(n) #
  1521. SymTab.KindField) THEN
  1522. SemError(220);
  1523. fk := -1
  1524. ELSIF (SymTab.SymType(n) #
  1525. SymTab.InvalidType)
  1526. & ~SymTab.IsIntFamily(
  1527. SymTab.SymType(n)) THEN
  1528. SemError(220);
  1529. fk := -1
  1530. ELSE
  1531. fk := SymTab.SymKind(n)
  1532. END;
  1533. MGen.CopyName(n, lv);
  1534. storable := (fk = SymTab.KindVar)
  1535. OR (fk = SymTab.KindParam)
  1536. OR (fk = SymTab.KindVarPar);
  1537. IF storable THEN
  1538. MGen.StoreSetup(lv)
  1539. END;;
  1540. Expect(33);
  1541. Expr(lo, lxLo, vLo, vnLo);
  1542. IF (lo # SymTab.InvalidType)
  1543. & ~SymTab.IsIntFamily(lo) THEN
  1544. SemError(220) END;
  1545. IF storable THEN
  1546. MGen.StoreFinish(lv)
  1547. ELSE MGen.Drop
  1548. END;;
  1549. Expect(31);
  1550. Expr(hi, lxHi, vHi, vnHi);
  1551. IF (hi # SymTab.InvalidType)
  1552. & ~SymTab.IsIntFamily(hi) THEN
  1553. SemError(220) END;
  1554. ht := MGen.TempGlobal();
  1555. MGen.StoreTemp(ht);
  1556. byV := 1; neg := FALSE;;
  1557. IF (sym = 46) THEN
  1558. Get;
  1559. ByLit(byV);
  1560. neg := byV < 0;;
  1561. END;
  1562. Expect(41);
  1563. lTop := MGen.NewLabel();
  1564. lChk := MGen.NewLabel();
  1565. lEnd := MGen.NewLabel();
  1566. MGen.Jmp(lChk);
  1567. MGen.DefLabel(lTop);;
  1568. StatSeq;
  1569. Expect(10);
  1570. MGen.PushVar(lv);
  1571. MGen.PushInt(byV);
  1572. MGen.Add;
  1573. IF storable THEN
  1574. MGen.StoreFinish(lv)
  1575. ELSE MGen.Drop
  1576. END;
  1577. MGen.DefLabel(lChk);
  1578. MGen.PushVar(lv);
  1579. MGen.LoadTemp(ht);
  1580. IF neg THEN MGen.IGe
  1581. ELSE MGen.ILe END;
  1582. MGen.Jz(lEnd);
  1583. MGen.Jmp(lTop);
  1584. MGen.DefLabel(lEnd);;
  1585. END ForStat;
  1586. PROCEDURE LoopStat;
  1587. VAR topL, exitL: INTEGER;
  1588. BEGIN
  1589. Expect(44);
  1590. topL := MGen.NewLabel();
  1591. exitL := MGen.NewLabel();
  1592. MGen.DefLabel(topL);
  1593. MGen.PushLoop(exitL);;
  1594. StatSeq;
  1595. Expect(10);
  1596. MGen.Jmp(topL);
  1597. MGen.DefLabel(exitL);
  1598. MGen.PopLoop;;
  1599. END LoopStat;
  1600. PROCEDURE RepeatStat;
  1601. VAR t: SymTab.TypeIndex;
  1602. lxC: MGen.LitStr;
  1603. vC: BOOLEAN;
  1604. vnC: SymTab.Name;
  1605. topL: INTEGER;
  1606. BEGIN
  1607. Expect(42);
  1608. topL := MGen.NewLabel();
  1609. MGen.DefLabel(topL);;
  1610. StatSeq;
  1611. Expect(43);
  1612. Expr(t, lxC, vC, vnC);
  1613. IF ~SymTab.BoolCheck(t) THEN
  1614. SemError(214) END;
  1615. MGen.Jz(topL);;
  1616. END RepeatStat;
  1617. PROCEDURE WhileStat;
  1618. VAR t: SymTab.TypeIndex;
  1619. lxC: MGen.LitStr;
  1620. vC: BOOLEAN;
  1621. vnC: SymTab.Name;
  1622. topL, endL: INTEGER;
  1623. BEGIN
  1624. Expect(40);
  1625. topL := MGen.NewLabel();
  1626. endL := MGen.NewLabel();
  1627. MGen.DefLabel(topL);;
  1628. Expr(t, lxC, vC, vnC);
  1629. IF ~SymTab.BoolCheck(t) THEN
  1630. SemError(214) END;
  1631. MGen.Jz(endL);;
  1632. Expect(41);
  1633. StatSeq;
  1634. Expect(10);
  1635. MGen.Jmp(topL);
  1636. MGen.DefLabel(endL);;
  1637. END WhileStat;
  1638. PROCEDURE CaseStat;
  1639. VAR st: SymTab.TypeIndex;
  1640. lxS: MGen.LitStr;
  1641. vS: BOOLEAN;
  1642. vnS: SymTab.Name;
  1643. tmp, endL: INTEGER;
  1644. BEGIN
  1645. Expect(38);
  1646. Expr(st, lxS, vS, vnS);
  1647. tmp := MGen.TempGlobal();
  1648. MGen.StoreTemp(tmp);
  1649. endL := MGen.NewLabel();;
  1650. Expect(27);
  1651. Case(st, tmp, endL);
  1652. WHILE (sym = 39) DO
  1653. Get;
  1654. Case(st, tmp, endL);
  1655. END;
  1656. IF (sym = 37) THEN
  1657. Get;
  1658. StatSeq;
  1659. END;
  1660. Expect(10);
  1661. MGen.DefLabel(endL);;
  1662. END CaseStat;
  1663. PROCEDURE IfStat;
  1664. VAR t: SymTab.TypeIndex;
  1665. lxC: MGen.LitStr;
  1666. vC: BOOLEAN;
  1667. vnC: SymTab.Name;
  1668. elseL, endL: INTEGER;
  1669. hasElse: BOOLEAN;
  1670. BEGIN
  1671. Expect(34);
  1672. Expr(t, lxC, vC, vnC);
  1673. IF ~SymTab.BoolCheck(t) THEN
  1674. SemError(214) END;
  1675. elseL := MGen.NewLabel();
  1676. endL := MGen.NewLabel();
  1677. MGen.Jz(elseL);
  1678. hasElse := FALSE;;
  1679. Expect(35);
  1680. StatSeq;
  1681. WHILE (sym = 36) DO
  1682. Get;
  1683. MGen.Jmp(endL);
  1684. MGen.DefLabel(elseL);;
  1685. Expr(t, lxC, vC, vnC);
  1686. IF ~SymTab.BoolCheck(t) THEN
  1687. SemError(214) END;
  1688. elseL := MGen.NewLabel();
  1689. MGen.Jz(elseL);;
  1690. Expect(35);
  1691. StatSeq;
  1692. END;
  1693. IF (sym = 37) THEN
  1694. Get;
  1695. MGen.Jmp(endL);
  1696. MGen.DefLabel(elseL);
  1697. hasElse := TRUE;;
  1698. StatSeq;
  1699. END;
  1700. Expect(10);
  1701. IF ~hasElse THEN
  1702. MGen.DefLabel(elseL)
  1703. END;
  1704. MGen.DefLabel(endL);;
  1705. END IfStat;
  1706. PROCEDURE AssignOrCall;
  1707. VAR dt, et: SymTab.TypeIndex;
  1708. dk: INTEGER;
  1709. bn: SymTab.Name;
  1710. lxD, lxe: MGen.LitStr;
  1711. vE: BOOLEAN;
  1712. vnE: SymTab.Name;
  1713. sfx: BOOLEAN;
  1714. okC: BOOLEAN;
  1715. isR, conv,
  1716. storable, pushedDst,
  1717. pushedFld: BOOLEAN;
  1718. dstBytes, srcBytes: CARDINAL;
  1719. elemDt: SymTab.TypeIndex;
  1720. modBare: INTEGER;
  1721. BEGIN
  1722. sfx := FALSE; pushedDst := FALSE;
  1723. pushedFld := FALSE;;
  1724. DesignHead(dt, dk, bn, FALSE, lxD);
  1725. DesignTail(dt, dk, bn, FALSE, lxD, sfx);
  1726. IF (sym = 33) THEN
  1727. Get;
  1728. storable :=
  1729. (dk = SymTab.KindVar)
  1730. OR (dk = SymTab.KindParam)
  1731. OR (dk = SymTab.KindVarPar);
  1732. IF (dk = SymTab.KindField)
  1733. & (~sfx)
  1734. & (dt # SymTab.InvalidType) THEN
  1735. MGen.WithAddr(bn);
  1736. pushedFld := TRUE
  1737. END;
  1738. IF storable & ~sfx
  1739. & (dt # SymTab.InvalidType)
  1740. & ((SymTab.ClassOf(dt)
  1741. = SymTab.ClArray)
  1742. OR (SymTab.ClassOf(dt)
  1743. = SymTab.ClRecord)) THEN
  1744. MGen.PushAddr(bn);
  1745. pushedDst := TRUE
  1746. ELSIF ((dk = SymTab.KindVar)
  1747. OR (dk
  1748. = SymTab.KindParam)
  1749. OR (dk
  1750. = SymTab.KindVarPar)
  1751. OR (dk
  1752. = SymTab.KindField))
  1753. & sfx
  1754. & (dt # SymTab.InvalidType)
  1755. & ((SymTab.ClassOf(dt)
  1756. = SymTab.ClArray)
  1757. OR (SymTab.ClassOf(dt)
  1758. = SymTab.ClRecord)) THEN
  1759. pushedDst := TRUE
  1760. END;
  1761. IF storable & ~sfx
  1762. & ~pushedDst THEN
  1763. IF (dt # SymTab.InvalidType)
  1764. & (SymTab.TypeSlots(dt)
  1765. > 1) THEN
  1766. ELSE MGen.StoreSetup(bn)
  1767. END
  1768. END;;
  1769. Expr(et, lxe, vE, vnE);
  1770. IF (dt # SymTab.InvalidType)
  1771. & (dk # SymTab.KindVar)
  1772. & (dk # SymTab.KindParam)
  1773. & (dk # SymTab.KindVarPar)
  1774. & (dk # SymTab.KindField)
  1775. & (dk # SymTab.KindImport) THEN
  1776. SemError(210)
  1777. ELSIF pushedDst THEN
  1778. IF et = SymTab.InvalidType THEN
  1779. MGen.Drop; MGen.Drop
  1780. ELSIF (SymTab.ClassOf(dt)
  1781. = SymTab.ClArray)
  1782. & (SymTab.ClassOf(
  1783. SymTab.ArrayElem(dt))
  1784. = SymTab.ClChar)
  1785. & (SymTab.ClassOf(et)
  1786. = SymTab.ClStr) THEN
  1787. srcBytes :=
  1788. MGen.StrLenOf(lxe) + 1;
  1789. dstBytes :=
  1790. SymTab.TypeSlots(dt) * 8;
  1791. IF srcBytes > dstBytes THEN
  1792. SemError(210);
  1793. MGen.Drop; MGen.Drop
  1794. ELSE
  1795. MGen.PushBytes(srcBytes);
  1796. MGen.CopyBlock
  1797. END
  1798. ELSIF ~SymTab.Assignable(et,
  1799. dt) THEN
  1800. SemError(210);
  1801. MGen.Drop; MGen.Drop
  1802. ELSE
  1803. dstBytes :=
  1804. SymTab.TypeSlots(dt) * 8;
  1805. MGen.PushBytes(dstBytes);
  1806. MGen.CopyBlock
  1807. END
  1808. ELSIF pushedFld THEN
  1809. IF et = SymTab.InvalidType THEN
  1810. MGen.Drop; MGen.Drop
  1811. ELSIF (SymTab.TypeSlots(dt) > 1) THEN
  1812. IF (SymTab.ClassOf(dt)
  1813. = SymTab.ClArray)
  1814. & (SymTab.ClassOf(
  1815. SymTab.ArrayElem(dt))
  1816. = SymTab.ClChar)
  1817. & (SymTab.ClassOf(et)
  1818. = SymTab.ClStr) THEN
  1819. srcBytes :=
  1820. MGen.StrLenOf(lxe) + 1;
  1821. dstBytes :=
  1822. SymTab.TypeSlots(dt) * 8;
  1823. IF srcBytes > dstBytes THEN
  1824. SemError(210);
  1825. MGen.Drop; MGen.Drop
  1826. ELSE
  1827. MGen.PushBytes(srcBytes);
  1828. MGen.CopyBlock
  1829. END
  1830. ELSIF ~SymTab.Assignable(et,
  1831. dt) THEN
  1832. SemError(210);
  1833. MGen.Drop; MGen.Drop
  1834. ELSE
  1835. dstBytes :=
  1836. SymTab.TypeSlots(dt) * 8;
  1837. MGen.PushBytes(dstBytes);
  1838. MGen.CopyBlock
  1839. END
  1840. ELSE
  1841. IF ~SymTab.Assignable(et,
  1842. dt) THEN
  1843. SemError(210);
  1844. MGen.Drop; MGen.Drop
  1845. ELSE
  1846. isR :=
  1847. (SymTab.ClassOf(dt)
  1848. = SymTab.ClReal);
  1849. conv := isR
  1850. & SymTab.IsIntFamily(et);
  1851. IF conv THEN
  1852. MGen.IntToReal
  1853. END;
  1854. IF (SymTab.ClassOf(dt)
  1855. = SymTab.ClChar)
  1856. OR (SymTab.ClassOf(dt)
  1857. = SymTab.ClBool) THEN
  1858. MGen.StoreByte
  1859. ELSE MGen.StoreIndir0
  1860. END
  1861. END
  1862. END
  1863. ELSIF (dt # SymTab.InvalidType)
  1864. & ~sfx
  1865. & (SymTab.TypeSlots(dt) > 1) THEN
  1866. IF ~SymTab.Assignable(et, dt) THEN
  1867. SemError(210)
  1868. ELSE SemError(230)
  1869. END
  1870. ELSIF ~SymTab.Assignable(et, dt) THEN
  1871. SemError(210) END;
  1872. IF dk = SymTab.KindImport THEN
  1873. SemError(230)
  1874. END;
  1875. isR := (dt # SymTab.InvalidType)
  1876. & ~pushedDst
  1877. & ~pushedFld
  1878. & (SymTab.ClassOf(dt)
  1879. = SymTab.ClReal);
  1880. conv := isR
  1881. & SymTab.IsIntFamily(et);
  1882. IF pushedDst THEN
  1883. ELSIF pushedFld THEN
  1884. ELSIF (dt # SymTab.InvalidType)
  1885. & sfx THEN
  1886. IF conv THEN
  1887. MGen.IntToReal
  1888. END;
  1889. IF (SymTab.ClassOf(dt)
  1890. = SymTab.ClChar)
  1891. OR (SymTab.ClassOf(dt)
  1892. = SymTab.ClBool) THEN
  1893. MGen.StoreByte
  1894. ELSE MGen.StoreIndir0
  1895. END
  1896. ELSIF storable & ~sfx THEN
  1897. IF (dt # SymTab.InvalidType)
  1898. & (SymTab.TypeSlots(dt)
  1899. > 1) THEN
  1900. MGen.Drop
  1901. ELSE
  1902. IF conv THEN
  1903. MGen.IntToReal
  1904. END;
  1905. MGen.StoreFinish(bn)
  1906. END
  1907. ELSE MGen.Drop
  1908. END;;
  1909. ELSIF (sym = 17) THEN
  1910. CallTail(bn, lxD, sfx, FALSE, okC, FALSE);
  1911. ELSIF In(symSet[3], sym) THEN
  1912. IF (SymTab.SymKind(bn)
  1913. = SymTab.KindModule)
  1914. & sfx
  1915. & (SymTab.StrLen(lxD) > 0) THEN
  1916. modBare := SymTab.ExpProc(bn,
  1917. lxD);
  1918. IF modBare < 0 THEN
  1919. IF SymTab.ExpKind(bn,
  1920. lxD) # -1 THEN
  1921. SemError(233)
  1922. END
  1923. ELSIF SymTab.ProcNParByNum(
  1924. modBare) # 0 THEN
  1925. SemError(233)
  1926. ELSE
  1927. MGen.CallProc(modBare);
  1928. IF SymTab.ProcRetByNum(
  1929. modBare)
  1930. # SymTab.InvalidType THEN
  1931. MGen.Drop
  1932. END
  1933. END
  1934. ELSE
  1935. MGen.ActBegin(bn);
  1936. IF MGen.ActEnd(bn, FALSE,
  1937. FALSE) # 0 THEN
  1938. SemError(233)
  1939. END
  1940. END;;
  1941. ELSE SynError(84);
  1942. END;
  1943. END AssignOrCall;
  1944. PROCEDURE Stat;
  1945. VAR lx: INTEGER;
  1946. BEGIN
  1947. IF In(symSet[4], sym) THEN
  1948. CASE sym OF
  1949. 1 :
  1950. AssignOrCall;
  1951. | 34 :
  1952. IfStat;
  1953. | 38 :
  1954. CaseStat;
  1955. | 40 :
  1956. WhileStat;
  1957. | 42 :
  1958. RepeatStat;
  1959. | 44 :
  1960. LoopStat;
  1961. | 45 :
  1962. ForStat;
  1963. | 48 :
  1964. WithStat;
  1965. | 49 :
  1966. ReturnStat;
  1967. | 50 :
  1968. NewStat;
  1969. | 51 :
  1970. DispStat;
  1971. | 52 :
  1972. WriteIntStat;
  1973. | 53 :
  1974. WriteStrStat;
  1975. | 32 :
  1976. Get;
  1977. IF MGen.TopLoop(lx) THEN
  1978. MGen.Jmp(lx)
  1979. ELSE SemError(230) END;;
  1980. END;
  1981. END;
  1982. END Stat;
  1983. PROCEDURE FieldIdents (rt: SymTab.TypeIndex);
  1984. VAR n: SymTab.Name;
  1985. BEGIN
  1986. GetIdent(n);
  1987. IF ~SymTab.FieldPending(rt, n)
  1988. THEN SemError(200) END;
  1989. WHILE (sym = 7) DO
  1990. Get;
  1991. GetIdent(n);
  1992. IF ~SymTab.FieldPending(rt, n)
  1993. THEN SemError(200) END;
  1994. END;
  1995. END FieldIdents;
  1996. PROCEDURE Field (rt: SymTab.TypeIndex);
  1997. VAR et: SymTab.TypeIndex;
  1998. BEGIN
  1999. IF (sym = 1) THEN
  2000. FieldIdents(rt);
  2001. Expect(15);
  2002. Type(et);
  2003. IF (et # SymTab.InvalidType)
  2004. & SymTab.IsOpen(et) THEN
  2005. SemError(230)
  2006. END;
  2007. SymTab.FixPendingF(rt, et);;
  2008. END;
  2009. END Field;
  2010. PROCEDURE FieldSeq (rt: SymTab.TypeIndex);
  2011. BEGIN
  2012. Field(rt);
  2013. WHILE (sym = 8) DO
  2014. Get;
  2015. Field(rt);
  2016. END;
  2017. END FieldSeq;
  2018. PROCEDURE Enum (VAR t: SymTab.TypeIndex);
  2019. VAR n: SymTab.Name;
  2020. ord: INTEGER;
  2021. BEGIN
  2022. Expect(17);
  2023. t := SymTab.NewEnum();
  2024. ord := 0;;
  2025. GetIdent(n);
  2026. IF ~SymTab.Enter(n,
  2027. SymTab.KindConst)
  2028. THEN SemError(200) END;
  2029. SymTab.SetSymType(n, t);
  2030. SymTab.EnumAdd(t);
  2031. MGen.DeclConstInt(n, ord);
  2032. INC(ord);;
  2033. WHILE (sym = 7) DO
  2034. Get;
  2035. GetIdent(n);
  2036. IF ~SymTab.Enter(n,
  2037. SymTab.KindConst)
  2038. THEN SemError(200) END;
  2039. SymTab.SetSymType(n, t);
  2040. SymTab.EnumAdd(t);
  2041. MGen.DeclConstInt(n, ord);
  2042. INC(ord);;
  2043. END;
  2044. Expect(18);
  2045. END Enum;
  2046. PROCEDURE PointerType (VAR t: SymTab.TypeIndex);
  2047. VAR b: SymTab.TypeIndex;
  2048. BEGIN
  2049. Expect(30);
  2050. Expect(31);
  2051. Type(b);
  2052. t := SymTab.NewPtr(b);;
  2053. END PointerType;
  2054. PROCEDURE SetType (VAR t: SymTab.TypeIndex);
  2055. VAR s: SymTab.TypeIndex;
  2056. BEGIN
  2057. Expect(29);
  2058. Expect(27);
  2059. SimpleType(s);
  2060. IF (s # SymTab.InvalidType)
  2061. & (SymTab.ClassOf(s) #
  2062. SymTab.ClInt)
  2063. & (SymTab.ClassOf(s) #
  2064. SymTab.ClChar)
  2065. & (SymTab.ClassOf(s) #
  2066. SymTab.ClEnum) THEN
  2067. SemError(224) END;
  2068. t := SymTab.NewSet(s);;
  2069. END SetType;
  2070. PROCEDURE RecordType (VAR t: SymTab.TypeIndex);
  2071. BEGIN
  2072. Expect(28);
  2073. t := SymTab.NewRecord();;
  2074. FieldSeq(t);
  2075. Expect(10);
  2076. END RecordType;
  2077. PROCEDURE ArrayType (VAR t: SymTab.TypeIndex);
  2078. VAR s, s2, e: SymTab.TypeIndex;
  2079. idx: ARRAY [0 .. 7] OF
  2080. SymTab.TypeIndex;
  2081. nc, kk: CARDINAL;
  2082. loA, hiA: INTEGER;
  2083. isOpenA: BOOLEAN;
  2084. BEGIN
  2085. Expect(26);
  2086. IF (sym = 1) OR (sym = 17) OR (sym = 23) OR (sym = 27) THEN
  2087. IF (sym = 1) OR (sym = 17) OR (sym = 23) THEN
  2088. SimpleType(s);
  2089. IF (s # SymTab.InvalidType)
  2090. & (SymTab.ClassOf(s) #
  2091. SymTab.ClInt)
  2092. & (SymTab.ClassOf(s) #
  2093. SymTab.ClChar)
  2094. & (SymTab.ClassOf(s) #
  2095. SymTab.ClEnum) THEN
  2096. SemError(224) END;
  2097. nc := 0; isOpenA := FALSE;
  2098. idx[nc] := s; INC(nc);;
  2099. WHILE (sym = 7) DO
  2100. Get;
  2101. SimpleType(s2);
  2102. IF (s2 # SymTab.InvalidType)
  2103. & (SymTab.ClassOf(s2) #
  2104. SymTab.ClInt)
  2105. & (SymTab.ClassOf(s2) #
  2106. SymTab.ClChar)
  2107. & (SymTab.ClassOf(s2) #
  2108. SymTab.ClEnum) THEN
  2109. SemError(224) END;
  2110. IF nc <= HIGH(idx) THEN
  2111. idx[nc] := s2; INC(nc)
  2112. END;;
  2113. END;
  2114. ELSE
  2115. nc := 0; isOpenA := TRUE;;
  2116. END;
  2117. END;
  2118. Expect(27);
  2119. Type(e);
  2120. IF isOpenA THEN
  2121. t := SymTab.NewOpen(e)
  2122. ELSE
  2123. t := e;
  2124. kk := nc;
  2125. WHILE kk > 0 DO
  2126. DEC(kk);
  2127. loA := SymTab.TypeLo(idx[kk]);
  2128. hiA := SymTab.TypeHi(idx[kk]);
  2129. IF SymTab.TypeLen(idx[kk]) = 0 THEN
  2130. IF idx[kk]
  2131. # SymTab.InvalidType THEN
  2132. SemError(230)
  2133. END;
  2134. loA := 0; hiA := -1
  2135. END;
  2136. t := SymTab.NewArrayB(t,
  2137. loA, hiA)
  2138. END
  2139. END;;
  2140. END ArrayType;
  2141. PROCEDURE SimpleType (VAR t: SymTab.TypeIndex);
  2142. VAR t1, t2: SymTab.TypeIndex;
  2143. lx1, lx2: MGen.LitStr;
  2144. vD: BOOLEAN;
  2145. vnD: SymTab.Name;
  2146. loI, hiI: INTEGER;
  2147. lok, hik: BOOLEAN;
  2148. BEGIN
  2149. IF (sym = 1) THEN
  2150. QualIdent(t);
  2151. IF (sym = 23) THEN
  2152. Get;
  2153. MGen.NoEmitEnter; lok := FALSE; hik := FALSE;
  2154. loI := 0; hiI := -1;;
  2155. ConstExpr(t1, lx1);
  2156. IF (t1 # SymTab.InvalidType)
  2157. & (SymTab.ClassOf(t1) #
  2158. SymTab.ClInt)
  2159. & (SymTab.ClassOf(t1) #
  2160. SymTab.ClChar)
  2161. & (SymTab.ClassOf(t1) #
  2162. SymTab.ClEnum) THEN
  2163. SemError(224) END;;
  2164. Expect(24);
  2165. ConstExpr(t2, lx2);
  2166. IF (t2 # SymTab.InvalidType)
  2167. & (SymTab.ClassOf(t2) #
  2168. SymTab.ClInt)
  2169. & (SymTab.ClassOf(t2) #
  2170. SymTab.ClChar)
  2171. & (SymTab.ClassOf(t2) #
  2172. SymTab.ClEnum) THEN
  2173. SemError(224) END;;
  2174. Expect(25);
  2175. IF (t1 # SymTab.InvalidType)
  2176. & (t2 # SymTab.InvalidType) THEN
  2177. IF MGen.IsLit(lx1) THEN
  2178. IF SymTab.ClassOf(t1)
  2179. = SymTab.ClChar THEN
  2180. loI := MGen.CharOrd(lx1);
  2181. lok := TRUE
  2182. ELSIF MGen.ParseInt(lx1, loI) THEN
  2183. lok := TRUE
  2184. END
  2185. END;
  2186. IF MGen.IsLit(lx2) THEN
  2187. IF SymTab.ClassOf(t2)
  2188. = SymTab.ClChar THEN
  2189. hiI := MGen.CharOrd(lx2);
  2190. hik := TRUE
  2191. ELSIF MGen.ParseInt(lx2, hiI) THEN
  2192. hik := TRUE
  2193. END
  2194. END
  2195. END;
  2196. IF lok & hik THEN
  2197. t := SymTab.NewSubB(t1, loI, hiI)
  2198. ELSE
  2199. t := SymTab.NewSub(t1);
  2200. IF (t1 # SymTab.InvalidType)
  2201. & (t2 # SymTab.InvalidType) THEN
  2202. SemError(230)
  2203. END
  2204. END;
  2205. MGen.NoEmitExit;;
  2206. END;
  2207. ELSIF (sym = 23) THEN
  2208. Get;
  2209. MGen.NoEmitEnter; lok := FALSE;
  2210. hik := FALSE; loI := 0; hiI := -1;;
  2211. ConstExpr(t1, lx1);
  2212. IF (t1 # SymTab.InvalidType)
  2213. & (SymTab.ClassOf(t1) #
  2214. SymTab.ClInt)
  2215. & (SymTab.ClassOf(t1) #
  2216. SymTab.ClChar)
  2217. & (SymTab.ClassOf(t1) #
  2218. SymTab.ClEnum) THEN
  2219. SemError(224) END;;
  2220. Expect(24);
  2221. ConstExpr(t2, lx2);
  2222. IF (t2 # SymTab.InvalidType)
  2223. & (SymTab.ClassOf(t2) #
  2224. SymTab.ClInt)
  2225. & (SymTab.ClassOf(t2) #
  2226. SymTab.ClChar)
  2227. & (SymTab.ClassOf(t2) #
  2228. SymTab.ClEnum) THEN
  2229. SemError(224) END;;
  2230. Expect(25);
  2231. IF (t1 # SymTab.InvalidType)
  2232. & (t2 # SymTab.InvalidType) THEN
  2233. IF MGen.IsLit(lx1) THEN
  2234. IF SymTab.ClassOf(t1)
  2235. = SymTab.ClChar THEN
  2236. loI := MGen.CharOrd(lx1);
  2237. lok := TRUE
  2238. ELSIF MGen.ParseInt(lx1,
  2239. loI) THEN
  2240. lok := TRUE
  2241. END
  2242. END;
  2243. IF MGen.IsLit(lx2) THEN
  2244. IF SymTab.ClassOf(t2)
  2245. = SymTab.ClChar THEN
  2246. hiI := MGen.CharOrd(lx2);
  2247. hik := TRUE
  2248. ELSIF MGen.ParseInt(lx2,
  2249. hiI) THEN
  2250. hik := TRUE
  2251. END
  2252. END
  2253. END;
  2254. IF lok & hik THEN
  2255. t := SymTab.NewSubB(t1, loI, hiI)
  2256. ELSE
  2257. t := SymTab.NewSub(t1);
  2258. IF (t1 # SymTab.InvalidType)
  2259. & (t2 # SymTab.InvalidType) THEN
  2260. SemError(230)
  2261. END
  2262. END;
  2263. MGen.NoEmitExit;;
  2264. ELSIF (sym = 17) THEN
  2265. Enum(t);
  2266. ELSE SynError(85);
  2267. END;
  2268. END SimpleType;
  2269. PROCEDURE FPSection;
  2270. VAR isV: BOOLEAN;
  2271. nn, i: CARDINAL;
  2272. pn: ARRAY [0 .. 15] OF SymTab.Name;
  2273. n: SymTab.Name;
  2274. t: SymTab.TypeIndex;
  2275. BEGIN
  2276. isV := FALSE; nn := 0;;
  2277. IF (sym = 13) THEN
  2278. Get;
  2279. isV := TRUE;;
  2280. END;
  2281. GetIdent(n);
  2282. IF nn <= HIGH(pn) THEN
  2283. MGen.CopyName(n, pn[nn])
  2284. END;
  2285. INC(nn);;
  2286. WHILE (sym = 7) DO
  2287. Get;
  2288. GetIdent(n);
  2289. IF nn <= HIGH(pn) THEN
  2290. MGen.CopyName(n, pn[nn])
  2291. END;
  2292. INC(nn);;
  2293. END;
  2294. Expect(15);
  2295. Type(t);
  2296. IF ~isV
  2297. & (t # SymTab.InvalidType)
  2298. & (SymTab.TypeSlots(t) > 1) THEN
  2299. SemError(230)
  2300. END;
  2301. i := 0;
  2302. WHILE i < nn DO
  2303. IF i <= HIGH(pn) THEN
  2304. IF ~SymTab.EnterParam(
  2305. pn[i], isV, t) THEN
  2306. SemError(200)
  2307. END
  2308. END;
  2309. INC(i)
  2310. END;;
  2311. END FPSection;
  2312. PROCEDURE QualIdent (VAR t: SymTab.TypeIndex);
  2313. VAR n, m: SymTab.Name;
  2314. BEGIN
  2315. GetIdent(n);
  2316. IF ~SymTab.Lookup(n) THEN
  2317. SemError(201);
  2318. t := SymTab.InvalidType
  2319. ELSIF SymTab.SymKind(n)
  2320. = SymTab.KindModule THEN
  2321. t := SymTab.InvalidType
  2322. ELSIF (SymTab.SymKind(n) #
  2323. SymTab.KindType)
  2324. & (SymTab.SymKind(n) #
  2325. SymTab.KindPredef)
  2326. & (SymTab.SymKind(n) #
  2327. SymTab.KindImport) THEN
  2328. SemError(221);
  2329. t := SymTab.InvalidType
  2330. ELSE t := SymTab.SymType(n) END;;
  2331. WHILE (sym = 22) DO
  2332. Get;
  2333. GetIdent(m);
  2334. IF SymTab.SymKind(n)
  2335. = SymTab.KindModule THEN
  2336. IF SymTab.ExpKind(n, m)
  2337. = SymTab.KindType THEN
  2338. t := SymTab.ExpType(n, m)
  2339. ELSIF SymTab.SelfKind(n, m)
  2340. = SymTab.KindType THEN
  2341. t := SymTab.SymType(m)
  2342. ELSE
  2343. IF SymTab.ExpKind(n, m) < 0 THEN
  2344. IF SymTab.SelfKind(n, m) < 0 THEN
  2345. SemError(201)
  2346. ELSE SemError(221)
  2347. END
  2348. ELSE SemError(221)
  2349. END;
  2350. t := SymTab.InvalidType
  2351. END
  2352. ELSE
  2353. t := SymTab.InvalidType
  2354. END;;
  2355. END;
  2356. END QualIdent;
  2357. PROCEDURE FormalParams;
  2358. BEGIN
  2359. FPSection;
  2360. WHILE (sym = 8) DO
  2361. Get;
  2362. FPSection;
  2363. END;
  2364. END FormalParams;
  2365. PROCEDURE VarIdents;
  2366. VAR n: SymTab.Name;
  2367. BEGIN
  2368. GetIdent(n);
  2369. IF ~SymTab.EnterPending(n,
  2370. SymTab.KindVar)
  2371. THEN SemError(200) END;
  2372. WHILE (sym = 7) DO
  2373. Get;
  2374. GetIdent(n);
  2375. IF ~SymTab.EnterPending(n,
  2376. SymTab.KindVar)
  2377. THEN SemError(200) END;
  2378. END;
  2379. END VarIdents;
  2380. PROCEDURE Type (VAR t: SymTab.TypeIndex);
  2381. BEGIN
  2382. IF (sym = 1) OR (sym = 17) OR (sym = 23) THEN
  2383. SimpleType(t);
  2384. ELSIF (sym = 26) THEN
  2385. ArrayType(t);
  2386. ELSIF (sym = 28) THEN
  2387. RecordType(t);
  2388. ELSIF (sym = 29) THEN
  2389. SetType(t);
  2390. ELSIF (sym = 30) THEN
  2391. PointerType(t);
  2392. ELSE SynError(86);
  2393. END;
  2394. END Type;
  2395. PROCEDURE Expr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr;
  2396. VAR v: BOOLEAN; VAR vn: SymTab.Name);
  2397. VAR t2: SymTab.TypeIndex;
  2398. tc, op: INTEGER;
  2399. lx2: MGen.LitStr;
  2400. v2: BOOLEAN;
  2401. vn2: SymTab.Name;
  2402. r: BOOLEAN;
  2403. BEGIN
  2404. SimExpr(t, lx, v, vn);
  2405. IF In(symSet[5], sym) THEN
  2406. Rel(op);
  2407. SimExpr(t2, lx2, v2, vn2);
  2408. lx[0] := 0C; v := FALSE; MGen.ClrStash();
  2409. IF op = SymTab.OpIn THEN
  2410. IF SymTab.InCheck(t, t2) THEN
  2411. t := SymTab.BoolType();
  2412. MGen.BitIn
  2413. ELSE SemError(222);
  2414. t := SymTab.InvalidType;
  2415. MGen.Drop; MGen.Drop; MGen.PushInt(0)
  2416. END
  2417. ELSIF (t # SymTab.InvalidType)
  2418. & (t2 # SymTab.InvalidType)
  2419. & (SymTab.ClassOf(t) = SymTab.ClArray)
  2420. & (SymTab.ClassOf(t2) = SymTab.ClArray)
  2421. & (SymTab.ClassOf(SymTab.ArrayElem(t)) = SymTab.ClChar)
  2422. & (SymTab.ClassOf(SymTab.ArrayElem(t2)) = SymTab.ClChar)
  2423. & ~SymTab.IsOpen(t) & ~SymTab.IsOpen(t2) THEN
  2424. t := SymTab.BoolType();
  2425. MGen.PushBytes(SymTab.TypeSlots(t) * 8);
  2426. MGen.PushBytes(SymTab.TypeSlots(t2) * 8);
  2427. MGen.StrComp;
  2428. IF op = SymTab.OpEq THEN MGen.Or; MGen.Not
  2429. ELSIF (op = SymTab.OpNeq1)
  2430. OR (op = SymTab.OpNeq2) THEN MGen.Or
  2431. ELSIF op = SymTab.OpLt THEN
  2432. MGen.Swap; MGen.Drop
  2433. ELSIF op = SymTab.OpLe THEN
  2434. MGen.Drop; MGen.Not
  2435. ELSIF op = SymTab.OpGt THEN
  2436. MGen.Drop
  2437. ELSE
  2438. MGen.Swap; MGen.Drop; MGen.Not
  2439. END
  2440. ELSIF (t # SymTab.InvalidType)
  2441. & (t2 # SymTab.InvalidType)
  2442. & ((SymTab.ClassOf(t) = SymTab.ClArray)
  2443. OR (SymTab.ClassOf(t) = SymTab.ClRecord)
  2444. OR (SymTab.ClassOf(t2) = SymTab.ClArray)
  2445. OR (SymTab.ClassOf(t2) = SymTab.ClRecord)) THEN
  2446. SemError(213); t := SymTab.InvalidType;
  2447. MGen.Drop; MGen.Drop; MGen.PushInt(0)
  2448. ELSE
  2449. tc := SymTab.ClassOf(t);
  2450. IF SymTab.RelCheck(t, t2, op) THEN
  2451. t := SymTab.BoolType()
  2452. ELSE SemError(213); t := SymTab.InvalidType END;
  2453. IF t # SymTab.InvalidType THEN
  2454. r := tc = SymTab.ClReal;
  2455. IF r THEN
  2456. IF op = SymTab.OpEq THEN MGen.RealEq
  2457. ELSIF (op = SymTab.OpNeq1)
  2458. OR (op = SymTab.OpNeq2) THEN MGen.RealNe
  2459. ELSIF op = SymTab.OpLt THEN MGen.RealLt
  2460. ELSIF op = SymTab.OpLe THEN MGen.RealLe
  2461. ELSIF op = SymTab.OpGt THEN MGen.RealGt
  2462. ELSE MGen.RealGe END
  2463. ELSE
  2464. IF op = SymTab.OpEq THEN MGen.Eq
  2465. ELSIF (op = SymTab.OpNeq1)
  2466. OR (op = SymTab.OpNeq2) THEN MGen.Neq
  2467. ELSIF op = SymTab.OpLt THEN MGen.ILt
  2468. ELSIF op = SymTab.OpLe THEN MGen.ILe
  2469. ELSIF op = SymTab.OpGt THEN MGen.IGt
  2470. ELSE MGen.IGe END
  2471. END
  2472. ELSE MGen.Drop; MGen.Drop; MGen.PushInt(0)
  2473. END
  2474. END;;
  2475. END;
  2476. END Expr;
  2477. PROCEDURE ConstExpr (VAR t: SymTab.TypeIndex; VAR lx: MGen.LitStr);
  2478. VAR vD: BOOLEAN;
  2479. vnD: SymTab.Name;
  2480. BEGIN
  2481. Expr(t, lx, vD, vnD);
  2482. END ConstExpr;
  2483. PROCEDURE ModuleDecl;
  2484. VAR n, m, e: SymTab.Name;
  2485. noMod, enterOk,
  2486. hasInit: BOOLEAN;
  2487. initL, initN: INTEGER;
  2488. BEGIN
  2489. Expect(20);
  2490. noMod := SymTab.InProc()
  2491. OR SymTab.InModule();
  2492. enterOk := FALSE;
  2493. hasInit := FALSE;;
  2494. GetIdent(n);
  2495. IF noMod THEN
  2496. SemError(230)
  2497. ELSIF ~SymTab.EnterModule(n) THEN
  2498. SemError(200)
  2499. ELSE
  2500. enterOk := TRUE
  2501. END;;
  2502. IF (sym = 21) THEN
  2503. Get;
  2504. GetIdent(e);
  2505. IF ~noMod & enterOk THEN
  2506. IF ~SymTab.ModuleAddExp(e) THEN
  2507. SemError(200)
  2508. END
  2509. END;;
  2510. WHILE (sym = 7) DO
  2511. Get;
  2512. GetIdent(e);
  2513. IF ~noMod & enterOk THEN
  2514. IF ~SymTab.ModuleAddExp(e) THEN
  2515. SemError(200)
  2516. END
  2517. END;;
  2518. END;
  2519. END;
  2520. Expect(8);
  2521. WHILE (sym = 11) OR (sym = 12) OR (sym = 13) OR (sym = 16) OR (sym = 20) DO
  2522. Declaration;
  2523. END;
  2524. IF (sym = 9) THEN
  2525. Get;
  2526. hasInit := TRUE;
  2527. IF ~noMod & enterOk THEN
  2528. initL := MGen.NewLabel();
  2529. MGen.Jmp(initL);
  2530. initN := MGen.ModInitBegin();
  2531. IF initN < 0 THEN
  2532. SemError(230)
  2533. END
  2534. END;;
  2535. StatSeq;
  2536. END;
  2537. Expect(10);
  2538. GetIdent(m);
  2539. IF ~SymTab.Equal(n, m) THEN
  2540. SemError(202)
  2541. END;
  2542. IF hasInit & ~noMod & enterOk THEN
  2543. MGen.ModInitEnd(initN);
  2544. MGen.DefLabel(initL)
  2545. END;
  2546. IF ~noMod & enterOk THEN
  2547. IF ~SymTab.ExitModule() THEN
  2548. SemError(201)
  2549. END
  2550. END;;
  2551. END ModuleDecl;
  2552. PROCEDURE ProcedureDecl;
  2553. VAR n, m: SymTab.Name;
  2554. rt: SymTab.TypeIndex;
  2555. hasR, ok: BOOLEAN;
  2556. endL: INTEGER;
  2557. BEGIN
  2558. Expect(16);
  2559. hasR := FALSE;;
  2560. GetIdent(n);
  2561. IF SymTab.IsForward(n) THEN
  2562. SymTab.ReuseProc(n)
  2563. ELSIF ~SymTab.EnterProc(n) THEN
  2564. SemError(200)
  2565. END;
  2566. SymTab.OpenProcScope;
  2567. endL := MGen.NewLabel();
  2568. MGen.Jmp(endL);;
  2569. IF (sym = 17) THEN
  2570. Get;
  2571. FormalParams;
  2572. Expect(18);
  2573. END;
  2574. IF (sym = 15) THEN
  2575. Get;
  2576. QualIdent(rt);
  2577. hasR := TRUE;;
  2578. END;
  2579. IF hasR THEN
  2580. ok := SymTab.SetProcRet(rt)
  2581. ELSE
  2582. ok := SymTab.SetProcRet(
  2583. SymTab.InvalidType)
  2584. END;
  2585. IF ~ok THEN SemError(231) END;
  2586. IF ~SymTab.VerifyProc() THEN
  2587. SemError(231)
  2588. END;;
  2589. Expect(8);
  2590. IF In(symSet[6], sym) THEN
  2591. Block(TRUE);
  2592. GetIdent(m);
  2593. IF ~SymTab.Equal(n, m) THEN
  2594. SemError(202) END;
  2595. MGen.DefLabel(endL);
  2596. SymTab.CloseProc;;
  2597. ELSIF (sym = 19) THEN
  2598. Get;
  2599. SymTab.SetForward;
  2600. SymTab.CloseProc;
  2601. MGen.DefLabel(endL);;
  2602. ELSE SynError(87);
  2603. END;
  2604. END ProcedureDecl;
  2605. PROCEDURE VarDecl;
  2606. VAR t: SymTab.TypeIndex;
  2607. i: CARDINAL;
  2608. nm: SymTab.Name;
  2609. cls: INTEGER;
  2610. sl: CARDINAL;
  2611. BEGIN
  2612. VarIdents;
  2613. Expect(15);
  2614. Type(t);
  2615. cls := SymTab.ClassOf(t);
  2616. IF (cls # SymTab.ClInt)
  2617. & (cls # SymTab.ClReal)
  2618. & (cls # SymTab.ClBool)
  2619. & (cls # SymTab.ClChar)
  2620. & (cls # SymTab.ClEnum)
  2621. & (cls # SymTab.ClSet)
  2622. & (cls # SymTab.ClArray)
  2623. & (cls # SymTab.ClRecord)
  2624. & (cls # SymTab.ClPtr) THEN
  2625. SemError(230)
  2626. END;
  2627. sl := SymTab.TypeSlots(t);
  2628. IF sl = 0 THEN
  2629. SemError(230);
  2630. sl := 1
  2631. END;
  2632. i := 0;
  2633. WHILE i < SymTab.PendCount() DO
  2634. SymTab.PendName(i, nm);
  2635. IF SymTab.SymDepth(nm) = 0 THEN
  2636. MGen.DeclVarSized(nm, sl)
  2637. END;
  2638. INC(i)
  2639. END;
  2640. SymTab.FixPending(t);;
  2641. END VarDecl;
  2642. PROCEDURE TypeDecl;
  2643. VAR n: SymTab.Name;
  2644. t0, t1: SymTab.TypeIndex;
  2645. BEGIN
  2646. GetIdent(n);
  2647. IF ~SymTab.Enter(n, SymTab.KindType)
  2648. THEN SemError(200) END;
  2649. t0 := SymTab.NewAlias();
  2650. SymTab.SetSymType(n, t0);;
  2651. Expect(14);
  2652. Type(t1);
  2653. IF t1 = t0 THEN SemError(223);
  2654. SymTab.SetTarget(t0,
  2655. SymTab.InvalidType)
  2656. ELSE SymTab.SetTarget(t0, t1) END;;
  2657. END TypeDecl;
  2658. PROCEDURE ConstDecl;
  2659. VAR n: SymTab.Name;
  2660. t: SymTab.TypeIndex;
  2661. lx: MGen.LitStr;
  2662. cls: INTEGER;
  2663. BEGIN
  2664. GetIdent(n);
  2665. IF ~SymTab.Enter(n, SymTab.KindConst)
  2666. THEN SemError(200) END;
  2667. Expect(14);
  2668. MGen.NoEmitEnter;;
  2669. ConstExpr(t, lx);
  2670. SymTab.SetSymType(n, t);
  2671. cls := SymTab.ClassOf(t);
  2672. IF cls = SymTab.ClStr THEN
  2673. SemError(230)
  2674. ELSIF ~MGen.IsLit(lx) THEN
  2675. SemError(230)
  2676. END;
  2677. MGen.DeclConst(n, lx, t);
  2678. MGen.NoEmitExit;;
  2679. END ConstDecl;
  2680. PROCEDURE StatSeq;
  2681. BEGIN
  2682. Stat;
  2683. WHILE (sym = 8) DO
  2684. Get;
  2685. Stat;
  2686. END;
  2687. END StatSeq;
  2688. PROCEDURE Declaration;
  2689. BEGIN
  2690. IF (sym = 11) THEN
  2691. Get;
  2692. WHILE (sym = 1) DO
  2693. ConstDecl;
  2694. Expect(8);
  2695. END;
  2696. ELSIF (sym = 12) THEN
  2697. Get;
  2698. WHILE (sym = 1) DO
  2699. TypeDecl;
  2700. Expect(8);
  2701. END;
  2702. ELSIF (sym = 13) THEN
  2703. Get;
  2704. WHILE (sym = 1) DO
  2705. VarDecl;
  2706. Expect(8);
  2707. END;
  2708. ELSIF (sym = 16) THEN
  2709. ProcedureDecl;
  2710. Expect(8);
  2711. ELSIF (sym = 20) THEN
  2712. ModuleDecl;
  2713. Expect(8);
  2714. ELSE SynError(88);
  2715. END;
  2716. END Declaration;
  2717. PROCEDURE Block (isProc: BOOLEAN);
  2718. VAR began: BOOLEAN;
  2719. BEGIN
  2720. began := FALSE;;
  2721. WHILE (sym = 11) OR (sym = 12) OR (sym = 13) OR (sym = 16) OR (sym = 20) DO
  2722. Declaration;
  2723. END;
  2724. IF (sym = 9) THEN
  2725. Get;
  2726. began := TRUE;
  2727. IF isProc THEN
  2728. MGen.ProcEntry(
  2729. SymTab.CurProc(),
  2730. SymTab.ProcNLocals())
  2731. ELSE MGen.BeginBody
  2732. END;;
  2733. StatSeq;
  2734. END;
  2735. Expect(10);
  2736. IF isProc THEN
  2737. IF ~began THEN
  2738. MGen.ProcEntry(
  2739. SymTab.CurProc(),
  2740. SymTab.ProcNLocals())
  2741. END;
  2742. IF SymTab.InFunction() THEN
  2743. MGen.PushInt(0)
  2744. END;
  2745. MGen.Leave(SymTab.CurNPar(),
  2746. SymTab.InFunction())
  2747. END;;
  2748. END Block;
  2749. PROCEDURE ImpItem (mod: SymTab.Name);
  2750. VAR a: SymTab.Name;
  2751. k: INTEGER;
  2752. BEGIN
  2753. GetIdent(a);
  2754. IF ~SymTab.ImpBind(mod, a) THEN
  2755. SemError(201)
  2756. ELSE
  2757. k := SymTab.ExpKind(mod, a);
  2758. IF k = SymTab.KindType THEN
  2759. IF ~SymTab.Enter(a, k) THEN
  2760. SemError(200);
  2761. SymTab.ImpUnbind(a)
  2762. ELSE
  2763. SymTab.SetSymType(a,
  2764. SymTab.ExpType(mod, a))
  2765. END
  2766. ELSIF (k = SymTab.KindConst)
  2767. OR (k = SymTab.KindVar) THEN
  2768. IF ~SymTab.Enter(a, k) THEN
  2769. SemError(200);
  2770. SymTab.ImpUnbind(a)
  2771. ELSE
  2772. SymTab.SetSymType(a,
  2773. SymTab.ExpType(mod, a))
  2774. END
  2775. ELSIF k = SymTab.KindProc THEN
  2776. IF ~SymTab.EnterImpProc(a,
  2777. SymTab.ExpProc(mod, a)) THEN
  2778. SemError(200);
  2779. SymTab.ImpUnbind(a)
  2780. END
  2781. ELSE
  2782. SemError(221);
  2783. SymTab.ImpUnbind(a)
  2784. END
  2785. END;;
  2786. END ImpItem;
  2787. PROCEDURE GetIdent (VAR n: SymTab.Name);
  2788. BEGIN
  2789. Expect(1);
  2790. LexName(n);;
  2791. END GetIdent;
  2792. PROCEDURE Import;
  2793. VAR n: SymTab.Name;
  2794. BEGIN
  2795. IF (sym = 5) THEN
  2796. Get;
  2797. GetIdent(n);
  2798. IF ~SymTab.IsDefMod(n) THEN
  2799. SemError(201)
  2800. END;;
  2801. Expect(6);
  2802. ImpItem(n);
  2803. WHILE (sym = 7) DO
  2804. Get;
  2805. ImpItem(n);
  2806. END;
  2807. Expect(8);
  2808. ELSIF (sym = 6) THEN
  2809. Get;
  2810. GetIdent(n);
  2811. IF ~SymTab.IsDefMod(n) THEN
  2812. SemError(201)
  2813. END;;
  2814. WHILE (sym = 7) DO
  2815. Get;
  2816. GetIdent(n);
  2817. IF ~SymTab.IsDefMod(n) THEN
  2818. SemError(201)
  2819. END;;
  2820. END;
  2821. Expect(8);
  2822. ELSE SynError(89);
  2823. END;
  2824. END Import;
  2825. PROCEDURE ProgUnit;
  2826. VAR m1, m2: SymTab.Name;
  2827. BEGIN
  2828. Expect(20);
  2829. GetIdent(m1);
  2830. IF ~SymTab.NoteProgram() THEN
  2831. SemError(230)
  2832. END;
  2833. MGen.SetModName(m1);
  2834. IF ~SymTab.Enter(m1,
  2835. SymTab.KindModule)
  2836. THEN SemError(200) END;;
  2837. Expect(8);
  2838. WHILE (sym = 5) OR (sym = 6) DO
  2839. Import;
  2840. END;
  2841. Block(FALSE);
  2842. GetIdent(m2);
  2843. IF ~SymTab.Equal(m1, m2)
  2844. THEN SemError(202) END;;
  2845. Expect(22);
  2846. IF SymTab.AnyForward() THEN
  2847. SemError(231)
  2848. END;
  2849. MGen.EndModule;
  2850. SymTab.PrintTable;;
  2851. END ProgUnit;
  2852. PROCEDURE ImplUnit;
  2853. VAR m1, m2: SymTab.Name;
  2854. hasInit: BOOLEAN;
  2855. initL, initN: INTEGER;
  2856. BEGIN
  2857. Expect(76);
  2858. Expect(20);
  2859. GetIdent(m1);
  2860. hasInit := FALSE;
  2861. IF ~SymTab.OpenImplementation(m1)
  2862. THEN
  2863. SemError(201)
  2864. END;;
  2865. Expect(8);
  2866. WHILE (sym = 5) OR (sym = 6) DO
  2867. Import;
  2868. END;
  2869. WHILE (sym = 11) OR (sym = 12) OR (sym = 13) OR (sym = 16) OR (sym = 20) DO
  2870. Declaration;
  2871. END;
  2872. IF (sym = 9) THEN
  2873. Get;
  2874. hasInit := TRUE;
  2875. initL := MGen.NewLabel();
  2876. MGen.Jmp(initL);
  2877. initN := MGen.ModInitBegin();
  2878. IF initN < 0 THEN
  2879. SemError(230)
  2880. END;;
  2881. StatSeq;
  2882. END;
  2883. Expect(10);
  2884. GetIdent(m2);
  2885. IF ~SymTab.Equal(m1, m2) THEN
  2886. SemError(202)
  2887. END;
  2888. IF hasInit THEN
  2889. MGen.ModInitEnd(initN);
  2890. MGen.DefLabel(initL)
  2891. END;
  2892. IF ~SymTab.CloseImplementation()
  2893. THEN
  2894. SemError(231)
  2895. END;;
  2896. END ImplUnit;
  2897. PROCEDURE DefUnit;
  2898. VAR m1, m2: SymTab.Name;
  2899. BEGIN
  2900. Expect(75);
  2901. Expect(20);
  2902. GetIdent(m1);
  2903. IF ~SymTab.EnterModule(m1) THEN
  2904. SemError(200)
  2905. END;;
  2906. Expect(8);
  2907. WHILE (sym = 5) OR (sym = 6) DO
  2908. Import;
  2909. END;
  2910. WHILE (sym = 11) OR (sym = 12) OR (sym = 13) OR (sym = 16) DO
  2911. DefDecl;
  2912. END;
  2913. Expect(10);
  2914. GetIdent(m2);
  2915. IF ~SymTab.Equal(m1, m2) THEN
  2916. SemError(202)
  2917. END;
  2918. IF ~SymTab.ExitDefinition() THEN
  2919. SemError(230)
  2920. END;;
  2921. Expect(22);
  2922. END DefUnit;
  2923. PROCEDURE Unit;
  2924. BEGIN
  2925. IF (sym = 75) THEN
  2926. DefUnit;
  2927. ELSIF (sym = 76) THEN
  2928. ImplUnit;
  2929. ELSIF (sym = 20) THEN
  2930. ProgUnit;
  2931. ELSE SynError(90);
  2932. END;
  2933. END Unit;
  2934. PROCEDURE M2c;
  2935. BEGIN
  2936. Unit;
  2937. END M2c;
  2938. PROCEDURE Parse;
  2939. BEGIN
  2940. M2cS.Reset; Get;
  2941. M2c;
  2942. END Parse;
  2943. BEGIN
  2944. errDist := minErrDist;
  2945. symSet[ 0, 0] := BITSET{0};
  2946. symSet[ 0, 1] := BITSET{};
  2947. symSet[ 0, 2] := BITSET{};
  2948. symSet[ 0, 3] := BITSET{};
  2949. symSet[ 0, 4] := BITSET{};
  2950. symSet[ 1, 0] := BITSET{1, 2, 3, 4};
  2951. symSet[ 1, 1] := BITSET{1};
  2952. symSet[ 1, 2] := BITSET{15};
  2953. symSet[ 1, 3] := BITSET{14};
  2954. symSet[ 1, 4] := BITSET{6, 7, 8, 9};
  2955. symSet[ 2, 0] := BITSET{};
  2956. symSet[ 2, 1] := BITSET{};
  2957. symSet[ 2, 2] := BITSET{};
  2958. symSet[ 2, 3] := BITSET{};
  2959. symSet[ 2, 4] := BITSET{0, 1, 2, 3, 4, 5};
  2960. symSet[ 3, 0] := BITSET{8, 10};
  2961. symSet[ 3, 1] := BITSET{};
  2962. symSet[ 3, 2] := BITSET{4, 5, 7, 11};
  2963. symSet[ 3, 3] := BITSET{};
  2964. symSet[ 3, 4] := BITSET{};
  2965. symSet[ 4, 0] := BITSET{1};
  2966. symSet[ 4, 1] := BITSET{};
  2967. symSet[ 4, 2] := BITSET{0, 2, 6, 8, 10, 12, 13};
  2968. symSet[ 4, 3] := BITSET{0, 1, 2, 3, 4, 5};
  2969. symSet[ 4, 4] := BITSET{};
  2970. symSet[ 5, 0] := BITSET{14};
  2971. symSet[ 5, 1] := BITSET{};
  2972. symSet[ 5, 2] := BITSET{};
  2973. symSet[ 5, 3] := BITSET{7, 8, 9, 10, 11, 12, 13};
  2974. symSet[ 5, 4] := BITSET{};
  2975. symSet[ 6, 0] := BITSET{9, 10, 11, 12, 13};
  2976. symSet[ 6, 1] := BITSET{0, 4};
  2977. symSet[ 6, 2] := BITSET{};
  2978. symSet[ 6, 3] := BITSET{};
  2979. symSet[ 6, 4] := BITSET{};
  2980. END M2cP.