Subversion Repositories Kolibri OS

Rev

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");