M2cS.mod 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. IMPLEMENTATION MODULE M2cS;
  2. (* Scanner generated by Coco/R - using the FileIO library supplied with this project. *)
  3. IMPORT FileIO, Storage;
  4. CONST
  5. noSYMB = 7; (*error token code*)
  6. (* not only for errors but also for not finished states of scanner analysis *)
  7. eof = 32C (* MS-DOS Keyboard eof char *);
  8. EOF = 0C;
  9. EOL = 15C;
  10. CR = 15C;
  11. LF = 12C;
  12. Long0 = 0;
  13. Long1 = 1;
  14. BlkSize = 16384;
  15. TYPE
  16. BufBlock = ARRAY [0 .. BlkSize-1] OF CHAR;
  17. Buffer = ARRAY [0 .. 31] OF POINTER TO BufBlock;
  18. StartTable = ARRAY [0 .. 255] OF INTEGER;
  19. GetCH = PROCEDURE (INT32): CHAR;
  20. VAR
  21. lastCh,
  22. ch: CHAR; (*current input character*)
  23. curLine: INTEGER; (*current input line (may be higher than line)*)
  24. lineStart: INT32; (*start position of current line*)
  25. apx: INT32; (*length of appendix (CONTEXT phrase)*)
  26. oldEols: INTEGER; (*number of EOLs in a comment*)
  27. bp, bp0: INT32; (*current position in buf
  28. (bp0: position of current token)*)
  29. inputLen: INT32; (*source file size*)
  30. buf: Buffer; (*source buffer for low-level access*)
  31. start: StartTable; (*start state for every character*)
  32. CurrentCh: GetCH;
  33. PROCEDURE Err (nr, line, col: INTEGER; pos: INT32);
  34. BEGIN
  35. INC(errors)
  36. END Err;
  37. PROCEDURE NextCh;
  38. (* Return global variable ch *)
  39. BEGIN
  40. lastCh := ch; INC(bp); ch := CurrentCh(bp);
  41. IF (ch = EOL) OR (ch = LF) AND (lastCh # EOL) THEN
  42. INC(curLine); lineStart := bp
  43. END
  44. END NextCh;
  45. PROCEDURE Comment (): BOOLEAN;
  46. VAR
  47. level, startLine: INTEGER;
  48. oldLineStart: INT32;
  49. BEGIN
  50. level := 1; startLine := curLine; oldLineStart := lineStart;
  51. IF (ch = "(") THEN
  52. NextCh;
  53. IF (ch = "*") THEN
  54. NextCh;
  55. LOOP
  56. IF (ch = "*") THEN
  57. NextCh;
  58. IF (ch = ")") THEN
  59. DEC(level); NextCh;
  60. IF level = 0 THEN RETURN TRUE END
  61. END;
  62. ELSIF (ch = "(") THEN
  63. NextCh;
  64. IF (ch = "*") THEN INC(level); NextCh END;
  65. ELSIF ch = EOF THEN RETURN FALSE
  66. ELSE NextCh END;
  67. END; (* LOOP *)
  68. ELSE
  69. IF (ch = CR) OR (ch = LF) THEN
  70. DEC(curLine); lineStart := oldLineStart
  71. END;
  72. DEC(bp); ch := lastCh;
  73. END;
  74. END;
  75. RETURN FALSE;
  76. END Comment;
  77. PROCEDURE Get (VAR sym: CARDINAL);
  78. VAR
  79. state: CARDINAL;
  80. PROCEDURE Equal (s: ARRAY OF CHAR): BOOLEAN;
  81. VAR
  82. i: CARDINAL;
  83. q: INT32;
  84. BEGIN
  85. IF nextLen # LENGTH(s) THEN RETURN FALSE END;
  86. i := 1; q := bp0; INC(q);
  87. WHILE i < nextLen DO
  88. IF CurrentCh(q) # s[i] THEN RETURN FALSE END;
  89. INC(i); INC(q)
  90. END;
  91. RETURN TRUE
  92. END Equal;
  93. PROCEDURE CheckLiteral;
  94. BEGIN
  95. CASE CurrentCh(bp0) OF
  96. "B": IF Equal("BEGIN") THEN sym := 4;
  97. END
  98. | "E": IF Equal("END") THEN sym := 5;
  99. END
  100. | "M": IF Equal("MODULE") THEN sym := 2;
  101. END
  102. ELSE
  103. END
  104. END CheckLiteral;
  105. BEGIN (*Get*)
  106. WHILE (ch = ' ') OR
  107. ((ch >= CHR(9)) & (ch <= CHR(13))) DO NextCh END;
  108. IF ((ch = "(")) & Comment() THEN Get(sym); RETURN END;
  109. pos := nextPos; nextPos := bp;
  110. col := nextCol; nextCol := VAL(INTEGER, bp - lineStart);
  111. line := nextLine; nextLine := curLine;
  112. len := nextLen; nextLen := 0;
  113. apx := 0; state := start[ORD(ch)]; bp0 := bp;
  114. LOOP
  115. NextCh; INC(nextLen);
  116. CASE state OF
  117. 1: IF ((ch >= "0") & (ch <= "9") OR
  118. (ch >= "A") & (ch <= "Z") OR
  119. (ch >= "a") & (ch <= "z")) THEN
  120. ELSE sym := 1; CheckLiteral; RETURN
  121. END;
  122. | 2: sym := 3; RETURN
  123. | 3: sym := 6; RETURN
  124. | 4: sym := 0; ch := 0C; DEC(bp); RETURN
  125. ELSE sym := noSYMB; RETURN (*NextCh already done*)
  126. END
  127. END
  128. END Get;
  129. PROCEDURE GetString (pos: INT32; len: CARDINAL; VAR s: ARRAY OF CHAR);
  130. VAR
  131. i: CARDINAL;
  132. p: INT32;
  133. BEGIN
  134. IF len > HIGH(s) THEN len := HIGH(s) END;
  135. p := pos; i := 0;
  136. WHILE i < len DO
  137. s[i] := CharAt(p); INC(i); INC(p)
  138. END;
  139. s[len] := 0C;
  140. END GetString;
  141. PROCEDURE GetName (pos: INT32; len: CARDINAL; VAR s: ARRAY OF CHAR);
  142. VAR
  143. i: CARDINAL;
  144. p: INT32;
  145. BEGIN
  146. IF len > HIGH(s) THEN len := HIGH(s) END;
  147. p := pos; i := 0;
  148. WHILE i < len DO
  149. s[i] := CurrentCh(p); INC(i); INC(p)
  150. END;
  151. s[len] := 0C;
  152. END GetName;
  153. PROCEDURE CharAt (pos: INT32): CHAR;
  154. VAR
  155. ch: CHAR;
  156. BEGIN
  157. IF pos >= inputLen THEN RETURN EOF END;
  158. ch := buf[ORD(pos DIV BlkSize)]^[ORD(pos MOD BlkSize)];
  159. IF ch # eof THEN RETURN ch ELSE RETURN EOF END
  160. END CharAt;
  161. PROCEDURE CapChAt (pos: INT32): CHAR;
  162. VAR
  163. ch: CHAR;
  164. BEGIN
  165. IF pos >= inputLen THEN RETURN EOF END;
  166. ch := CAP(buf[ORD(pos DIV BlkSize)]^[ORD(pos MOD BlkSize)]);
  167. IF ch # eof THEN RETURN ch ELSE RETURN EOF END
  168. END CapChAt;
  169. PROCEDURE Reset;
  170. VAR
  171. i, read: CARDINAL;
  172. BEGIN (*assert: src has been opened*)
  173. i := 0; inputLen := 0;
  174. REPEAT
  175. Storage.ALLOCATE(buf[i], BlkSize);
  176. read := BlkSize; FileIO.ReadBytes(src, buf[i]^, read);
  177. INC(i); INC(inputLen, VAL(INT32, read))
  178. UNTIL read # BlkSize;
  179. buf[i-1]^[read] := EOF;
  180. curLine := 1; lineStart := -2; bp := -1;
  181. oldEols := 0; apx := 0; errors := 0;
  182. NextCh;
  183. END Reset;
  184. BEGIN
  185. CurrentCh := CharAt;
  186. start[ 0] := 4; start[ 1] := 5; start[ 2] := 5; start[ 3] := 5;
  187. start[ 4] := 5; start[ 5] := 5; start[ 6] := 5; start[ 7] := 5;
  188. start[ 8] := 5; start[ 9] := 5; start[ 10] := 5; start[ 11] := 5;
  189. start[ 12] := 5; start[ 13] := 5; start[ 14] := 5; start[ 15] := 5;
  190. start[ 16] := 5; start[ 17] := 5; start[ 18] := 5; start[ 19] := 5;
  191. start[ 20] := 5; start[ 21] := 5; start[ 22] := 5; start[ 23] := 5;
  192. start[ 24] := 5; start[ 25] := 5; start[ 26] := 5; start[ 27] := 5;
  193. start[ 28] := 5; start[ 29] := 5; start[ 30] := 5; start[ 31] := 5;
  194. start[ 32] := 5; start[ 33] := 5; start[ 34] := 5; start[ 35] := 5;
  195. start[ 36] := 5; start[ 37] := 5; start[ 38] := 5; start[ 39] := 5;
  196. start[ 40] := 5; start[ 41] := 5; start[ 42] := 5; start[ 43] := 5;
  197. start[ 44] := 5; start[ 45] := 5; start[ 46] := 3; start[ 47] := 5;
  198. start[ 48] := 5; start[ 49] := 5; start[ 50] := 5; start[ 51] := 5;
  199. start[ 52] := 5; start[ 53] := 5; start[ 54] := 5; start[ 55] := 5;
  200. start[ 56] := 5; start[ 57] := 5; start[ 58] := 5; start[ 59] := 2;
  201. start[ 60] := 5; start[ 61] := 5; start[ 62] := 5; start[ 63] := 5;
  202. start[ 64] := 5; start[ 65] := 1; start[ 66] := 1; start[ 67] := 1;
  203. start[ 68] := 1; start[ 69] := 1; start[ 70] := 1; start[ 71] := 1;
  204. start[ 72] := 1; start[ 73] := 1; start[ 74] := 1; start[ 75] := 1;
  205. start[ 76] := 1; start[ 77] := 1; start[ 78] := 1; start[ 79] := 1;
  206. start[ 80] := 1; start[ 81] := 1; start[ 82] := 1; start[ 83] := 1;
  207. start[ 84] := 1; start[ 85] := 1; start[ 86] := 1; start[ 87] := 1;
  208. start[ 88] := 1; start[ 89] := 1; start[ 90] := 1; start[ 91] := 5;
  209. start[ 92] := 5; start[ 93] := 5; start[ 94] := 5; start[ 95] := 5;
  210. start[ 96] := 5; start[ 97] := 1; start[ 98] := 1; start[ 99] := 1;
  211. start[100] := 1; start[101] := 1; start[102] := 1; start[103] := 1;
  212. start[104] := 1; start[105] := 1; start[106] := 1; start[107] := 1;
  213. start[108] := 1; start[109] := 1; start[110] := 1; start[111] := 1;
  214. start[112] := 1; start[113] := 1; start[114] := 1; start[115] := 1;
  215. start[116] := 1; start[117] := 1; start[118] := 1; start[119] := 1;
  216. start[120] := 1; start[121] := 1; start[122] := 1; start[123] := 5;
  217. start[124] := 5; start[125] := 5; start[126] := 5; start[127] := 5;
  218. start[128] := 5; start[129] := 5; start[130] := 5; start[131] := 5;
  219. start[132] := 5; start[133] := 5; start[134] := 5; start[135] := 5;
  220. start[136] := 5; start[137] := 5; start[138] := 5; start[139] := 5;
  221. start[140] := 5; start[141] := 5; start[142] := 5; start[143] := 5;
  222. start[144] := 5; start[145] := 5; start[146] := 5; start[147] := 5;
  223. start[148] := 5; start[149] := 5; start[150] := 5; start[151] := 5;
  224. start[152] := 5; start[153] := 5; start[154] := 5; start[155] := 5;
  225. start[156] := 5; start[157] := 5; start[158] := 5; start[159] := 5;
  226. start[160] := 5; start[161] := 5; start[162] := 5; start[163] := 5;
  227. start[164] := 5; start[165] := 5; start[166] := 5; start[167] := 5;
  228. start[168] := 5; start[169] := 5; start[170] := 5; start[171] := 5;
  229. start[172] := 5; start[173] := 5; start[174] := 5; start[175] := 5;
  230. start[176] := 5; start[177] := 5; start[178] := 5; start[179] := 5;
  231. start[180] := 5; start[181] := 5; start[182] := 5; start[183] := 5;
  232. start[184] := 5; start[185] := 5; start[186] := 5; start[187] := 5;
  233. start[188] := 5; start[189] := 5; start[190] := 5; start[191] := 5;
  234. start[192] := 5; start[193] := 5; start[194] := 5; start[195] := 5;
  235. start[196] := 5; start[197] := 5; start[198] := 5; start[199] := 5;
  236. start[200] := 5; start[201] := 5; start[202] := 5; start[203] := 5;
  237. start[204] := 5; start[205] := 5; start[206] := 5; start[207] := 5;
  238. start[208] := 5; start[209] := 5; start[210] := 5; start[211] := 5;
  239. start[212] := 5; start[213] := 5; start[214] := 5; start[215] := 5;
  240. start[216] := 5; start[217] := 5; start[218] := 5; start[219] := 5;
  241. start[220] := 5; start[221] := 5; start[222] := 5; start[223] := 5;
  242. start[224] := 5; start[225] := 5; start[226] := 5; start[227] := 5;
  243. start[228] := 5; start[229] := 5; start[230] := 5; start[231] := 5;
  244. start[232] := 5; start[233] := 5; start[234] := 5; start[235] := 5;
  245. start[236] := 5; start[237] := 5; start[238] := 5; start[239] := 5;
  246. start[240] := 5; start[241] := 5; start[242] := 5; start[243] := 5;
  247. start[244] := 5; start[245] := 5; start[246] := 5; start[247] := 5;
  248. start[248] := 5; start[249] := 5; start[250] := 5; start[251] := 5;
  249. start[252] := 5; start[253] := 5; start[254] := 5; start[255] := 5;
  250. Error := Err; lastCh := EOF;
  251. END M2cS.