Subversion Repositories Kolibri OS

Rev

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)