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 22... Line 22...
22
    idSYSPROC* = 12;  idIMP*    = 13;
22
    idSYSPROC* = 12;  idIMP*    = 13;
Line 23... Line 23...
23
 
23
 
24
    tINTEGER* =  1;  tBYTE*      =  2;  tCHAR*   =  3;  tSET*    =  4;
24
    tINTEGER* =  1;  tBYTE*      =  2;  tCHAR*   =  3;  tSET*    =  4;
25
    tBOOLEAN* =  5;  tREAL*      =  6;  tARRAY*  =  7;  tRECORD* =  8;
25
    tBOOLEAN* =  5;  tREAL*      =  6;  tARRAY*  =  7;  tRECORD* =  8;
26
    tPOINTER* =  9;  tPROCEDURE* = 10;  tSTRING* = 11;  tNIL*    = 12;
26
    tPOINTER* =  9;  tPROCEDURE* = 10;  tSTRING* = 11;  tNIL*    = 12;
Line 27... Line 27...
27
    tCARD16*  = 13;  tCARD32*    = 14;  tANYREC* = 15;  tWCHAR*  = 16;
27
    tCARD32*  = 13;  tANYREC*    = 14;  tWCHAR*  = 15;
Line 28... Line 28...
28
 
28
 
29
    BASICTYPES* = {tINTEGER, tBYTE, tCHAR, tSET, tBOOLEAN, tREAL, tCARD16, tCARD32, tWCHAR};
29
    BASICTYPES* = {tINTEGER, tBYTE, tCHAR, tSET, tBOOLEAN, tREAL, tCARD32, tWCHAR};
30
 
30
 
31
    stABS*  =  1;  stASR*  =  2;  stCHR*    =  3;  stFLOOR* =  4;
31
    stABS*  =  1;  stASR*  =  2;  stCHR*    =  3;  stFLOOR* =  4;
Line 70... Line 70...
70
 
70
 
Line 71... Line 71...
71
TYPE
71
TYPE
Line 72... Line 72...
72
 
72
 
73
    OPTIONS* = RECORD
73
    OPTIONS* = RECORD
74
 
74
 
Line 75... Line 75...
75
        version*, stack*, base*, ram*, rom*: INTEGER;
75
        version*, stack*, ram*, rom*: INTEGER;
Line 203... Line 203...
203
        obj*:        BOOLEAN;
203
        obj*:        BOOLEAN;
Line 204... Line 204...
204
 
204
 
Line 205... Line 205...
205
        stTypes*:    RECORD
205
        stTypes*:    RECORD
206
 
206
 
Line 207... Line 207...
207
            tINTEGER*, tBYTE*, tCHAR*, tWCHAR*, tSET*, tBOOLEAN*, tREAL*,
207
            tINTEGER*, tBYTE*, tCHAR*, tWCHAR*, tSET*, tBOOLEAN*, tREAL*,
Line 208... Line 208...
208
            tSTRING*, tNIL*, tCARD16*, tCARD32*, tANYREC*: TYPE_
208
            tSTRING*, tNIL*, tCARD32*, tANYREC*: TYPE_
Line 252... Line 252...
252
    word: INTEGER;
252
    word: INTEGER;
253
    size: INTEGER;
253
    size: INTEGER;
Line 254... Line 254...
254
 
254
 
255
BEGIN
255
BEGIN
-
 
256
    IF varIdent.offset = -1 THEN
256
    IF varIdent.offset = -1 THEN
257
        size := varIdent.type.size;
257
        IF varIdent.global THEN
258
        IF varIdent.global THEN
258
            IF UTILS.Align(program.bss, varIdent.type.align) THEN
259
            IF UTILS.Align(program.bss, varIdent.type.align) THEN
259
                IF UTILS.maxint - program.bss >= varIdent.type.size THEN
260
                IF UTILS.maxint - program.bss >= size THEN
260
                    varIdent.offset := program.bss;
261
                    varIdent.offset := program.bss;
261
                    INC(program.bss, varIdent.type.size)
262
                    INC(program.bss, size)
262
                END
263
                END
263
            END
264
            END
264
        ELSE
265
        ELSE
