PascalP.mod 19 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097
  1. IMPLEMENTATION MODULE PascalP;
  2. (* Parser generated by Coco/R - assuming ISO IO library will be available. *)
  3. IMPORT PascalS, FileIO;
  4. CONST
  5. maxT = 62;
  6. minErrDist = 2; (* minimal distance (good tokens) between two errors *)
  7. setsize = 16; (* sets are stored in 16 bits *)
  8. TYPE
  9. SymbolSet = ARRAY [0 .. maxT DIV setsize] OF BITSET;
  10. VAR
  11. symSet: ARRAY [0 .. 4] OF SymbolSet; (*symSet[0] = allSyncSyms*)
  12. errDist: CARDINAL; (* number of symbols recognized since last error *)
  13. sym: CARDINAL; (* current input symbol *)
  14. PROCEDURE SemError (errNo: INTEGER);
  15. BEGIN
  16. IF errDist >= minErrDist THEN
  17. PascalS.Error(errNo, PascalS.line, PascalS.col, PascalS.pos);
  18. END;
  19. errDist := 0;
  20. END SemError;
  21. PROCEDURE SynError (errNo: INTEGER);
  22. BEGIN
  23. IF errDist >= minErrDist THEN
  24. PascalS.Error(errNo, PascalS.nextLine, PascalS.nextCol, PascalS.nextPos);
  25. END;
  26. errDist := 0;
  27. END SynError;
  28. PROCEDURE Get;
  29. VAR
  30. s: ARRAY [0 .. 31] OF CHAR;
  31. BEGIN
  32. REPEAT
  33. PascalS.Get(sym);
  34. IF sym <= maxT THEN
  35. INC(errDist);
  36. ELSE
  37. END;
  38. UNTIL sym <= maxT
  39. END Get;
  40. PROCEDURE In (VAR s: SymbolSet; x: CARDINAL): BOOLEAN;
  41. BEGIN
  42. RETURN x MOD setsize IN s[x DIV setsize];
  43. END In;
  44. PROCEDURE Expect (n: CARDINAL);
  45. BEGIN
  46. IF sym = n THEN Get ELSE SynError(n) END
  47. END Expect;
  48. PROCEDURE ExpectWeak (n, follow: CARDINAL);
  49. BEGIN
  50. IF sym = n
  51. THEN Get
  52. ELSE SynError(n); WHILE ~ In(symSet[follow], sym) DO Get END
  53. END
  54. END ExpectWeak;
  55. PROCEDURE WeakSeparator (n, syFol, repFol: CARDINAL): BOOLEAN;
  56. VAR
  57. s: SymbolSet;
  58. i: CARDINAL;
  59. BEGIN
  60. IF sym = n
  61. THEN Get; RETURN TRUE
  62. ELSIF In(symSet[repFol], sym) THEN RETURN FALSE
  63. ELSE
  64. i := 0;
  65. WHILE i <= maxT DIV setsize DO
  66. s[i] := symSet[0, i] + symSet[syFol, i] + symSet[repFol, i]; INC(i)
  67. END;
  68. SynError(n); WHILE ~ In(s, sym) DO Get END;
  69. RETURN In(symSet[syFol], sym)
  70. END
  71. END WeakSeparator;
  72. PROCEDURE LexName (VAR Lex: ARRAY OF CHAR);
  73. BEGIN
  74. PascalS.GetName(PascalS.pos, PascalS.len, Lex)
  75. END LexName;
  76. PROCEDURE LexString (VAR Lex: ARRAY OF CHAR);
  77. BEGIN
  78. PascalS.GetString(PascalS.pos, PascalS.len, Lex)
  79. END LexString;
  80. PROCEDURE LookAheadName (VAR Lex: ARRAY OF CHAR);
  81. BEGIN
  82. PascalS.GetName(PascalS.nextPos, PascalS.nextLen, Lex)
  83. END LookAheadName;
  84. PROCEDURE LookAheadString (VAR Lex: ARRAY OF CHAR);
  85. BEGIN
  86. PascalS.GetString(PascalS.nextPos, PascalS.nextLen, Lex)
  87. END LookAheadString;
  88. PROCEDURE Successful (): BOOLEAN;
  89. BEGIN
  90. RETURN PascalS.errors = 0
  91. END Successful;
  92. (* ----- FORWARD not needed in multipass compilers
  93. PROCEDURE Member; FORWARD;
  94. PROCEDURE ExpList; FORWARD;
  95. PROCEDURE SetConstructor; FORWARD;
  96. PROCEDURE UnsignedLiteral; FORWARD;
  97. PROCEDURE MulOp; FORWARD;
  98. PROCEDURE Factor; FORWARD;
  99. PROCEDURE AddOp; FORWARD;
  100. PROCEDURE Term; FORWARD;
  101. PROCEDURE RelOp; FORWARD;
  102. PROCEDURE SimpleExpression; FORWARD;
  103. PROCEDURE RecVarList; FORWARD;
  104. PROCEDURE ControlVariable; FORWARD;
  105. PROCEDURE CaseLabel; FORWARD;
  106. PROCEDURE OneCase; FORWARD;
  107. PROCEDURE CaseList; FORWARD;
  108. PROCEDURE OrdinalExpression; FORWARD;
  109. PROCEDURE BooleanExpression; FORWARD;
  110. PROCEDURE IntegerExpression; FORWARD;
  111. PROCEDURE FieldWidth; FORWARD;
  112. PROCEDURE ActualParameter; FORWARD;
  113. PROCEDURE ActualParams; FORWARD;
  114. PROCEDURE Expression; FORWARD;
  115. PROCEDURE Designator; FORWARD;
  116. PROCEDURE WithStatement; FORWARD;
  117. PROCEDURE ForStatement; FORWARD;
  118. PROCEDURE CaseStatement; FORWARD;
  119. PROCEDURE IfStatement; FORWARD;
  120. PROCEDURE RepeatStatement; FORWARD;
  121. PROCEDURE WhileStatement; FORWARD;
  122. PROCEDURE GotoStatement; FORWARD;
  123. PROCEDURE AssignmentOrCall; FORWARD;
  124. PROCEDURE Statement; FORWARD;
  125. PROCEDURE StatementSequence; FORWARD;
  126. PROCEDURE CompoundStatement; FORWARD;
  127. PROCEDURE IndexSpec; FORWARD;
  128. PROCEDURE IndexSpecList; FORWARD;
  129. PROCEDURE ParamType; FORWARD;
  130. PROCEDURE ParamGroup; FORWARD;
  131. PROCEDURE FormalSection; FORWARD;
  132. PROCEDURE ReturnType; FORWARD;
  133. PROCEDURE FormalParams; FORWARD;
  134. PROCEDURE Body; FORWARD;
  135. PROCEDURE FuncHeading; FORWARD;
  136. PROCEDURE ProcHeading; FORWARD;
  137. PROCEDURE VarDecl; FORWARD;
  138. PROCEDURE CaseLabelList; FORWARD;
  139. PROCEDURE Variant; FORWARD;
  140. PROCEDURE VariantSelector; FORWARD;
  141. PROCEDURE RecordSection; FORWARD;
  142. PROCEDURE VariantPart; FORWARD;
  143. PROCEDURE fixedPart; FORWARD;
  144. PROCEDURE FieldList; FORWARD;
  145. PROCEDURE IndexList; FORWARD;
  146. PROCEDURE FileType; FORWARD;
  147. PROCEDURE SetType; FORWARD;
  148. PROCEDURE RecordType; FORWARD;
  149. PROCEDURE ArrayType; FORWARD;
  150. PROCEDURE SubrangeType; FORWARD;
  151. PROCEDURE EnumerationType; FORWARD;
  152. PROCEDURE TypeIdent; FORWARD;
  153. PROCEDURE StructType; FORWARD;
  154. PROCEDURE SimpleType; FORWARD;
  155. PROCEDURE Type; FORWARD;
  156. PROCEDURE TypeDef; FORWARD;
  157. PROCEDURE UnsignedReal; FORWARD;
  158. PROCEDURE String; FORWARD;
  159. PROCEDURE ConstIdent; FORWARD;
  160. PROCEDURE UnsignedNumber; FORWARD;
  161. PROCEDURE Constant; FORWARD;
  162. PROCEDURE ConstDef; FORWARD;
  163. PROCEDURE UnsignedInt; FORWARD;
  164. PROCEDURE Label; FORWARD;
  165. PROCEDURE Labels; FORWARD;
  166. PROCEDURE ProcDeclarations; FORWARD;
  167. PROCEDURE VarDeclarations; FORWARD;
  168. PROCEDURE TypeDefinitions; FORWARD;
  169. PROCEDURE ConstDefinitions; FORWARD;
  170. PROCEDURE LabelDeclarations; FORWARD;
  171. PROCEDURE StatementPart; FORWARD;
  172. PROCEDURE DeclarationPart; FORWARD;
  173. PROCEDURE NewIdentList; FORWARD;
  174. PROCEDURE Block; FORWARD;
  175. PROCEDURE ExternalFiles; FORWARD;
  176. PROCEDURE NewIdent; FORWARD;
  177. PROCEDURE Pascal; FORWARD;
  178. ----- *)
  179. PROCEDURE Member;
  180. BEGIN
  181. Expression;
  182. IF (sym = 19) THEN
  183. Get;
  184. Expression;
  185. END;
  186. END Member;
  187. PROCEDURE ExpList;
  188. BEGIN
  189. Expression;
  190. WHILE (sym = 11) DO
  191. Get;
  192. Expression;
  193. END;
  194. END ExpList;
  195. PROCEDURE SetConstructor;
  196. BEGIN
  197. Expect(21);
  198. Member;
  199. WHILE (sym = 11) DO
  200. Get;
  201. Member;
  202. END;
  203. Expect(22);
  204. END SetConstructor;
  205. PROCEDURE UnsignedLiteral;
  206. BEGIN
  207. IF (sym = 2) OR (sym = 3) THEN
  208. UnsignedNumber;
  209. ELSIF (sym = 61) THEN
  210. Get;
  211. ELSIF (sym = 4) THEN
  212. String;
  213. ELSE SynError(63);
  214. END;
  215. END UnsignedLiteral;
  216. PROCEDURE MulOp;
  217. BEGIN
  218. IF (sym = 55) THEN
  219. Get;
  220. ELSIF (sym = 56) THEN
  221. Get;
  222. ELSIF (sym = 57) THEN
  223. Get;
  224. ELSIF (sym = 58) THEN
  225. Get;
  226. ELSIF (sym = 59) THEN
  227. Get;
  228. ELSE SynError(64);
  229. END;
  230. END MulOp;
  231. PROCEDURE Factor;
  232. BEGIN
  233. IF (sym = 1) THEN
  234. Designator;
  235. IF (sym = 8) THEN
  236. ActualParams;
  237. END;
  238. ELSIF (sym = 2) OR (sym = 3) OR (sym = 4) OR (sym = 61) THEN
  239. UnsignedLiteral;
  240. ELSIF (sym = 21) THEN
  241. SetConstructor;
  242. ELSIF (sym = 8) THEN
  243. Get;
  244. Expression;
  245. Expect(9);
  246. ELSIF (sym = 60) THEN
  247. Get;
  248. Factor;
  249. ELSE SynError(65);
  250. END;
  251. END Factor;
  252. PROCEDURE AddOp;
  253. BEGIN
  254. IF (sym = 14) THEN
  255. Get;
  256. ELSIF (sym = 15) THEN
  257. Get;
  258. ELSIF (sym = 54) THEN
  259. Get;
  260. ELSE SynError(66);
  261. END;
  262. END AddOp;
  263. PROCEDURE Term;
  264. BEGIN
  265. Factor;
  266. WHILE (sym = 55) OR (sym = 56) OR (sym = 57) OR (sym = 58) OR (sym = 59) DO
  267. MulOp;
  268. Factor;
  269. END;
  270. END Term;
  271. PROCEDURE RelOp;
  272. BEGIN
  273. CASE sym OF
  274. 13 :
  275. Get;
  276. | 48 :
  277. Get;
  278. | 49 :
  279. Get;
  280. | 50 :
  281. Get;
  282. | 51 :
  283. Get;
  284. | 52 :
  285. Get;
  286. | 53 :
  287. Get;
  288. ELSE SynError(67);
  289. END;
  290. END RelOp;
  291. PROCEDURE SimpleExpression;
  292. BEGIN
  293. IF (sym = 14) THEN
  294. Get;
  295. Term;
  296. ELSIF (sym = 15) THEN
  297. Get;
  298. Term;
  299. ELSIF In(symSet[1], sym) THEN
  300. Term;
  301. ELSE SynError(68);
  302. END;
  303. WHILE (sym = 14) OR (sym = 15) OR (sym = 54) DO
  304. AddOp;
  305. Term;
  306. END;
  307. END SimpleExpression;
  308. PROCEDURE RecVarList;
  309. BEGIN
  310. Designator;
  311. WHILE (sym = 11) DO
  312. Get;
  313. Designator;
  314. END;
  315. END RecVarList;
  316. PROCEDURE ControlVariable;
  317. BEGIN
  318. Expect(1);
  319. END ControlVariable;
  320. PROCEDURE CaseLabel;
  321. BEGIN
  322. Constant;
  323. END CaseLabel;
  324. PROCEDURE OneCase;
  325. BEGIN
  326. CaseLabelList;
  327. Expect(28);
  328. Statement;
  329. END OneCase;
  330. PROCEDURE CaseList;
  331. BEGIN
  332. OneCase;
  333. WHILE (sym = 6) DO
  334. Get;
  335. OneCase;
  336. END;
  337. IF (sym = 6) THEN
  338. Get;
  339. END;
  340. END CaseList;
  341. PROCEDURE OrdinalExpression;
  342. BEGIN
  343. Expression;
  344. END OrdinalExpression;
  345. PROCEDURE BooleanExpression;
  346. BEGIN
  347. Expression;
  348. END BooleanExpression;
  349. PROCEDURE IntegerExpression;
  350. BEGIN
  351. Expression;
  352. END IntegerExpression;
  353. PROCEDURE FieldWidth;
  354. BEGIN
  355. Expect(28);
  356. IntegerExpression;
  357. IF (sym = 28) THEN
  358. Get;
  359. IntegerExpression;
  360. END;
  361. END FieldWidth;
  362. PROCEDURE ActualParameter;
  363. BEGIN
  364. Expression;
  365. IF (sym = 28) THEN
  366. FieldWidth;
  367. END;
  368. END ActualParameter;
  369. PROCEDURE ActualParams;
  370. BEGIN
  371. Expect(8);
  372. ActualParameter;
  373. WHILE (sym = 11) DO
  374. Get;
  375. ActualParameter;
  376. END;
  377. Expect(9);
  378. END ActualParams;
  379. PROCEDURE Expression;
  380. BEGIN
  381. SimpleExpression;
  382. IF In(symSet[2], sym) THEN
  383. RelOp;
  384. SimpleExpression;
  385. END;
  386. END Expression;
  387. PROCEDURE Designator;
  388. BEGIN
  389. Expect(1);
  390. WHILE (sym = 7) OR (sym = 18) OR (sym = 21) DO
  391. IF (sym = 7) THEN
  392. Get;
  393. Expect(1);
  394. ELSIF (sym = 21) THEN
  395. Get;
  396. ExpList;
  397. Expect(22);
  398. ELSE
  399. Get;
  400. END;
  401. END;
  402. END Designator;
  403. PROCEDURE WithStatement;
  404. BEGIN
  405. Expect(47);
  406. RecVarList;
  407. Expect(38);
  408. Statement;
  409. END WithStatement;
  410. PROCEDURE ForStatement;
  411. BEGIN
  412. Expect(44);
  413. ControlVariable;
  414. Expect(35);
  415. OrdinalExpression;
  416. IF (sym = 45) THEN
  417. Get;
  418. ELSIF (sym = 46) THEN
  419. Get;
  420. ELSE SynError(69);
  421. END;
  422. OrdinalExpression;
  423. Expect(38);
  424. Statement;
  425. END ForStatement;
  426. PROCEDURE CaseStatement;
  427. BEGIN
  428. Expect(29);
  429. OrdinalExpression;
  430. Expect(23);
  431. CaseList;
  432. Expect(25);
  433. END CaseStatement;
  434. PROCEDURE IfStatement;
  435. BEGIN
  436. Expect(41);
  437. BooleanExpression;
  438. Expect(42);
  439. Statement;
  440. IF (sym = 43) THEN
  441. Get;
  442. Statement;
  443. END;
  444. END IfStatement;
  445. PROCEDURE RepeatStatement;
  446. BEGIN
  447. Expect(39);
  448. StatementSequence;
  449. Expect(40);
  450. BooleanExpression;
  451. END RepeatStatement;
  452. PROCEDURE WhileStatement;
  453. BEGIN
  454. Expect(37);
  455. BooleanExpression;
  456. Expect(38);
  457. Statement;
  458. END WhileStatement;
  459. PROCEDURE GotoStatement;
  460. BEGIN
  461. Expect(36);
  462. Label;
  463. END GotoStatement;
  464. PROCEDURE AssignmentOrCall;
  465. BEGIN
  466. Designator;
  467. IF (sym = 35) THEN
  468. Get;
  469. Expression;
  470. ELSIF (sym = 6) OR (sym = 8) OR (sym = 25) OR (sym = 40) OR (sym = 43) THEN
  471. IF (sym = 8) THEN
  472. ActualParams;
  473. END;
  474. ELSE SynError(70);
  475. END;
  476. END AssignmentOrCall;
  477. PROCEDURE Statement;
  478. BEGIN
  479. IF (sym = 2) THEN
  480. Label;
  481. Expect(28);
  482. END;
  483. IF In(symSet[3], sym) THEN
  484. CASE sym OF
  485. 1 :
  486. AssignmentOrCall;
  487. | 34 :
  488. CompoundStatement;
  489. | 36 :
  490. GotoStatement;
  491. | 37 :
  492. WhileStatement;
  493. | 39 :
  494. RepeatStatement;
  495. | 41 :
  496. IfStatement;
  497. | 29 :
  498. CaseStatement;
  499. | 44 :
  500. ForStatement;
  501. | 47 :
  502. WithStatement;
  503. END;
  504. END;
  505. END Statement;
  506. PROCEDURE StatementSequence;
  507. BEGIN
  508. Statement;
  509. WHILE (sym = 6) DO
  510. Get;
  511. Statement;
  512. END;
  513. END StatementSequence;
  514. PROCEDURE CompoundStatement;
  515. BEGIN
  516. Expect(34);
  517. StatementSequence;
  518. Expect(25);
  519. END CompoundStatement;
  520. PROCEDURE IndexSpec;
  521. BEGIN
  522. NewIdent;
  523. Expect(19);
  524. NewIdent;
  525. Expect(28);
  526. TypeIdent;
  527. END IndexSpec;
  528. PROCEDURE IndexSpecList;
  529. BEGIN
  530. IndexSpec;
  531. WHILE (sym = 6) DO
  532. Get;
  533. IndexSpec;
  534. END;
  535. END IndexSpecList;
  536. PROCEDURE ParamType;
  537. BEGIN
  538. IF (sym = 1) THEN
  539. TypeIdent;
  540. ELSIF (sym = 20) THEN
  541. Get;
  542. Expect(21);
  543. IndexSpecList;
  544. Expect(22);
  545. Expect(23);
  546. ParamType;
  547. ELSIF (sym = 17) THEN
  548. Get;
  549. Expect(20);
  550. Expect(21);
  551. IndexSpec;
  552. Expect(22);
  553. Expect(23);
  554. TypeIdent;
  555. ELSE SynError(71);
  556. END;
  557. END ParamType;
  558. PROCEDURE ParamGroup;
  559. BEGIN
  560. NewIdentList;
  561. Expect(28);
  562. ParamType;
  563. END ParamGroup;
  564. PROCEDURE FormalSection;
  565. BEGIN
  566. IF (sym = 1) OR (sym = 30) THEN
  567. IF (sym = 30) THEN
  568. Get;
  569. END;
  570. ParamGroup;
  571. ELSIF (sym = 31) THEN
  572. ProcHeading;
  573. ELSIF (sym = 32) THEN
  574. FuncHeading;
  575. ELSE SynError(72);
  576. END;
  577. END FormalSection;
  578. PROCEDURE ReturnType;
  579. BEGIN
  580. IF (sym = 28) THEN
  581. Get;
  582. TypeIdent;
  583. END;
  584. END ReturnType;
  585. PROCEDURE FormalParams;
  586. BEGIN
  587. Expect(8);
  588. FormalSection;
  589. WHILE (sym = 6) DO
  590. Get;
  591. FormalSection;
  592. END;
  593. Expect(9);
  594. END FormalParams;
  595. PROCEDURE Body;
  596. BEGIN
  597. IF In(symSet[4], sym) THEN
  598. Block;
  599. ELSIF (sym = 33) THEN
  600. Get;
  601. ELSE SynError(73);
  602. END;
  603. END Body;
  604. PROCEDURE FuncHeading;
  605. BEGIN
  606. Expect(32);
  607. NewIdent;
  608. IF (sym = 8) THEN
  609. FormalParams;
  610. END;
  611. ReturnType;
  612. END FuncHeading;
  613. PROCEDURE ProcHeading;
  614. BEGIN
  615. Expect(31);
  616. NewIdent;
  617. IF (sym = 8) THEN
  618. FormalParams;
  619. END;
  620. END ProcHeading;
  621. PROCEDURE VarDecl;
  622. BEGIN
  623. NewIdentList;
  624. Expect(28);
  625. Type;
  626. Expect(6);
  627. END VarDecl;
  628. PROCEDURE CaseLabelList;
  629. BEGIN
  630. CaseLabel;
  631. WHILE (sym = 11) DO
  632. Get;
  633. CaseLabel;
  634. END;
  635. END CaseLabelList;
  636. PROCEDURE Variant;
  637. BEGIN
  638. CaseLabelList;
  639. Expect(28);
  640. Expect(8);
  641. FieldList;
  642. Expect(9);
  643. END Variant;
  644. PROCEDURE VariantSelector;
  645. BEGIN
  646. IF (sym = 1) THEN
  647. NewIdent;
  648. Expect(28);
  649. END;
  650. TypeIdent;
  651. END VariantSelector;
  652. PROCEDURE RecordSection;
  653. BEGIN
  654. NewIdentList;
  655. Expect(28);
  656. Type;
  657. END RecordSection;
  658. PROCEDURE VariantPart;
  659. BEGIN
  660. Expect(29);
  661. VariantSelector;
  662. Expect(23);
  663. Variant;
  664. WHILE (sym = 6) DO
  665. Get;
  666. Variant;
  667. END;
  668. END VariantPart;
  669. PROCEDURE fixedPart;
  670. BEGIN
  671. RecordSection;
  672. WHILE (sym = 6) DO
  673. Get;
  674. RecordSection;
  675. END;
  676. END fixedPart;
  677. PROCEDURE FieldList;
  678. BEGIN
  679. IF (sym = 1) OR (sym = 29) THEN
  680. IF (sym = 1) THEN
  681. fixedPart;
  682. IF (sym = 6) THEN
  683. Get;
  684. VariantPart;
  685. END;
  686. ELSE
  687. VariantPart;
  688. END;
  689. IF (sym = 6) THEN
  690. Get;
  691. END;
  692. END;
  693. END FieldList;
  694. PROCEDURE IndexList;
  695. BEGIN
  696. SimpleType;
  697. WHILE (sym = 11) DO
  698. Get;
  699. SimpleType;
  700. END;
  701. END IndexList;
  702. PROCEDURE FileType;
  703. BEGIN
  704. Expect(27);
  705. Expect(23);
  706. Type;
  707. END FileType;
  708. PROCEDURE SetType;
  709. BEGIN
  710. Expect(26);
  711. Expect(23);
  712. SimpleType;
  713. END SetType;
  714. PROCEDURE RecordType;
  715. BEGIN
  716. Expect(24);
  717. FieldList;
  718. Expect(25);
  719. END RecordType;
  720. PROCEDURE ArrayType;
  721. BEGIN
  722. Expect(20);
  723. Expect(21);
  724. IndexList;
  725. Expect(22);
  726. Expect(23);
  727. Type;
  728. END ArrayType;
  729. PROCEDURE SubrangeType;
  730. BEGIN
  731. Constant;
  732. Expect(19);
  733. Constant;
  734. END SubrangeType;
  735. PROCEDURE EnumerationType;
  736. BEGIN
  737. Expect(8);
  738. NewIdentList;
  739. Expect(9);
  740. END EnumerationType;
  741. PROCEDURE TypeIdent;
  742. BEGIN
  743. Expect(1);
  744. END TypeIdent;
  745. PROCEDURE StructType;
  746. BEGIN
  747. IF (sym = 20) THEN
  748. ArrayType;
  749. ELSIF (sym = 24) THEN
  750. RecordType;
  751. ELSIF (sym = 26) THEN
  752. SetType;
  753. ELSIF (sym = 27) THEN
  754. FileType;
  755. ELSE SynError(74);
  756. END;
  757. END StructType;
  758. PROCEDURE SimpleType;
  759. BEGIN
  760. IF (sym = 1) THEN
  761. TypeIdent;
  762. ELSIF (sym = 8) THEN
  763. EnumerationType;
  764. ELSIF (sym < 16) (* prevent range error *) AND
  765. (sym IN BITSET{1, 2, 3, 4, 14, 15}) THEN
  766. SubrangeType;
  767. ELSE SynError(75);
  768. END;
  769. END SimpleType;
  770. PROCEDURE Type;
  771. BEGIN
  772. IF (sym < 16) (* prevent range error *) AND
  773. (sym IN BITSET{1, 2, 3, 4, 8, 14, 15}) THEN
  774. SimpleType;
  775. ELSIF (sym = 17) OR (sym = 20) OR (sym = 24) OR (sym = 26) OR (sym = 27) THEN
  776. IF (sym = 17) THEN
  777. Get;
  778. END;
  779. StructType;
  780. ELSIF (sym = 18) THEN
  781. Get;
  782. TypeIdent;
  783. ELSE SynError(76);
  784. END;
  785. END Type;
  786. PROCEDURE TypeDef;
  787. BEGIN
  788. NewIdent;
  789. Expect(13);
  790. Type;
  791. Expect(6);
  792. END TypeDef;
  793. PROCEDURE UnsignedReal;
  794. BEGIN
  795. Expect(3);
  796. END UnsignedReal;
  797. PROCEDURE String;
  798. BEGIN
  799. Expect(4);
  800. END String;
  801. PROCEDURE ConstIdent;
  802. BEGIN
  803. Expect(1);
  804. END ConstIdent;
  805. PROCEDURE UnsignedNumber;
  806. BEGIN
  807. IF (sym = 2) THEN
  808. UnsignedInt;
  809. ELSIF (sym = 3) THEN
  810. UnsignedReal;
  811. ELSE SynError(77);
  812. END;
  813. END UnsignedNumber;
  814. PROCEDURE Constant;
  815. BEGIN
  816. IF (sym = 1) OR (sym = 2) OR (sym = 3) OR (sym = 14) OR (sym = 15) THEN
  817. IF (sym = 14) OR (sym = 15) THEN
  818. IF (sym = 14) THEN
  819. Get;
  820. ELSE
  821. Get;
  822. END;
  823. END;
  824. IF (sym = 2) OR (sym = 3) THEN
  825. UnsignedNumber;
  826. ELSIF (sym = 1) THEN
  827. ConstIdent;
  828. ELSE SynError(78);
  829. END;
  830. ELSIF (sym = 4) THEN
  831. String;
  832. ELSE SynError(79);
  833. END;
  834. END Constant;
  835. PROCEDURE ConstDef;
  836. BEGIN
  837. NewIdent;
  838. Expect(13);
  839. Constant;
  840. Expect(6);
  841. END ConstDef;
  842. PROCEDURE UnsignedInt;
  843. BEGIN
  844. Expect(2);
  845. END UnsignedInt;
  846. PROCEDURE Label;
  847. BEGIN
  848. UnsignedInt;
  849. END Label;
  850. PROCEDURE Labels;
  851. BEGIN
  852. Label;
  853. WHILE (sym = 11) DO
  854. Get;
  855. Label;
  856. END;
  857. END Labels;
  858. PROCEDURE ProcDeclarations;
  859. BEGIN
  860. IF (sym = 31) THEN
  861. ProcHeading;
  862. ELSIF (sym = 32) THEN
  863. FuncHeading;
  864. ELSE SynError(80);
  865. END;
  866. Expect(6);
  867. Body;
  868. Expect(6);
  869. END ProcDeclarations;
  870. PROCEDURE VarDeclarations;
  871. BEGIN
  872. IF (sym = 30) THEN
  873. Get;
  874. VarDecl;
  875. WHILE (sym = 1) DO
  876. VarDecl;
  877. END;
  878. END;
  879. END VarDeclarations;
  880. PROCEDURE TypeDefinitions;
  881. BEGIN
  882. IF (sym = 16) THEN
  883. Get;
  884. TypeDef;
  885. WHILE (sym = 1) DO
  886. TypeDef;
  887. END;
  888. END;
  889. END TypeDefinitions;
  890. PROCEDURE ConstDefinitions;
  891. BEGIN
  892. IF (sym = 12) THEN
  893. Get;
  894. ConstDef;
  895. WHILE (sym = 1) DO
  896. ConstDef;
  897. END;
  898. END;
  899. END ConstDefinitions;
  900. PROCEDURE LabelDeclarations;
  901. BEGIN
  902. IF (sym = 10) THEN
  903. Get;
  904. Labels;
  905. Expect(6);
  906. END;
  907. END LabelDeclarations;
  908. PROCEDURE StatementPart;
  909. BEGIN
  910. CompoundStatement;
  911. END StatementPart;
  912. PROCEDURE DeclarationPart;
  913. BEGIN
  914. LabelDeclarations;
  915. ConstDefinitions;
  916. TypeDefinitions;
  917. VarDeclarations;
  918. WHILE (sym = 31) OR (sym = 32) DO
  919. ProcDeclarations;
  920. END;
  921. END DeclarationPart;
  922. PROCEDURE NewIdentList;
  923. BEGIN
  924. NewIdent;
  925. WHILE (sym = 11) DO
  926. Get;
  927. NewIdent;
  928. END;
  929. END NewIdentList;
  930. PROCEDURE Block;
  931. BEGIN
  932. DeclarationPart;
  933. StatementPart;
  934. END Block;
  935. PROCEDURE ExternalFiles;
  936. BEGIN
  937. Expect(8);
  938. NewIdentList;
  939. Expect(9);
  940. END ExternalFiles;
  941. PROCEDURE NewIdent;
  942. BEGIN
  943. Expect(1);
  944. END NewIdent;
  945. PROCEDURE Pascal;
  946. BEGIN
  947. Expect(5);
  948. NewIdent;
  949. IF (sym = 8) THEN
  950. ExternalFiles;
  951. END;
  952. Expect(6);
  953. Block;
  954. Expect(7);
  955. END Pascal;
  956. PROCEDURE Parse;
  957. BEGIN
  958. PascalS.Reset; Get;
  959. Pascal;
  960. END Parse;
  961. BEGIN
  962. errDist := minErrDist;
  963. symSet[ 0, 0] := BITSET{0};
  964. symSet[ 0, 1] := BITSET{};
  965. symSet[ 0, 2] := BITSET{};
  966. symSet[ 0, 3] := BITSET{};
  967. symSet[ 1, 0] := BITSET{1, 2, 3, 4, 8};
  968. symSet[ 1, 1] := BITSET{5};
  969. symSet[ 1, 2] := BITSET{};
  970. symSet[ 1, 3] := BITSET{12, 13};
  971. symSet[ 2, 0] := BITSET{13};
  972. symSet[ 2, 1] := BITSET{};
  973. symSet[ 2, 2] := BITSET{};
  974. symSet[ 2, 3] := BITSET{0, 1, 2, 3, 4, 5};
  975. symSet[ 3, 0] := BITSET{1};
  976. symSet[ 3, 1] := BITSET{13};
  977. symSet[ 3, 2] := BITSET{2, 4, 5, 7, 9, 12, 15};
  978. symSet[ 3, 3] := BITSET{};
  979. symSet[ 4, 0] := BITSET{10, 12};
  980. symSet[ 4, 1] := BITSET{0, 14, 15};
  981. symSet[ 4, 2] := BITSET{0, 2};
  982. symSet[ 4, 3] := BITSET{};
  983. END PascalP.