Rev 7693 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7693 | Rev 7696 | ||
---|---|---|---|
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, 2019, Anton Krotov |
4 | Copyright (c) 2018-2019, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 49... | Line 49... | ||
49 | LEXSTR* = ARRAY LEXLEN OF CHAR; |
49 | LEXSTR* = ARRAY LEXLEN OF CHAR; |
Line 50... | Line 50... | ||
50 | 50 | ||
Line 51... | Line 51... | ||
51 | IDENT* = POINTER TO RECORD (AVL.DATA) |
51 | IDENT* = POINTER TO RECORD (AVL.DATA) |
52 | 52 | ||
- | 53 | s*: LEXSTR; |
|
Line 53... | Line 54... | ||
53 | s*: LEXSTR; |
54 | offset*, offsetW*: INTEGER; |
Line 54... | Line 55... | ||
54 | offset*, offsetW*: INTEGER |
55 | key: INTEGER |
Line 76... | Line 77... | ||
76 | 77 | ||
Line 77... | Line 78... | ||
77 | END; |
78 | END; |
Line 78... | Line -... | ||
78 | - | ||
79 | SCANNER* = TXT.TEXT; |
- | |
Line 80... | Line 79... | ||
80 | 79 | ||
Line 81... | Line 80... | ||
81 | KEYWORD = ARRAY 10 OF CHAR; |
80 | SCANNER* = TXT.TEXT; |
Line 82... | Line -... | ||
82 | - | ||
83 | 81 | ||
84 | VAR |
- | |
85 | - | ||
Line 86... | Line 82... | ||
86 | vocabulary: RECORD |
82 | |
Line 87... | Line 83... | ||
87 | 83 | VAR |
|
Line 88... | Line 84... | ||
88 | KW: ARRAY 33 OF KEYWORD; |
84 | |
89 | delimiters: ARRAY 256 OF BOOLEAN; |
85 | idents: AVL.NODE; |
90 | idents: AVL.NODE; |
86 | |
Line 91... | Line -... | ||
91 | ident: IDENT |
- | |
92 | - | ||
93 | END; |
- | |
94 | - | ||
95 | upto: BOOLEAN; |
- | |
96 | - | ||
97 | - | ||
98 | PROCEDURE nodecmp (a, b: AVL.DATA): INTEGER; |
- | |
99 | RETURN ORD(a(IDENT).s > b(IDENT).s) - ORD(a(IDENT).s < b(IDENT).s) |
- | |
100 | END nodecmp; |
- | |
101 | - | ||
102 | - | ||
103 | PROCEDURE key (VAR lex: LEX); |
- | |
104 | VAR |
- | |
105 | L, R, M: INTEGER; |
- | |
106 | found: BOOLEAN; |
- | |
107 | - | ||
108 | BEGIN |
- | |
109 | L := 0; |
- | |
110 | R := LEN(vocabulary.KW) - 1; |
- | |
111 | found := FALSE; |
- | |
112 | - | ||
113 | REPEAT |
- | |
114 | M := (L + R) DIV 2; |
- | |
115 | - | ||
116 | IF lex.s # vocabulary.KW[M] THEN |
- | |
117 | IF lex.s > vocabulary.KW[M] THEN |
- | |
118 | L := M + 1 |
87 | delimiters: ARRAY 256 OF BOOLEAN; |
119 | ELSE |
88 | |
120 | R := M - 1 |
89 | NewIdent: IDENT; |
121 | END |
90 | |
Line 122... | Line 91... | ||
122 | ELSE |
91 | upto: BOOLEAN; |
123 | found := TRUE; |
92 | |
124 | lex.sym := lxKW + M |
93 | |
Line 125... | Line 94... | ||
125 | END |
94 | PROCEDURE nodecmp (a, b: AVL.DATA): INTEGER; |
126 | UNTIL found OR (L > R) |
95 | RETURN ORD(a(IDENT).s > b(IDENT).s) - ORD(a(IDENT).s < b(IDENT).s) |
127 | END key; |
96 | END nodecmp; |
128 | 97 | ||
- | 98 | ||
129 | 99 | PROCEDURE enterid* (s: LEXSTR): IDENT; |
|
Line 130... | Line 100... | ||
130 | PROCEDURE enterid* (s: LEXSTR): IDENT; |
100 | VAR |
131 | VAR |
101 | newnode: BOOLEAN; |
Line 179... | Line 149... | ||
179 | END; |
149 | END; |
Line 180... | Line 150... | ||
180 | 150 | ||
181 | IF lex.over THEN |
151 | IF lex.over THEN |
182 | lex.sym := lxERROR06 |
152 | lex.sym := lxERROR06 |
183 | ELSE |
153 | ELSE |
- | 154 | lex.ident := enterid(lex.s); |
|
184 | lex.sym := lxIDENT; |
155 | IF lex.ident.key # 0 THEN |
185 | key(lex) |
156 | lex.sym := lex.ident.key |
186 | END; |
- | |
187 | 157 | ELSE |
|
188 | IF lex.sym = lxIDENT THEN |
158 | lex.sym := lxIDENT |
189 | lex.ident := enterid(lex.s) |
159 | END |
Line 190... | Line 160... | ||
190 | END |
160 | END |
Line 516... | Line 486... | ||
516 | ident(text, lex) |
486 | ident(text, lex) |
517 | ELSIF S.digit(c) THEN |
487 | ELSIF S.digit(c) THEN |
518 | number(text, lex) |
488 | number(text, lex) |
519 | ELSIF (c = '"') OR (c = "'") THEN |
489 | ELSIF (c = '"') OR (c = "'") THEN |
520 | string(text, lex, c) |
490 | string(text, lex, c) |
521 | ELSIF vocabulary.delimiters[ORD(c)] THEN |
491 | ELSIF delimiters[ORD(c)] THEN |
522 | delimiter(text, lex, c) |
492 | delimiter(text, lex, c) |
523 | ELSIF c = 0X THEN |
493 | ELSIF c = 0X THEN |
524 | lex.sym := lxEOF; |
494 | lex.sym := lxEOF; |
525 | IF text.eof THEN |
495 | IF text.eof THEN |
526 | INC(lex.pos.col) |
496 | INC(lex.pos.col) |
Line 564... | Line 534... | ||
564 | VAR |
534 | VAR |
565 | i: INTEGER; |
535 | i: INTEGER; |
566 | delim: ARRAY 23 OF CHAR; |
536 | delim: ARRAY 23 OF CHAR; |
Line 567... | Line 537... | ||
567 | 537 | ||
- | 538 | ||
- | 539 | PROCEDURE enterkw (key: INTEGER; kw: LEXSTR); |
|
- | 540 | VAR |
|
568 | 541 | id: IDENT; |
|
569 | PROCEDURE enterkw (VAR i: INTEGER; kw: KEYWORD); |
542 | |
570 | BEGIN |
543 | BEGIN |
571 | vocabulary.KW[i] := kw; |
544 | id := enterid(kw); |
Line 572... | Line 545... | ||
572 | INC(i) |
545 | id.key := key |
573 | END enterkw; |
546 | END enterkw; |
Line 574... | Line 547... | ||
574 | 547 | ||
575 | 548 | ||
576 | BEGIN |
549 | BEGIN |
Line 577... | Line 550... | ||
577 | upto := FALSE; |
550 | upto := FALSE; |
Line 578... | Line 551... | ||
578 | 551 | ||
579 | FOR i := 0 TO 255 DO |
552 | FOR i := 0 TO 255 DO |
580 | vocabulary.delimiters[i] := FALSE |
553 | delimiters[i] := FALSE |
Line -... | Line 554... | ||
- | 554 | END; |
|
- | 555 | ||
- | 556 | delim := "+-*/~&.,;|([{^=#<>:)]}"; |
|
- | 557 | ||
- | 558 | FOR i := 0 TO LEN(delim) - 2 DO |
|
- | 559 | delimiters[ORD(delim[i])] := TRUE |
|
581 | END; |
560 | END; |
- | 561 | ||
582 | 562 | NEW(NewIdent); |
|
583 | delim := "+-*/~&.,;|([{^=#<>:)]}"; |
563 | NewIdent.s := ""; |
584 | 564 | NewIdent.offset := -1; |
|
585 | FOR i := 0 TO LEN(delim) - 2 DO |
565 | NewIdent.offsetW := -1; |
586 | vocabulary.delimiters[ORD(delim[i])] := TRUE |
566 | NewIdent.key := 0; |
587 | END; |
567 | |
588 | 568 | idents := NIL; |
|
589 | i := 0; |
569 | |
590 | enterkw(i, "ARRAY"); |
570 | enterkw(lxARRAY, "ARRAY"); |
591 | enterkw(i, "BEGIN"); |
571 | enterkw(lxBEGIN, "BEGIN"); |
592 | enterkw(i, "BY"); |
572 | enterkw(lxBY, "BY"); |
593 | enterkw(i, "CASE"); |
573 | enterkw(lxCASE, "CASE"); |
594 | enterkw(i, "CONST"); |
574 | enterkw(lxCONST, "CONST"); |
595 | enterkw(i, "DIV"); |
575 | enterkw(lxDIV, "DIV"); |
596 | enterkw(i, "DO"); |
576 | enterkw(lxDO, "DO"); |
597 | enterkw(i, "ELSE"); |
577 | enterkw(lxELSE, "ELSE"); |
598 | enterkw(i, "ELSIF"); |
578 | enterkw(lxELSIF, "ELSIF"); |
599 | enterkw(i, "END"); |
579 | enterkw(lxEND, "END"); |
600 | enterkw(i, "FALSE"); |
580 | enterkw(lxFALSE, "FALSE"); |
601 | enterkw(i, "FOR"); |
581 | enterkw(lxFOR, "FOR"); |
602 | enterkw(i, "IF"); |
582 | enterkw(lxIF, "IF"); |
603 | enterkw(i, "IMPORT"); |
583 | enterkw(lxIMPORT, "IMPORT"); |
604 | enterkw(i, "IN"); |
584 | enterkw(lxIN, "IN"); |
605 | enterkw(i, "IS"); |
585 | enterkw(lxIS, "IS"); |
606 | enterkw(i, "MOD"); |
586 | enterkw(lxMOD, "MOD"); |
607 | enterkw(i, "MODULE"); |
587 | enterkw(lxMODULE, "MODULE"); |
608 | enterkw(i, "NIL"); |
588 | enterkw(lxNIL, "NIL"); |
609 | enterkw(i, "OF"); |
589 | enterkw(lxOF, "OF"); |
610 | enterkw(i, "OR"); |
590 | enterkw(lxOR, "OR"); |
611 | enterkw(i, "POINTER"); |
591 | enterkw(lxPOINTER, "POINTER"); |
612 | enterkw(i, "PROCEDURE"); |
592 | enterkw(lxPROCEDURE, "PROCEDURE"); |
613 | enterkw(i, "RECORD"); |
593 | enterkw(lxRECORD, "RECORD"); |
614 | enterkw(i, "REPEAT"); |
594 | enterkw(lxREPEAT, "REPEAT"); |
615 | enterkw(i, "RETURN"); |
595 | enterkw(lxRETURN, "RETURN"); |
616 | enterkw(i, "THEN"); |
- | |
617 | enterkw(i, "TO"); |
- | |
618 | enterkw(i, "TRUE"); |
- | |
619 | enterkw(i, "TYPE"); |
- | |
620 | enterkw(i, "UNTIL"); |
- | |
621 | enterkw(i, "VAR"); |
596 | enterkw(lxTHEN, "THEN"); |
Line 622... | Line 597... | ||
622 | enterkw(i, "WHILE"); |
597 | enterkw(lxTO, "TO"); |
623 | 598 | enterkw(lxTRUE, "TRUE"); |