scanner.frm 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. IMPLEMENTATION MODULE -->modulename;
  2. (* Scanner generated by Coco/R - using the FileIO library supplied with this project. *)
  3. IMPORT FileIO, Storage;
  4. CONST
  5. noSYMB = -->unknownsym; (*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. -->commentRETURN FALSE;
  52. END Comment;
  53. PROCEDURE Get (VAR sym: CARDINAL);
  54. VAR
  55. state: CARDINAL;
  56. PROCEDURE Equal (s: ARRAY OF CHAR): BOOLEAN;
  57. VAR
  58. i: CARDINAL;
  59. q: INT32;
  60. BEGIN
  61. IF nextLen # LENGTH(s) THEN RETURN FALSE END;
  62. i := 1; q := bp0; INC(q);
  63. WHILE i < nextLen DO
  64. IF CurrentCh(q) # s[i] THEN RETURN FALSE END;
  65. INC(i); INC(q)
  66. END;
  67. RETURN TRUE
  68. END Equal;
  69. PROCEDURE CheckLiteral;
  70. BEGIN
  71. -->literals
  72. END CheckLiteral;
  73. BEGIN (*Get*)
  74. -->GetSy1
  75. pos := nextPos; nextPos := bp;
  76. col := nextCol; nextCol := VAL(INTEGER, bp - lineStart);
  77. line := nextLine; nextLine := curLine;
  78. len := nextLen; nextLen := 0;
  79. apx := 0; state := start[ORD(ch)]; bp0 := bp;
  80. LOOP
  81. NextCh; INC(nextLen);
  82. CASE state OF
  83. -->GetSy2
  84. ELSE sym := noSYMB; RETURN (*NextCh already done*)
  85. END
  86. END
  87. END Get;
  88. PROCEDURE GetString (pos: INT32; len: CARDINAL; VAR s: ARRAY OF CHAR);
  89. VAR
  90. i: CARDINAL;
  91. p: INT32;
  92. BEGIN
  93. IF len > HIGH(s) THEN len := HIGH(s) END;
  94. p := pos; i := 0;
  95. WHILE i < len DO
  96. s[i] := CharAt(p); INC(i); INC(p)
  97. END;
  98. s[len] := 0C;
  99. END GetString;
  100. PROCEDURE GetName (pos: INT32; len: CARDINAL; VAR s: ARRAY OF CHAR);
  101. VAR
  102. i: CARDINAL;
  103. p: INT32;
  104. BEGIN
  105. IF len > HIGH(s) THEN len := HIGH(s) END;
  106. p := pos; i := 0;
  107. WHILE i < len DO
  108. s[i] := CurrentCh(p); INC(i); INC(p)
  109. END;
  110. s[len] := 0C;
  111. END GetName;
  112. PROCEDURE CharAt (pos: INT32): CHAR;
  113. VAR
  114. ch: CHAR;
  115. BEGIN
  116. IF pos >= inputLen THEN RETURN EOF END;
  117. ch := buf[ORD(pos DIV BlkSize)]^[ORD(pos MOD BlkSize)];
  118. IF ch # eof THEN RETURN ch ELSE RETURN EOF END
  119. END CharAt;
  120. PROCEDURE CapChAt (pos: INT32): CHAR;
  121. VAR
  122. ch: CHAR;
  123. BEGIN
  124. IF pos >= inputLen THEN RETURN EOF END;
  125. ch := CAP(buf[ORD(pos DIV BlkSize)]^[ORD(pos MOD BlkSize)]);
  126. IF ch # eof THEN RETURN ch ELSE RETURN EOF END
  127. END CapChAt;
  128. PROCEDURE Reset;
  129. VAR
  130. i, read: CARDINAL;
  131. BEGIN (*assert: src has been opened*)
  132. i := 0; inputLen := 0;
  133. REPEAT
  134. Storage.ALLOCATE(buf[i], BlkSize);
  135. read := BlkSize; FileIO.ReadBytes(src, buf[i]^, read);
  136. INC(i); INC(inputLen, VAL(INT32, read))
  137. UNTIL read # BlkSize;
  138. buf[i-1]^[read] := EOF;
  139. curLine := 1; lineStart := -2; bp := -1;
  140. oldEols := 0; apx := 0; errors := 0;
  141. NextCh;
  142. END Reset;
  143. BEGIN
  144. -->initializations
  145. Error := Err; lastCh := EOF;
  146. END -->modulename.
  147. -->definitionDEFINITION MODULE -->modulename;
  148. (* Scanner generated by Coco/R - using the FileIO library supplied with this project. *)
  149. IMPORT FileIO;
  150. TYPE
  151. INT32 = FileIO.INT32 (* need 32 bit integers *);
  152. VAR
  153. src, lst: FileIO.File;(*source/list files. To be opened by the main pgm*)
  154. directory: ARRAY [0 .. 255] OF CHAR (*of source file*);
  155. line, col: INTEGER; (*line and column of current symbol*)
  156. len: CARDINAL; (*length of current symbol*)
  157. pos: INT32; (*file position of current symbol*)
  158. nextLine: INTEGER; (*line of lookahead symbol*)
  159. nextCol: INTEGER; (*column of lookahead symbol*)
  160. nextLen: CARDINAL; (*length of lookahead symbol*)
  161. nextPos: INT32; (*file position of lookahead symbol*)
  162. errors: INTEGER; (*number of detected errors*)
  163. Error: PROCEDURE ((*nr*)INTEGER, (*line*)INTEGER, (*col*)INTEGER,
  164. (*pos*)INT32);
  165. PROCEDURE Get (VAR sym: CARDINAL);
  166. (* Gets next symbol from source file *)
  167. PROCEDURE GetString (pos: INT32; len: CARDINAL; VAR name: ARRAY OF CHAR);
  168. (* Retrieves exact string of max length len from position pos in source file *)
  169. PROCEDURE GetName (pos: INT32; len: CARDINAL; VAR name: ARRAY OF CHAR);
  170. (* Retrieves name of symbol of length len at position pos in source file *)
  171. PROCEDURE CharAt (pos: INT32): CHAR;
  172. (* Returns exact character at position pos in source file *)
  173. PROCEDURE Reset;
  174. (* Reads and stores source file internally *)
  175. END -->modulename.