265
            word := program.target.word;
-
 
266
            size := varIdent.type.size;
266
            word := program.target.word;
267
            IF UTILS.Align(size, word) THEN
267
            IF UTILS.Align(size, word) THEN
268
                size := size DIV word;
268
                size := size DIV word;
269
                IF UTILS.maxint - program.locsize >= size THEN
269
                IF UTILS.maxint - program.locsize >= size THEN
270
                    INC(program.locsize, size);
270
                    INC(program.locsize, size);
271
                    varIdent.offset := program.locsize;
271
                    varIdent.offset := program.locsize
272
                END
272
                END
-
 
273
            END
-
 
274
        END;
-
 
275
 
-
 
276
        IF varIdent.offset = -1 THEN
273
            END
277
            ERRORS.Error(204)
274
        END
278
        END
Line 275... Line 279...
275
    END
279
    END
276
 
280
 
Line 507... Line 511...
507
        LISTS.delete(unit.idents, item);
511
        LISTS.delete(unit.idents, item);
508
        C.push(idents, item)
512
        C.push(idents, item)
509
    END;
513
    END;
Line 510... Line 514...
510
 
514
 
511
    DEC(unit.scopeLvl)
-
 
512
 
515
    DEC(unit.scopeLvl)
Line 513... Line 516...
513
END closeScope;
516
END closeScope;
514
 
517
 
Line 629... Line 632...
629
PROCEDURE isOpenArray* (t: TYPE_): BOOLEAN;
632
PROCEDURE isOpenArray* (t: TYPE_): BOOLEAN;
630
    RETURN (t.typ = tARRAY) & (t.length = 0)
633
    RETURN (t.typ = tARRAY) & (t.length = 0)
631
END isOpenArray;
634
END isOpenArray;
Line -... Line 635...
-
 
635
 
-
 
636
 
-
 
637
PROCEDURE arrcomp* (src, dst: TYPE_): BOOLEAN;
-
 
638
    RETURN (dst.typ = tARRAY) & isOpenArray(src) &
-
 
639
            ~isOpenArray(src.base) & ~isOpenArray(dst.base) &
-
 
640
            isTypeEq(src.base, dst.base)
-
 
641
END arrcomp;
632
 
642
 
633
 
643
 
634
PROCEDURE getUnit* (program: PROGRAM; name: SCAN.IDENT): UNIT;
644
PROCEDURE getUnit* (program: PROGRAM; name: SCAN.IDENT): UNIT;
Line 635... Line 645...
635
VAR
645
VAR
Line 1057... Line 1067...
1057
VAR
1067
VAR
1058
    res: TYPE_;
1068
    res: TYPE_;
Line 1059... Line 1069...
1059
 
1069
 
Line 1060... Line 1070...
1060
BEGIN
1070
BEGIN
1061
 
1071
 
1062
    IF typ = ARITH.tINTEGER THEN
-
 
1063
        res := program.stTypes.tINTEGER
1072
    CASE typ OF
1064
    ELSIF typ = ARITH.tREAL THEN
-
 
1065
        res := program.stTypes.tREAL
1073
    |ARITH.tINTEGER: res := program.stTypes.tINTEGER
1066
    ELSIF typ = ARITH.tSET THEN
-
 
1067
        res := program.stTypes.tSET
1074
    |ARITH.tREAL:    res := program.stTypes.tREAL
1068
    ELSIF typ = ARITH.tBOOLEAN THEN
-
 
1069
        res := program.stTypes.tBOOLEAN
1075
    |ARITH.tSET:     res := program.stTypes.tSET
1070
    ELSIF typ = ARITH.tCHAR THEN
-
 
1071
        res := program.stTypes.tCHAR
1076
    |ARITH.tBOOLEAN: res := program.stTypes.tBOOLEAN
1072
    ELSIF typ = ARITH.tWCHAR THEN
-
 
1073
        res := program.stTypes.tWCHAR
1077
    |ARITH.tCHAR:    res := program.stTypes.tCHAR
1074
    ELSIF typ = ARITH.tSTRING THEN
-
 
1075
        res := program.stTypes.tSTRING
-
 
1076
    ELSE
