Rev 8097 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8097 | Rev 8859 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2018-2020, Anton Krotov |
4 | Copyright (c) 2018-2021, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | MODULE SCAN; |
8 | MODULE SCAN; |
Line -... | Line 9... | ||
- | 9 | ||
- | 10 | IMPORT TXT := TEXTDRV, ARITH, S := STRINGS, ERRORS, LISTS; |
|
9 | 11 | ||
Line 10... | Line 12... | ||
10 | IMPORT TXT := TEXTDRV, AVL := AVLTREES, ARITH, S := STRINGS, ERRORS, LISTS; |
12 | |
11 | 13 | CONST |
|
12 | 14 | ||
Line 37... | Line 39... | ||
37 | lxREPEAT* = 75; lxRETURN* = 76; lxTHEN* = 77; lxTO* = 78; |
39 | lxREPEAT* = 75; lxRETURN* = 76; lxTHEN* = 77; lxTO* = 78; |
38 | lxTRUE* = 79; lxTYPE* = 80; lxUNTIL* = 81; lxVAR* = 82; |
40 | lxTRUE* = 79; lxTYPE* = 80; lxUNTIL* = 81; lxVAR* = 82; |
39 | lxWHILE* = 83; |
41 | lxWHILE* = 83; |
Line 40... | Line 42... | ||
40 | 42 | ||
41 | lxERROR01* = -1; lxERROR02* = -2; lxERROR03* = -3; lxERROR04* = -4; |
43 | lxERROR01* = -1; lxERROR02* = -2; lxERROR03* = -3; lxERROR04* = -4; |
42 | lxERROR05* = -5; lxERROR06* = -6; lxERROR07* = -7; lxERROR08* = -8; |
44 | lxERROR05* = -5; (*lxERROR06* = -6;*) lxERROR07* = -7; lxERROR08* = -8; |
43 | lxERROR09* = -9; lxERROR10* = -10; lxERROR11* = -11; lxERROR12* = -12; |
45 | lxERROR09* = -9; lxERROR10* = -10; lxERROR11* = -11; lxERROR12* = -12; |
Line 44... | Line 46... | ||
44 | lxERROR13* = -13; |
46 | lxERROR13* = -13; |
Line 45... | Line 47... | ||
45 | 47 | ||
- | 48 | ||
Line 46... | Line 49... | ||
46 | 49 | TYPE |
|
Line 47... | Line 50... | ||
47 | TYPE |
50 | |
Line 48... | Line 51... | ||
48 | 51 | TEXTSTR* = ARRAY TEXTLEN OF CHAR; |
|
Line 49... | Line 52... | ||
49 | LEXSTR* = ARRAY LEXLEN OF CHAR; |
52 | IDSTR* = ARRAY IDLEN OF CHAR; |
Line 50... | Line 53... | ||
50 | 53 | ||
51 | DEF = POINTER TO RECORD (LISTS.ITEM) |
54 | DEF = POINTER TO RECORD (LISTS.ITEM) |
- | 55 | ||
- | 56 | ident: IDSTR |
|
- | 57 | ||
- | 58 | END; |
|
- | 59 | ||
- | 60 | STRING* = POINTER TO RECORD (LISTS.ITEM) |
|
52 | 61 | ||
Line 53... | Line 62... | ||
53 | ident: LEXSTR |
62 | s*: TEXTSTR; |
Line 54... | Line 63... | ||
54 | 63 | offset*, offsetW*, hash: INTEGER |
|
Line 68... | Line 77... | ||
68 | 77 | ||
Line 69... | Line 78... | ||
69 | END; |
78 | END; |
Line 70... | Line -... | ||
70 | - | ||
71 | LEX* = RECORD |
- | |
72 | 79 | ||
73 | s*: LEXSTR; |
80 | LEX* = RECORD |
74 | length*: INTEGER; |
81 | |
75 | sym*: INTEGER; |
82 | sym*: INTEGER; |
76 | pos*: POSITION; |
83 | pos*: POSITION; |
77 | ident*: IDENT; |
84 | ident*: IDENT; |
78 | string*: IDENT; |
- | |
79 | value*: ARITH.VALUE; |
- | |
Line 80... | Line 85... | ||
80 | error*: INTEGER; |
85 | string*: STRING; |
Line 81... | Line 86... | ||
81 | 86 | value*: ARITH.VALUE; |
|
Line -... | Line 87... | ||
- | 87 | error*: INTEGER |
|
Line 82... | Line -... | ||
82 | over: BOOLEAN |
- | |
Line 83... | Line 88... | ||
83 | 88 | ||
Line 84... | Line 89... | ||
84 | END; |
89 | END; |
Line 85... | Line -... | ||
85 | - | ||
86 | SCANNER* = TXT.TEXT; |
- | |
87 | 90 | ||
Line 88... | Line 91... | ||
88 | 91 | SCANNER* = TXT.TEXT; |
|
Line -... | Line 92... | ||
- | 92 | ||
Line 89... | Line -... | ||
89 | VAR |
- | |
90 | - | ||
91 | idents: AVL.NODE; |
- | |
Line -... | Line 93... | ||
- | 93 | KEYWORD = ARRAY 10 OF CHAR; |
|
- | 94 | ||
- | 95 | ||
- | 96 | VAR |
|
- | 97 | ||
- | 98 | delimiters: ARRAY 256 OF BOOLEAN; |
|
- | 99 | ||
- | 100 | upto, LowerCase, _if: BOOLEAN; |
|
Line -... | Line 101... | ||
- | 101 | ||
92 | 102 | strings, def: LISTS.LIST; |
|
93 | delimiters: ARRAY 256 OF BOOLEAN; |
103 | |
94 | 104 | KW: ARRAY 33 OF RECORD upper, lower: KEYWORD; uhash, lhash: INTEGER END; |
|
95 | NewIdent: IDENT; |
- | |
Line 96... | Line 105... | ||
96 | 105 | ||
- | 106 | ||
97 | upto, LowerCase, _if: BOOLEAN; |
107 | PROCEDURE enterKW (s: KEYWORD; idx: INTEGER); |
- | 108 | BEGIN |
|
98 | 109 | KW[idx].lower := s; |
|
99 | def: LISTS.LIST; |
- | |
100 | 110 | KW[idx].upper := s; |
|
101 | 111 | S.UpCase(KW[idx].upper); |
|
102 | PROCEDURE nodecmp (a, b: AVL.DATA): INTEGER; |
112 | KW[idx].uhash := S.HashStr(KW[idx].upper); |
103 | RETURN ORD(a(IDENT).s > b(IDENT).s) - ORD(a(IDENT).s < b(IDENT).s) |
113 | KW[idx].lhash := S.HashStr(KW[idx].lower); |
104 | END nodecmp; |
114 | END enterKW; |
105 | 115 | ||
Line 106... | Line 116... | ||
106 | 116 | ||
107 | PROCEDURE enterid* (s: LEXSTR): IDENT; |
117 | PROCEDURE checkKW (ident: IDENT): INTEGER; |
- | 118 | VAR |
|
Line -... | Line 119... | ||
- | 119 | i, res: INTEGER; |
|
- | 120 | ||
- | 121 | BEGIN |
|
- | 122 | res := lxIDENT; |
|
Line 108... | Line -... | ||
108 | VAR |
- | |
109 | newnode: BOOLEAN; |
123 | i := 0; |
110 | node: AVL.NODE; |
124 | WHILE i < LEN(KW) DO |
111 | 125 | IF (KW[i].uhash = ident.hash) & (KW[i].upper = ident.s) |
|
- | 126 | OR LowerCase & (KW[i].lhash = ident.hash) & (KW[i].lower = ident.s) THEN |
|
- | 127 | res := i + lxKW; |
|
- | 128 | i := LEN(KW) |
|
112 | BEGIN |
129 | END; |
113 | NewIdent.s := s; |
130 | INC(i) |
114 | idents := AVL.insert(idents, NewIdent, nodecmp, newnode, node); |
131 | END |
115 | 132 | ||
116 | IF newnode THEN |
133 | RETURN res |
- | 134 | END checkKW; |
|
- | 135 | ||
- | 136 | ||
- | 137 | PROCEDURE enterStr* (s: TEXTSTR): STRING; |
|
- | 138 | VAR |
|
- | 139 | str, res: STRING; |
|
- | 140 | hash: INTEGER; |
|
- | 141 | ||
- | 142 | BEGIN |
|
- | 143 | hash := S.HashStr(s); |
|
- | 144 | str := strings.first(STRING); |
|
117 | NEW(NewIdent); |
145 | res := NIL; |
Line 118... | Line 146... | ||
118 | NewIdent.offset := -1; |
146 | WHILE str # NIL DO |
119 | NewIdent.offsetW := -1; |
147 | IF (str.hash = hash) & (str.s = s) THEN |
120 | NewIdent.key := 0 |
148 | res := str; |
121 | END |
149 | str := NIL |
122 | 150 | ELSE |
|
Line -... | Line 151... | ||
- | 151 | str := str.next(STRING) |
|
- | 152 | END |
|
- | 153 | END; |
|
- | 154 | IF res = NIL THEN |
|
- | 155 | NEW(res); |
|
- | 156 | res.s := s; |
|
- | 157 | res.offset := -1; |
|
123 | RETURN node.data(IDENT) |
158 | res.offsetW := -1; |
124 | END enterid; |
159 | res.hash := hash; |
125 | 160 | LISTS.push(strings, res) |
|
- | 161 | END |
|
Line 126... | Line 162... | ||
126 | 162 | ||
127 | PROCEDURE putchar (VAR lex: LEX; c: CHAR); |
163 | RETURN res |
128 | BEGIN |
164 | END enterStr; |
Line -... | Line 165... | ||
- | 165 | ||
129 | IF lex.length < LEXLEN - 1 THEN |
166 | |
- | 167 | PROCEDURE nextc (text: TXT.TEXT): CHAR; |
|
130 | lex.s[lex.length] := c; |
168 | BEGIN |
131 | INC(lex.length); |
169 | TXT.next(text) |
132 | lex.s[lex.length] := 0X |
170 | RETURN text.peak |
Line 133... | Line 171... | ||
133 | ELSE |
171 | END nextc; |
134 | lex.over := TRUE |
172 | |
135 | END |
- | |
136 | END putchar; |
173 | |
- | 174 | PROCEDURE setIdent* (VAR ident: IDENT; s: IDSTR); |
|
137 | 175 | BEGIN |
|
138 | 176 | ident.s := s; |
|
139 | PROCEDURE nextc (text: TXT.TEXT): CHAR; |
177 | ident.hash := S.HashStr(s) |
140 | BEGIN |
178 | END setIdent; |
141 | TXT.next(text) |
179 | |
142 | RETURN text.peak |
180 | |
143 | END nextc; |
- | |
144 | 181 | PROCEDURE ident (text: TXT.TEXT; VAR lex: LEX); |
|
Line 145... | Line 182... | ||
145 | 182 | VAR |
|
- | 183 | c: CHAR; |
|
- | 184 | i: INTEGER; |
|
- | 185 | ||
146 | PROCEDURE ident (text: TXT.TEXT; VAR lex: LEX); |
186 | BEGIN |
147 | VAR |
187 | c := text.peak; |
148 | c: CHAR; |
188 | ASSERT(S.letter(c)); |
149 | 189 | ||
- | 190 | i := 0; |
|
- | 191 | WHILE (i < IDLEN - 1) & (S.letter(c) OR S.digit(c)) DO |
|
- | 192 | lex.ident.s[i] := c; |
|
- | 193 | INC(i); |
|
- | 194 | c := nextc(text) |
|
- | 195 | END; |
|
- | 196 | ||
- | 197 | lex.ident.s[i] := 0X; |
|
- | 198 | lex.ident.hash := S.HashStr(lex.ident.s); |
|
- | 199 | lex.sym := checkKW(lex.ident); |
|
- | 200 | ||
Line 150... | Line 201... | ||
150 | BEGIN |
201 | IF S.letter(c) OR S.digit(c) THEN |
151 | c := text.peak; |
202 | ERRORS.WarningMsg(lex.pos.line, lex.pos.col, 2); |
152 | ASSERT(S.letter(c)); |
203 | WHILE S.letter(c) OR S.digit(c) DO |
Line -... | Line 204... | ||
- | 204 | c := nextc(text) |
|
- | 205 | END |
|
153 | 206 | END |
|
Line 154... | Line 207... | ||
154 | WHILE S.letter(c) OR S.digit(c) DO |
207 | END ident; |
155 | putchar(lex, c); |
208 | |
Line 156... | Line 209... | ||
156 | c := nextc(text) |
209 | |
157 | END; |
210 | PROCEDURE number (text: TXT.TEXT; VAR lex: LEX); |
158 | 211 | TYPE |
|
159 | IF lex.over THEN |
212 | NUMSTR = ARRAY NUMLEN OF CHAR; |
Line -... | Line 213... | ||
- | 213 | ||
160 | lex.sym := lxERROR06 |
214 | VAR |
161 | ELSE |
215 | c: CHAR; |
162 | lex.ident := enterid(lex.s); |
216 | hex: BOOLEAN; |
163 | IF lex.ident.key # 0 THEN |
217 | error, sym, i: INTEGER; |
164 | lex.sym := lex.ident.key |
218 | num: NUMSTR; |
Line 165... | Line 219... | ||
165 | ELSE |
219 | |
166 | lex.sym := lxIDENT |
220 | |
167 | END |
221 | PROCEDURE push (VAR num: NUMSTR; VAR i: INTEGER; c: CHAR); |
168 | END |
222 | BEGIN |
Line 169... | Line 223... | ||
169 | 223 | IF i < NUMLEN - 1 THEN |
|
170 | END ident; |
224 | num[i] := c; |
171 | 225 | INC(i) |
|
172 | 226 | END |
|
Line 173... | Line 227... | ||
173 | PROCEDURE number (text: TXT.TEXT; VAR lex: LEX); |
227 | END push; |
Line 213... | Line 267... | ||
213 | ELSE |
267 | ELSE |
Line 214... | Line 268... | ||
214 | 268 | ||
Line 215... | Line 269... | ||
215 | c := nextc(text); |
269 | c := nextc(text); |
216 | 270 | ||
217 | IF c # "." THEN |
271 | IF c # "." THEN |
218 | putchar(lex, "."); |
272 | push(num, i, "."); |
219 | sym := lxFLOAT |
273 | sym := lxFLOAT |
220 | ELSE |
274 | ELSE |
221 | sym := lxINTEGER; |
275 | sym := lxINTEGER; |
222 | text.peak := 7FX; |
276 | text.peak := 7FX; |
Line 223... | Line 277... | ||
223 | upto := TRUE |
277 | upto := TRUE |
224 | END; |
278 | END; |
225 | 279 | ||
226 | WHILE S.digit(c) DO |
280 | WHILE S.digit(c) DO |
Line 227... | Line 281... | ||
227 | putchar(lex, c); |
281 | push(num, i, c); |
Line 228... | Line 282... | ||
228 | c := nextc(text) |
282 | c := nextc(text) |
229 | END; |
283 | END; |
230 | 284 | ||
231 | IF c = "E" THEN |
285 | IF (c = "E") OR LowerCase & (c = "e") THEN |
232 | 286 | ||
233 | putchar(lex, c); |
287 | push(num, i, c); |
Line 234... | Line 288... | ||
234 | c := nextc(text); |
288 | c := nextc(text); |
235 | IF (c = "+") OR (c = "-") THEN |
289 | IF (c = "+") OR (c = "-") THEN |
236 | putchar(lex, c); |
290 | push(num, i, c); |
237 | c := nextc(text) |
291 | c := nextc(text) |
238 | END; |
292 | END; |
239 | 293 | ||
240 | IF S.digit(c) THEN |
294 | IF S.digit(c) THEN |
241 | WHILE S.digit(c) DO |
295 | WHILE S.digit(c) DO |
Line 253... | Line 307... | ||
253 | ELSIF hex THEN |
307 | ELSIF hex THEN |
254 | sym := lxERROR01 |
308 | sym := lxERROR01 |
Line 255... | Line 309... | ||
255 | 309 | ||
Line 256... | Line 310... | ||
256 | END; |
310 | END; |
257 | 311 | ||
258 | IF lex.over & (sym >= 0) THEN |
312 | IF (i = NUMLEN - 1) & (sym >= 0) THEN |
Line -... | Line 313... | ||
- | 313 | sym := lxERROR07 |
|
- | 314 | END; |
|
259 | sym := lxERROR07 |
315 | |
260 | END; |
316 | num[i] := 0X; |
261 | 317 | ||
262 | IF sym = lxINTEGER THEN |
318 | IF sym = lxINTEGER THEN |
263 | ARITH.iconv(lex.s, lex.value, error) |
319 | ARITH.iconv(num, lex.value, error) |
264 | ELSIF (sym = lxHEX) OR (sym = lxCHAR) THEN |
320 | ELSIF (sym = lxHEX) OR (sym = lxCHAR) THEN |
265 | ARITH.hconv(lex.s, lex.value, error) |
321 | ARITH.hconv(num, lex.value, error) |
Line 266... | Line 322... | ||
266 | ELSIF sym = lxFLOAT THEN |
322 | ELSIF sym = lxFLOAT THEN |
267 | ARITH.fconv(lex.s, lex.value, error) |
323 | ARITH.fconv(num, lex.value, error) |
268 | END; |
324 | END; |
Line 281... | Line 337... | ||
281 | 337 | ||
282 | 338 | ||
283 | PROCEDURE string (text: TXT.TEXT; VAR lex: LEX; quot: CHAR); |
339 | PROCEDURE string (text: TXT.TEXT; VAR lex: LEX; quot: CHAR); |
284 | VAR |
340 | VAR |
- | 341 | c: CHAR; |
|
Line 285... | Line 342... | ||
285 | c: CHAR; |
342 | i: INTEGER; |
286 | n: INTEGER; |
343 | str: TEXTSTR; |
287 | - | ||
Line -... | Line 344... | ||
- | 344 | ||
288 | BEGIN |
345 | BEGIN |
289 | c := nextc(text); |
346 | c := nextc(text); |
290 | n := 0; |
347 | |
291 | 348 | i := 0; |
|
- | 349 | WHILE (i < LEN(str) - 1) & (c # quot) & (c # 0X) & ~text.eol & ~text.eof DO |
|
- | 350 | str[i] := c; |
|
- | 351 | c := nextc(text); |
|
- | 352 | INC(i) |
|
- | 353 | END; |
|
- | 354 | ||
292 | WHILE (c # quot) & (c # 0X) & ~text.eol & ~text.eof DO |
355 | str[i] := 0X; |
Line 293... | Line 356... | ||
293 | putchar(lex, c); |
356 | |
294 | c := nextc(text); |
357 | IF (i = LEN(str) - 1) & (c # quot) & (c # 0X) & ~text.eol & ~text.eof THEN |
295 | INC(n) |
- | |
296 | END; |
- | |
297 | - | ||
298 | IF c = quot THEN |
358 | lex.sym := lxERROR05 |
299 | TXT.next(text); |
359 | END; |
300 | IF lex.over THEN |
360 | |
301 | lex.sym := lxERROR05 |
361 | IF c = quot THEN |
302 | ELSE |
362 | TXT.next(text); |
303 | IF n # 1 THEN |
363 | IF i # 1 THEN |
304 | lex.sym := lxSTRING |
364 | lex.sym := lxSTRING |
305 | ELSE |
- | |
306 | lex.sym := lxCHAR; |
365 | ELSE |
307 | ARITH.setChar(lex.value, ORD(lex.s[0])) |
366 | lex.sym := lxCHAR; |
Line 308... | Line 367... | ||
308 | END |
367 | ARITH.setChar(lex.value, ORD(str[0])) |
309 | END |
368 | END |
310 | ELSE |
369 | ELSIF lex.sym # lxERROR05 THEN |
311 | lex.sym := lxERROR03 |
370 | lex.sym := lxERROR03 |
312 | END; |
371 | END; |
Line 313... | Line 372... | ||
313 | 372 | ||
Line 355... | Line 414... | ||
355 | UNTIL (depth = 0) OR text.eof |
414 | UNTIL (depth = 0) OR text.eof |
Line 356... | Line 415... | ||
356 | 415 | ||
Line 357... | Line 416... | ||
357 | END comment; |
416 | END comment; |
358 | 417 | ||
359 | 418 | ||
- | 419 | PROCEDURE delimiter (text: TXT.TEXT; c: CHAR): INTEGER; |
|
Line 360... | Line 420... | ||
360 | PROCEDURE delimiter (text: TXT.TEXT; VAR lex: LEX; c: CHAR); |
420 | VAR |
361 | VAR |
421 | sym: INTEGER; |
362 | sym: INTEGER; |
422 | c0: CHAR; |
Line 363... | Line 423... | ||
363 | 423 | ||
364 | BEGIN |
424 | BEGIN |
365 | putchar(lex, c); |
425 | c0 := c; |
Line 366... | Line 426... | ||
366 | c := nextc(text); |
426 | c := nextc(text); |
367 | 427 | ||
Line 394... | Line 454... | ||
394 | |".": |
454 | |".": |
395 | sym := lxPOINT; |
455 | sym := lxPOINT; |
Line 396... | Line 456... | ||
396 | 456 | ||
397 | IF c = "." THEN |
457 | IF c = "." THEN |
398 | sym := lxRANGE; |
- | |
399 | putchar(lex, c); |
458 | sym := lxRANGE; |
400 | TXT.next(text) |
459 | TXT.next(text) |
Line 401... | Line 460... | ||
401 | END |
460 | END |
402 | 461 | ||
Line 436... | Line 495... | ||
436 | |"<": |
495 | |"<": |
437 | sym := lxLT; |
496 | sym := lxLT; |
Line 438... | Line 497... | ||
438 | 497 | ||
439 | IF c = "=" THEN |
498 | IF c = "=" THEN |
440 | sym := lxLE; |
- | |
441 | putchar(lex, c); |
499 | sym := lxLE; |
442 | TXT.next(text) |
500 | TXT.next(text) |
Line 443... | Line 501... | ||
443 | END |
501 | END |
444 | 502 | ||
Line 445... | Line 503... | ||
445 | |">": |
503 | |">": |
446 | sym := lxGT; |
504 | sym := lxGT; |
447 | - | ||
448 | IF c = "=" THEN |
505 | |
449 | sym := lxGE; |
506 | IF c = "=" THEN |
Line 450... | Line 507... | ||
450 | putchar(lex, c); |
507 | sym := lxGE; |
451 | TXT.next(text) |
508 | TXT.next(text) |
Line 452... | Line 509... | ||
452 | END |
509 | END |
453 | 510 | ||
454 | |":": |
- | |
455 | sym := lxCOLON; |
511 | |":": |
456 | 512 | sym := lxCOLON; |
|
Line 457... | Line 513... | ||
457 | IF c = "=" THEN |
513 | |
458 | sym := lxASSIGN; |
514 | IF c = "=" THEN |
Line 467... | Line 523... | ||
467 | sym := lxRSQUARE |
523 | sym := lxRSQUARE |
Line 468... | Line 524... | ||
468 | 524 | ||
469 | |"}": |
525 | |"}": |
Line 470... | Line 526... | ||
470 | sym := lxRCURLY |
526 | sym := lxRCURLY |
471 | - | ||
472 | END; |
- | |
Line -... | Line 527... | ||
- | 527 | ||
473 | 528 | END |
|
Line 474... | Line 529... | ||
474 | lex.sym := sym |
529 | |
475 | 530 | RETURN sym |
|
Line 536... | Line 591... | ||
536 | 591 | ||
537 | Next(text, lex); |
592 | Next(text, lex); |
Line 538... | Line 593... | ||
538 | check(lex.sym = lxIDENT, text, lex, 22); |
593 | check(lex.sym = lxIDENT, text, lex, 22); |
539 | 594 | ||
540 | REPEAT |
595 | REPEAT |
541 | IF IsDef(lex.s) THEN |
596 | IF IsDef(lex.ident.s) THEN |
Line 542... | Line 597... | ||
542 | skip := FALSE |
597 | skip := FALSE |
543 | END; |
598 | END; |
Line 588... | Line 643... | ||
588 | 643 | ||
589 | WHILE S.space(c) DO |
644 | WHILE S.space(c) DO |
590 | c := nextc(text) |
645 | c := nextc(text) |
Line 591... | Line -... | ||
591 | END; |
- | |
592 | - | ||
593 | lex.s[0] := 0X; |
646 | END; |
594 | lex.length := 0; |
647 | |
595 | lex.pos.line := text.line; |
- | |
596 | lex.pos.col := text.col; |
- | |
Line 597... | Line 648... | ||
597 | lex.ident := NIL; |
648 | lex.pos.line := text.line; |
598 | lex.over := FALSE; |
649 | lex.pos.col := text.col; |
599 | 650 | ||
600 | IF S.letter(c) THEN |
651 | IF S.letter(c) THEN |
601 | ident(text, lex) |
652 | ident(text, lex) |
602 | ELSIF S.digit(c) THEN |
653 | ELSIF S.digit(c) THEN |
603 | number(text, lex) |
654 | number(text, lex) |
604 | ELSIF (c = '"') OR (c = "'") THEN |
655 | ELSIF (c = '"') OR (c = "'") THEN |
605 | string(text, lex, c) |
656 | string(text, lex, c) |
606 | ELSIF delimiters[ORD(c)] THEN |
657 | ELSIF delimiters[ORD(c)] THEN |
607 | delimiter(text, lex, c) |
658 | lex.sym := delimiter(text, c) |
608 | ELSIF c = "$" THEN |
659 | ELSIF c = "$" THEN |
609 | IF S.letter(nextc(text)) THEN |
660 | IF S.letter(nextc(text)) THEN |
Line 629... | Line 680... | ||
629 | INC(lex.pos.col) |
680 | INC(lex.pos.col) |
630 | END |
681 | END |
631 | ELSIF (c = 7FX) & upto THEN |
682 | ELSIF (c = 7FX) & upto THEN |
632 | upto := FALSE; |
683 | upto := FALSE; |
633 | lex.sym := lxRANGE; |
684 | lex.sym := lxRANGE; |
634 | putchar(lex, "."); |
- | |
635 | putchar(lex, "."); |
- | |
636 | DEC(lex.pos.col); |
685 | DEC(lex.pos.col); |
637 | TXT.next(text) |
686 | TXT.next(text) |
638 | ELSE |
687 | ELSE |
639 | putchar(lex, c); |
- | |
640 | TXT.next(text); |
688 | TXT.next(text); |
641 | lex.sym := lxERROR04 |
689 | lex.sym := lxERROR04 |
642 | END; |
690 | END; |
Line 643... | Line 691... | ||
643 | 691 | ||
Line 666... | Line 714... | ||
666 | PROCEDURE init* (lower: BOOLEAN); |
714 | PROCEDURE init* (lower: BOOLEAN); |
667 | VAR |
715 | VAR |
668 | i: INTEGER; |
716 | i: INTEGER; |
669 | delim: ARRAY 23 OF CHAR; |
717 | delim: ARRAY 23 OF CHAR; |
Line 670... | Line -... | ||
670 | - | ||
671 | - | ||
672 | PROCEDURE enterkw (key: INTEGER; kw: LEXSTR); |
- | |
673 | VAR |
- | |
674 | id: IDENT; |
- | |
675 | upper: LEXSTR; |
- | |
676 | - | ||
677 | BEGIN |
- | |
678 | IF LowerCase THEN |
- | |
679 | id := enterid(kw); |
- | |
680 | id.key := key |
- | |
681 | END; |
- | |
682 | upper := kw; |
- | |
683 | S.UpCase(upper); |
- | |
684 | id := enterid(upper); |
- | |
685 | id.key := key |
- | |
686 | END enterkw; |
- | |
687 | - | ||
688 | 718 | ||
689 | BEGIN |
719 | BEGIN |
690 | upto := FALSE; |
720 | upto := FALSE; |
Line 691... | Line 721... | ||
691 | LowerCase := lower; |
721 | LowerCase := lower; |
Line 698... | Line 728... | ||
698 | 728 | ||
699 | FOR i := 0 TO LEN(delim) - 2 DO |
729 | FOR i := 0 TO LEN(delim) - 2 DO |
700 | delimiters[ORD(delim[i])] := TRUE |
730 | delimiters[ORD(delim[i])] := TRUE |
Line 701... | Line -... | ||
701 | END; |
- | |
702 | - | ||
703 | NEW(NewIdent); |
- | |
704 | NewIdent.s := ""; |
- | |
705 | NewIdent.offset := -1; |
- | |
706 | NewIdent.offsetW := -1; |
- | |
707 | NewIdent.key := 0; |
- | |
708 | - | ||
709 | idents := NIL; |
731 | END; |
710 | 732 | ||
711 | enterkw(lxARRAY, "array"); |
733 | enterKW("array", 0); |
712 | enterkw(lxBEGIN, "begin"); |
734 | enterKW("begin", 1); |
713 | enterkw(lxBY, "by"); |
735 | enterKW("by", 2); |
714 | enterkw(lxCASE, "case"); |
736 | enterKW("case", 3); |
715 | enterkw(lxCONST, "const"); |
737 | enterKW("const", 4); |
716 | enterkw(lxDIV, "div"); |
738 | enterKW("div", 5); |
717 | enterkw(lxDO, "do"); |
739 | enterKW("do", 6); |
718 | enterkw(lxELSE, "else"); |
740 | enterKW("else", 7); |
719 | enterkw(lxELSIF, "elsif"); |
741 | enterKW("elsif", 8); |
720 | enterkw(lxEND, "end"); |
742 | enterKW("end", 9); |
721 | enterkw(lxFALSE, "false"); |
743 | enterKW("false", 10); |
722 | enterkw(lxFOR, "for"); |
744 | enterKW("for", 11); |
723 | enterkw(lxIF, "if"); |
745 | enterKW("if", 12); |
724 | enterkw(lxIMPORT, "import"); |
746 | enterKW("import", 13); |
725 | enterkw(lxIN, "in"); |
747 | enterKW("in", 14); |
726 | enterkw(lxIS, "is"); |
748 | enterKW("is", 15); |
727 | enterkw(lxMOD, "mod"); |
749 | enterKW("mod", 16); |
728 | enterkw(lxMODULE, "module"); |
750 | enterKW("module", 17); |
729 | enterkw(lxNIL, "nil"); |
751 | enterKW("nil", 18); |
730 | enterkw(lxOF, "of"); |
752 | enterKW("of", 19); |
731 | enterkw(lxOR, "or"); |
753 | enterKW("or", 20); |
732 | enterkw(lxPOINTER, "pointer"); |
754 | enterKW("pointer", 21); |
733 | enterkw(lxPROCEDURE, "procedure"); |
755 | enterKW("procedure", 22); |
734 | enterkw(lxRECORD, "record"); |
756 | enterKW("record", 23); |
735 | enterkw(lxREPEAT, "repeat"); |
757 | enterKW("repeat", 24); |
736 | enterkw(lxRETURN, "return"); |
758 | enterKW("return", 25); |
737 | enterkw(lxTHEN, "then"); |
759 | enterKW("then", 26); |
738 | enterkw(lxTO, "to"); |
760 | enterKW("to", 27); |
739 | enterkw(lxTRUE, "true"); |
761 | enterKW("true", 28); |
740 | enterkw(lxTYPE, "type"); |
762 | enterKW("type", 29); |
741 | enterkw(lxUNTIL, "until"); |
763 | enterKW("until", 30); |
742 | enterkw(lxVAR, "var"); |
- | |
743 | enterkw(lxWHILE, "while") |
764 | enterKW("var", 31); |
Line 744... | Line 765... | ||
744 | 765 | enterKW("while", 32) |
|
745 | END init; |
766 | END init; |
Line 755... | Line 776... | ||
755 | LISTS.push(def, item) |
776 | LISTS.push(def, item) |
756 | END NewDef; |
777 | END NewDef; |
Line 757... | Line 778... | ||
757 | 778 | ||
758 | 779 | ||
- | 780 | BEGIN |
|
759 | BEGIN |
781 | def := LISTS.create(NIL); |
760 | def := LISTS.create(NIL) |
782 | strings := LISTS.create(NIL) |