M2cP.mod 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. IMPLEMENTATION MODULE M2cP;
  2. (* Parser generated by Coco/R - assuming ISO IO library will be available. *)
  3. IMPORT M2cS, FileIO;
  4. CONST
  5. maxT = 7;
  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 .. 0] 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. M2cS.Error(errNo, M2cS.line, M2cS.col, M2cS.pos);
  18. END;
  19. errDist := 0;
  20. END SemError;
  21. PROCEDURE SynError (errNo: INTEGER);
  22. BEGIN
  23. IF errDist >= minErrDist THEN
  24. M2cS.Error(errNo, M2cS.nextLine, M2cS.nextCol, M2cS.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. M2cS.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. M2cS.GetName(M2cS.pos, M2cS.len, Lex)
  75. END LexName;
  76. PROCEDURE LexString (VAR Lex: ARRAY OF CHAR);
  77. BEGIN
  78. M2cS.GetString(M2cS.pos, M2cS.len, Lex)
  79. END LexString;
  80. PROCEDURE LookAheadName (VAR Lex: ARRAY OF CHAR);
  81. BEGIN
  82. M2cS.GetName(M2cS.nextPos, M2cS.nextLen, Lex)
  83. END LookAheadName;
  84. PROCEDURE LookAheadString (VAR Lex: ARRAY OF CHAR);
  85. BEGIN
  86. M2cS.GetString(M2cS.nextPos, M2cS.nextLen, Lex)
  87. END LookAheadString;
  88. PROCEDURE Successful (): BOOLEAN;
  89. BEGIN
  90. RETURN M2cS.errors = 0
  91. END Successful;
  92. (* ----- FORWARD not needed in multipass compilers
  93. PROCEDURE M2c; FORWARD;
  94. ----- *)
  95. PROCEDURE M2c;
  96. VAR m1, m2: ARRAY [0 .. 63] OF CHAR;
  97. i: CARDINAL; same: BOOLEAN;
  98. BEGIN
  99. Expect(2);
  100. Expect(1);
  101. LexName(m1);;
  102. Expect(3);
  103. IF (sym = 4) THEN
  104. Get;
  105. END;
  106. Expect(5);
  107. Expect(1);
  108. LexName(m2);
  109. i := 0; same := TRUE;
  110. WHILE same & ((m1[i] # 0C)
  111. OR (m2[i] # 0C)) DO
  112. IF m1[i] # m2[i] THEN
  113. same := FALSE
  114. END;
  115. INC(i)
  116. END;
  117. IF ~same THEN SemError(202) END;;
  118. Expect(6);
  119. END M2c;
  120. PROCEDURE Parse;
  121. BEGIN
  122. M2cS.Reset; Get;
  123. M2c;
  124. END Parse;
  125. BEGIN
  126. errDist := minErrDist;
  127. symSet[ 0, 0] := BITSET{0};
  128. END M2cP.