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 |