scanner.frm 5.9 KB

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