scanner.frm 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. IMPLEMENTATION MODULE -->modulename;
  2. (* Scanner generated by Coco/R - using the FileIO library supplied with this project. *)
  3. IMPORT FileIO, Storage;
  4. FROM Storage IMPORT ALLOCATE; (* gm2 needs this for NEW substitution *)
  5. CONST
  6. noSYMB = -->unknownsym; (*error token code*)
  7. (* not only for errors but also for not finished states of scanner analysis *)
  8. eof = CHR(26) (* MS-DOS Keyboard eof char *);
  9. EOF = CHR(0);
  10. EOL = CHR(13);
  11. CR = CHR(13);
  12. LF = CHR(10);
  13. Long0 = 0;
  14. Long1 = 1;
  15. BlkSize = 16384;
  16. TYPE
  17. BufBlock = ARRAY [0 .. BlkSize-1] OF CHAR;
  18. Buffer = ARRAY [0 .. 31] OF POINTER TO BufBlock;
  19. StartTable = ARRAY [0 .. 255] OF INTEGER;
  20. GetCH = PROCEDURE (INT32): CHAR;
  21. VAR
  22. lastCh,
  23. ch: CHAR; (*current input character*)
  24. curLine: INTEGER; (*current input line (may be higher than line)*)
  25. lineStart: INT32; (*start position of current line*)
  26. apx: INT32; (*length of appendix (CONTEXT phrase)*)
  27. oldEols: INTEGER; (*number of EOLs in a comment*)
  28. bp, bp0: INT32; (*current position in buf
  29. (bp0: position of current token)*)
  30. inputLen: INT32; (*source file size*)
  31. buf: Buffer; (*source buffer for low-level access*)
  32. start: StartTable; (*start state for every character*)
  33. CurrentCh: GetCH;
  34. PROCEDURE Err (nr, line, col: INTEGER; pos: INT32);
  35. BEGIN
  36. INC(errors)
  37. END Err;
  38. PROCEDURE NextCh;
  39. (* Return global variable ch *)
  40. BEGIN
  41. lastCh := ch; INC(bp); ch := CurrentCh(bp);
  42. IF (ch = EOL) OR (ch = LF) AND (lastCh # EOL) THEN
  43. INC(curLine); lineStart := bp
  44. END
  45. END NextCh;
  46. PROCEDURE Comment (): BOOLEAN;
  47. VAR
  48. level, startLine: INTEGER;
  49. oldLineStart: INT32;
  50. BEGIN
  51. level := 1; startLine := curLine; oldLineStart := lineStart;
  52. -->commentRETURN FALSE;
  53. END Comment;
  54. PROCEDURE Get (VAR sym: CARDINAL);
  55. VAR
  56. state: CARDINAL;
  57. PROCEDURE Equal (s: ARRAY OF CHAR): BOOLEAN;
  58. VAR
  59. i: CARDINAL;
  60. q: INT32;
  61. BEGIN
  62. IF nextLen # LENGTH(s) THEN RETURN FALSE END;
  63. i := 1; q := bp0; INC(q);
  64. WHILE i < nextLen DO
  65. IF CurrentCh(q) # s[i] THEN RETURN FALSE END;
  66. INC(i); INC(q)
  67. END;
  68. RETURN TRUE
  69. END Equal;
  70. PROCEDURE CheckLiteral;
  71. BEGIN
  72. -->literals
  73. END CheckLiteral;
  74. BEGIN (*Get*)
  75. -->GetSy1
  76. pos := nextPos; nextPos := bp;
  77. col := nextCol; nextCol := VAL(INTEGER, bp - lineStart);
  78. line := nextLine; nextLine := curLine;
  79. len := nextLen; nextLen := 0;
  80. apx := 0; state := start[ORD(ch)]; bp0 := bp;
  81. LOOP
  82. NextCh; INC(nextLen);
  83. CASE state OF
  84. -->GetSy2
  85. ELSE sym := noSYMB; RETURN (*NextCh already done*)
  86. END
  87. END
  88. END Get;
  89. PROCEDURE GetString (pos: INT32; len: CARDINAL; VAR s: ARRAY OF CHAR);
  90. VAR
  91. i: CARDINAL;
  92. p: INT32;
  93. BEGIN
  94. IF len > HIGH(s) THEN len := HIGH(s) END;
  95. p := pos; i := 0;
  96. WHILE i < len DO
  97. s[i] := CharAt(p); INC(i); INC(p)
  98. END;
  99. s[len] := CHR(0);
  100. END GetString;
  101. PROCEDURE GetName (pos: INT32; len: CARDINAL; VAR s: ARRAY OF CHAR);
  102. VAR
  103. i: CARDINAL;
  104. p: INT32;
  105. BEGIN
  106. IF len > HIGH(s) THEN len := HIGH(s) END;
  107. p := pos; i := 0;
  108. WHILE i < len DO
  109. s[i] := CurrentCh(p); INC(i); INC(p)
  110. END;
  111. s[len] := CHR(0);
  112. END GetName;
  113. PROCEDURE CharAt (pos: INT32): CHAR;
  114. VAR
  115. ch: CHAR;
  116. BEGIN
  117. IF pos >= inputLen THEN RETURN EOF END;
  118. ch := buf[ORD(pos DIV BlkSize)]^[ORD(pos MOD BlkSize)];
  119. IF ch # eof THEN RETURN ch ELSE RETURN EOF END
  120. END CharAt;
  121. PROCEDURE CapChAt (pos: INT32): CHAR;
  122. VAR
  123. ch: CHAR;
  124. BEGIN
  125. IF pos >= inputLen THEN RETURN EOF END;
  126. ch := CAP(buf[ORD(pos DIV BlkSize)]^[ORD(pos MOD BlkSize)]);
  127. IF ch # eof THEN RETURN ch ELSE RETURN EOF END
  128. END CapChAt;
  129. PROCEDURE Reset;
  130. VAR
  131. i, read: CARDINAL;
  132. BEGIN (*assert: src has been opened*)
  133. i := 0; inputLen := 0;
  134. REPEAT
  135. NEW(buf[i]); (* typed alloc: sets the block descriptor's count *)
  136. read := BlkSize; FileIO.ReadBytes(src, buf[i]^, read);
  137. INC(i); INC(inputLen, VAL(INT32, read))
  138. UNTIL read # BlkSize;
  139. buf[i-1]^[read] := EOF;
  140. curLine := 1; lineStart := -2; bp := -1;
  141. oldEols := 0; apx := 0; errors := 0;
  142. NextCh;
  143. END Reset;
  144. BEGIN
  145. -->initializations
  146. Error := Err; lastCh := EOF;
  147. END -->modulename.
  148. -->definitionDEFINITION MODULE -->modulename;
  149. (* Scanner generated by Coco/R - using the FileIO library supplied with this project. *)
  150. IMPORT FileIO;
  151. TYPE
  152. INT32 = FileIO.INT32 (* need 32 bit integers *);
  153. VAR
  154. src, lst: FileIO.File;(*source/list files. To be opened by the main pgm*)
  155. directory: ARRAY [0 .. 255] OF CHAR (*of source file*);
  156. line, col: INTEGER; (*line and column of current symbol*)
  157. len: CARDINAL; (*length of current symbol*)
  158. pos: INT32; (*file position of current symbol*)
  159. nextLine: INTEGER; (*line of lookahead symbol*)
  160. nextCol: INTEGER; (*column of lookahead symbol*)
  161. nextLen: CARDINAL; (*length of lookahead symbol*)
  162. nextPos: INT32; (*file position of lookahead symbol*)
  163. errors: INTEGER; (*number of detected errors*)
  164. Error: PROCEDURE ((*nr*)INTEGER, (*line*)INTEGER, (*col*)INTEGER,
  165. (*pos*)INT32);
  166. PROCEDURE Get (VAR sym: CARDINAL);
  167. (* Gets next symbol from source file *)
  168. PROCEDURE GetString (pos: INT32; len: CARDINAL; VAR name: ARRAY OF CHAR);
  169. (* Retrieves exact string of max length len from position pos in source file *)
  170. PROCEDURE GetName (pos: INT32; len: CARDINAL; VAR name: ARRAY OF CHAR);
  171. (* Retrieves name of symbol of length len at position pos in source file *)
  172. PROCEDURE CharAt (pos: INT32): CHAR;
  173. (* Returns exact character at position pos in source file *)
  174. PROCEDURE Reset;
  175. (* Reads and stores source file internally *)
  176. END -->modulename.