PascalP.mod 19 KB

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