1078
    |ARITH.tWCHAR:   res := program.stTypes.tWCHAR
1077
        res := NIL
-
 
1078
    END;
-
 
Line 1079... Line 1079...
1079
 
1079
    |ARITH.tSTRING:  res := program.stTypes.tSTRING
1080
    ASSERT(res # NIL)
1080
    END
Line 1124... Line 1124...
1124
        EnterProc(unit, "INF",    idSYSFUNC, sysINF);
1124
        EnterProc(unit, "INF",    idSYSFUNC, sysINF);
1125
        EnterProc(unit, "PUT32",  idSYSPROC, sysPUT32);
1125
        EnterProc(unit, "PUT32",  idSYSPROC, sysPUT32);
1126
        EnterProc(unit, "PUT16",  idSYSPROC, sysPUT16);
1126
        EnterProc(unit, "PUT16",  idSYSPROC, sysPUT16);
1127
        EnterProc(unit, "COPY",   idSYSPROC, sysCOPY);
1127
        EnterProc(unit, "COPY",   idSYSPROC, sysCOPY);
Line 1128... Line -...
1128
 
-
 
1129
        ident := addIdent(unit, SCAN.enterid("CARD16"), idTYPE);
-
 
1130
        ident.type := program.stTypes.tCARD16;
-
 
1131
        ident.export := TRUE;
-
 
1132
 
1128
 
1133
        ident := addIdent(unit, SCAN.enterid("CARD32"), idTYPE);
1129
        ident := addIdent(unit, SCAN.enterid("CARD32"), idTYPE);
1134
        ident.type := program.stTypes.tCARD32;
1130
        ident.type := program.stTypes.tCARD32;
1135
        ident.export := TRUE
1131
        ident.export := TRUE
Line 1246... Line 1242...
1246
    program.stTypes.tBOOLEAN := enterType(program, tBOOLEAN,                    1, 0, NIL);
1242
    program.stTypes.tBOOLEAN := enterType(program, tBOOLEAN,                    1, 0, NIL);
Line 1247... Line 1243...
1247
 
1243
 
1248
    IF target # mConst.Target_iMSP430 THEN
1244
    IF target # mConst.Target_iMSP430 THEN
1249
        program.stTypes.tWCHAR   := enterType(program, tWCHAR,  2, 0, NIL);
1245
        program.stTypes.tWCHAR   := enterType(program, tWCHAR,  2, 0, NIL);
1250
        program.stTypes.tREAL    := enterType(program, tREAL,   8, 0, NIL);
-
 
1251
        program.stTypes.tCARD16  := enterType(program, tCARD16, 2, 0, NIL);
1246
        program.stTypes.tREAL    := enterType(program, tREAL,   8, 0, NIL);
1252
        program.stTypes.tCARD32  := enterType(program, tCARD32, 4, 0, NIL)
1247
        program.stTypes.tCARD32  := enterType(program, tCARD32, 4, 0, NIL)
Line 1253... Line 1248...
1253
    END;
1248
    END;
1254
 
1249
 
Line 1265... Line 1260...
1265
    program.stTypes.tBOOLEAN.align := program.stTypes.tBOOLEAN.size;
1260
    program.stTypes.tBOOLEAN.align := program.stTypes.tBOOLEAN.size;
Line 1266... Line 1261...
1266
 
1261
 
1267
    IF target # mConst.Target_iMSP430 THEN
1262
    IF target # mConst.Target_iMSP430 THEN
1268
        program.stTypes.tWCHAR.align   := program.stTypes.tWCHAR.size;
1263
        program.stTypes.tWCHAR.align   := program.stTypes.tWCHAR.size;
1269
        program.stTypes.tREAL.align    := program.stTypes.tREAL.size;
-
 
1270
        program.stTypes.tCARD16.align  := program.stTypes.tCARD16.size;
1264
        program.stTypes.tREAL.align    := program.stTypes.tREAL.size;
1271
        program.stTypes.tCARD32.align  := program.stTypes.tCARD32.size
1265
        program.stTypes.tCARD32.align  := program.stTypes.tCARD32.size
Line 1272... Line 1266...
1272
    END;
1266
    END;
1273
 
1267