home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / system1 / crs.mod (.txt) < prev    next >
Oberon Text  |  1977-12-31  |  8KB  |  209 lines

  1. Syntax10.Scn.Fnt
  2. (*  scanner module generated by Coco-R *)
  3. MODULE CRS;
  4. IMPORT Texts, SYSTEM;
  5. CONST
  6.     EOL = 0DX;
  7.     EOF = 0X;
  8.     maxLexLen = 127;
  9.   noSym = 38;
  10.     ErrorProc* = PROCEDURE (n: INTEGER; pos: LONGINT);
  11.     StartTable = ARRAY 128 OF INTEGER;
  12.     src*: Texts.Text;  (*source text. To be set by the main pgm*)
  13.     pos*: LONGINT;  (*position of current symbol*)
  14.     line*, col*, len*: INTEGER;  (*line, column, length of current symbol*)
  15.     nextPos*: LONGINT;  (*position of lookahead symbol*)
  16.     nextLine*, nextCol*, nextLen*: INTEGER;  (*line, column, length of lookahead symbol*)
  17.     errors*: INTEGER;  (*number of errors detected*)
  18.     Error*: ErrorProc;
  19.     ch: CHAR;        (*current input character*)
  20.     r: Texts.Reader;    (*global reader*)
  21.     chPos: LONGINT;    (*position of current character*)
  22.     chLine: INTEGER;  (*current line number*)
  23.     lineStart: LONGINT;  (*start position of current line*)
  24.     apx: INTEGER;     (*length of appendix*)
  25.     oldEols: INTEGER;     (*nr. of EOLs in a comment*)
  26.     start: StartTable;  (*start state for every character*)
  27. PROCEDURE NextCh; (*return global variable ch*)
  28. BEGIN
  29.     Texts.Read(r, ch); INC(chPos);
  30.     IF ch = EOL THEN INC(chLine); lineStart := chPos + 1 END
  31. END NextCh;
  32. PROCEDURE Comment(): BOOLEAN;
  33.     VAR level, startLine: INTEGER; oldLineStart: LONGINT;
  34. BEGIN (*Comment*)
  35.     level := 1; startLine := chLine; oldLineStart := lineStart;
  36.   IF (ch ="(") THEN
  37.     NextCh;
  38.     IF (ch ="*") THEN
  39.       NextCh;
  40.       LOOP
  41.         IF (ch ="*") THEN
  42.           NextCh;
  43.           IF (ch =")") THEN
  44.             DEC(level); oldEols := chLine - startLine; NextCh;
  45.             IF level=0 THEN RETURN TRUE END
  46.           END;
  47.         ELSIF (ch ="(") THEN
  48.           NextCh;
  49.           IF (ch ="*") THEN
  50.             INC(level); NextCh;
  51.           END;
  52.         ELSIF ch = EOF THEN RETURN FALSE
  53.         ELSE NextCh END;
  54.       END;
  55.     ELSE
  56.       IF ch = EOL THEN DEC(chLine); lineStart := oldLineStart END;
  57.       DEC(chPos, 2); Texts.OpenReader(r, src, chPos+1); NextCh; RETURN FALSE
  58.     END
  59.   END;
  60. END Comment;
  61. PROCEDURE Get*(VAR sym: INTEGER);
  62. VAR state: INTEGER; lexeme: ARRAY maxLexLen+1 OF CHAR;
  63.     PROCEDURE CheckLiteral;
  64.     BEGIN
  65.         IF nextLen < maxLexLen THEN lexeme[nextLen] := 0X END;
  66.     IF (lexeme[0] >= "A") & (lexeme[0] <= "W") THEN
  67.       CASE lexeme[0] OF
  68.       | "A": IF lexeme = "ANY" THEN sym := 25
  69.         END
  70.       | "C": IF lexeme = "CASE" THEN sym := 19
  71.         ELSIF lexeme = "CHARACTERS" THEN sym := 11
  72.         ELSIF lexeme = "CHR" THEN sym := 22
  73.         ELSIF lexeme = "COMMENTS" THEN sym := 14
  74.         ELSIF lexeme = "COMPILER" THEN sym := 4
  75.         ELSIF lexeme = "CONTEXT" THEN sym := 33
  76.         END
  77.       | "E": IF lexeme = "END" THEN sym := 10
  78.         END
  79.       | "F": IF lexeme = "FROM" THEN sym := 15
  80.         END
  81.       | "I": IF lexeme = "IGNORE" THEN sym := 18
  82.         ELSIF lexeme = "IMPORT" THEN sym := 5
  83.         END
  84.       | "N": IF lexeme = "NESTED" THEN sym := 17
  85.         END
  86.       | "P": IF lexeme = "PRAGMAS" THEN sym := 13
  87.         ELSIF lexeme = "PRODUCTIONS" THEN sym := 7
  88.         END
  89.       | "S": IF lexeme = "SYNC" THEN sym := 32
  90.         END
  91.       | "T": IF lexeme = "TO" THEN sym := 16
  92.         ELSIF lexeme = "TOKENS" THEN sym := 12
  93.         END
  94.       | "W": IF lexeme = "WEAK" THEN sym := 27
  95.         END
  96.       ELSE
  97.       END
  98.     END;
  99.     END CheckLiteral;
  100. BEGIN
  101.   WHILE (ch=20X) OR (ch=CHR(9)) OR (ch=CHR(13)) OR (ch=CHR(28)) DO NextCh END;
  102.     IF ((ch ="(")) & Comment() THEN Get(sym); RETURN END;
  103.     IF ch > 7FX THEN ch := " " END;
  104.     pos := nextPos; col := nextCol; line := nextLine; len := nextLen;
  105.     nextPos := chPos; nextCol := SHORT(chPos - lineStart); nextLine := chLine; nextLen := 0;
  106.     state := start[ORD(ch)]; apx := 0;
  107.     LOOP
  108.         IF nextLen < maxLexLen THEN lexeme[nextLen] := ch END;
  109.         INC(nextLen);
  110.         NextCh;
  111.         IF state > 0 THEN
  112.             CASE state OF
  113.     |  1: IF (ch>="0") & (ch<="9") OR (ch>="A") & (ch<="Z") OR (ch>="a") & (ch<="z") THEN 
  114.           ELSE sym := 1; CheckLiteral; RETURN
  115.           END;
  116.     |  2: IF (ch<=CHR(12)) OR (ch>=CHR(14)) & (ch<="!") OR (ch>="#") THEN 
  117.           ELSIF (ch =CHR(34)) THEN state := 3; 
  118.           ELSE sym := noSym; RETURN
  119.           END;
  120.     |  3: sym := 2; RETURN
  121.     |  4: IF (ch<=CHR(12)) OR (ch>=CHR(14)) & (ch<="&") OR (ch>="(") THEN 
  122.           ELSIF (ch ="'") THEN state := 3; 
  123.           ELSE sym := noSym; RETURN
  124.           END;
  125.     |  5: IF (ch>="0") & (ch<="9") THEN 
  126.           ELSE sym := 3; RETURN
  127.           END;
  128.     |  6: IF (ch>="0") & (ch<="9") THEN 
  129.           ELSE sym := 39; RETURN
  130.           END;
  131.     |  7: sym := 6; RETURN
  132.     |  8: sym := 8; RETURN
  133.     |  9: IF (ch =")") THEN state := 22; 
  134.           ELSE sym := 9; RETURN
  135.           END;
  136.     | 10: sym := 20; RETURN
  137.     | 11: sym := 21; RETURN
  138.     | 12: IF (ch =".") THEN state := 21; 
  139.           ELSE sym := 23; RETURN
  140.           END;
  141.     | 13: sym := 24; RETURN
  142.     | 14: sym := 26; RETURN
  143.     | 15: sym := 28; RETURN
  144.     | 16: sym := 29; RETURN
  145.     | 17: sym := 30; RETURN
  146.     | 18: sym := 31; RETURN
  147.     | 19: sym := 34; RETURN
  148.     | 20: sym := 35; RETURN
  149.     | 21: sym := 36; RETURN
  150.     | 22: sym := 37; RETURN
  151.     | 23: sym := 0; ch := 0X; RETURN
  152.             END (*CASE*)
  153.         ELSE sym := noSym; RETURN (*NextCh already done*)
  154.         END (*IF*)
  155.     END (*LOOP*)
  156. END Get;
  157. PROCEDURE GetName*(pos: LONGINT; len: INTEGER; VAR s: ARRAY OF CHAR);
  158.     VAR i: INTEGER; r: Texts.Reader;
  159. BEGIN
  160.     Texts.OpenReader(r, src, pos);
  161.     IF len >= LEN(s) THEN len := SHORT(LEN(s)) - 1 END;
  162.     i := 0; WHILE i < len DO Texts.Read(r, s[i]); INC(i) END;
  163.     s[i] := 0X
  164. END GetName;
  165. PROCEDURE StdErrorProc* (n: INTEGER; pos: LONGINT);
  166. BEGIN INC(errors) END StdErrorProc;
  167. PROCEDURE Reset* (t: Texts.Text; pos: LONGINT; errProc: ErrorProc);
  168. BEGIN
  169.     src := t; Error := errProc;
  170.     Texts.OpenReader(r, src, pos);
  171.     chPos := pos - 1; chLine := 1; lineStart := 0;
  172.     oldEols := 0; apx := 0; errors := 0;
  173.     NextCh
  174. END Reset;
  175. BEGIN
  176.   start[0]:=23; start[1]:=0; start[2]:=0; start[3]:=0; 
  177.   start[4]:=0; start[5]:=0; start[6]:=0; start[7]:=0; 
  178.   start[8]:=0; start[9]:=0; start[10]:=0; start[11]:=0; 
  179.   start[12]:=0; start[13]:=0; start[14]:=0; start[15]:=0; 
  180.   start[16]:=0; start[17]:=0; start[18]:=0; start[19]:=0; 
  181.   start[20]:=0; start[21]:=0; start[22]:=0; start[23]:=0; 
  182.   start[24]:=0; start[25]:=0; start[26]:=0; start[27]:=0; 
  183.   start[28]:=0; start[29]:=0; start[30]:=0; start[31]:=0; 
  184.   start[32]:=0; start[33]:=0; start[34]:=2; start[35]:=0; 
  185.   start[36]:=6; start[37]:=0; start[38]:=0; start[39]:=4; 
  186.   start[40]:=12; start[41]:=13; start[42]:=0; start[43]:=10; 
  187.   start[44]:=0; start[45]:=11; start[46]:=9; start[47]:=0; 
  188.   start[48]:=5; start[49]:=5; start[50]:=5; start[51]:=5; 
  189.   start[52]:=5; start[53]:=5; start[54]:=5; start[55]:=5; 
  190.   start[56]:=5; start[57]:=5; start[58]:=0; start[59]:=7; 
  191.   start[60]:=19; start[61]:=8; start[62]:=20; start[63]:=0; 
  192.   start[64]:=0; start[65]:=1; start[66]:=1; start[67]:=1; 
  193.   start[68]:=1; start[69]:=1; start[70]:=1; start[71]:=1; 
  194.   start[72]:=1; start[73]:=1; start[74]:=1; start[75]:=1; 
  195.   start[76]:=1; start[77]:=1; start[78]:=1; start[79]:=1; 
  196.   start[80]:=1; start[81]:=1; start[82]:=1; start[83]:=1; 
  197.   start[84]:=1; start[85]:=1; start[86]:=1; start[87]:=1; 
  198.   start[88]:=1; start[89]:=1; start[90]:=1; start[91]:=15; 
  199.   start[92]:=0; start[93]:=16; start[94]:=0; start[95]:=0; 
  200.   start[96]:=0; start[97]:=1; start[98]:=1; start[99]:=1; 
  201.   start[100]:=1; start[101]:=1; start[102]:=1; start[103]:=1; 
  202.   start[104]:=1; start[105]:=1; start[106]:=1; start[107]:=1; 
  203.   start[108]:=1; start[109]:=1; start[110]:=1; start[111]:=1; 
  204.   start[112]:=1; start[113]:=1; start[114]:=1; start[115]:=1; 
  205.   start[116]:=1; start[117]:=1; start[118]:=1; start[119]:=1; 
  206.   start[120]:=1; start[121]:=1; start[122]:=1; start[123]:=17; 
  207.   start[124]:=14; start[125]:=18; start[126]:=0; start[127]:=0; 
  208. END CRS.
  209.