Subversion Repositories Kolibri OS

Rev

Rev 8097 | Rev 9579 | Go to most recent revision | 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
 
8
MODULE PARS;
8
MODULE PARS;
Line 9... Line 9...
9
 
9
 
Line 10... Line 10...
10
IMPORT PROG, SCAN, ARITH, STRINGS, ERRORS, LISTS, IL, CONSOLE, PATHS, UTILS,
10
IMPORT PROG, SCAN, ARITH, STRINGS, ERRORS, LISTS, IL, CONSOLE, PATHS, UTILS,
Line 58... Line 58...
58
        sym*:        INTEGER;
58
        sym*:        INTEGER;
59
        unit*:       PROG.UNIT;
59
        unit*:       PROG.UNIT;
60
        constexp*:   BOOLEAN;
60
        constexp*:   BOOLEAN;
61
        main*:       BOOLEAN;
61
        main*:       BOOLEAN;
Line 62... Line 62...
62
 
62
 
63
        open*:       PROCEDURE (parser: PARSER; modname: ARRAY OF CHAR): BOOLEAN;
63
        open*:       PROCEDURE (parser: PARSER; modname, FileExt: ARRAY OF CHAR): BOOLEAN;
64
        parse*:      PROCEDURE (parser: PARSER);
64
        parse*:      PROCEDURE (parser: PARSER);
65
        StatSeq*:    STATPROC;
65
        StatSeq*:    STATPROC;
66
        expression*: EXPRPROC;
66
        expression*: EXPRPROC;
67
        designator*: EXPRPROC;
67
        designator*: EXPRPROC;
Line 196... Line 196...
196
END ExpectSym;
196
END ExpectSym;
Line 197... Line 197...
197
 
197
 
198
 
198
 
-
 
199
PROCEDURE ImportList (parser: PARSER);
199
PROCEDURE ImportList (parser: PARSER);
200
VAR
200
VAR
201
    fname, path, ext, _name: PATH;
201
    name:    SCAN.IDENT;
202
    name:    SCAN.IDENT;
202
    parser2: PARSER;
203
    parser2: PARSER;
203
    pos:     POSITION;
204
    pos:     POSITION;
204
    alias:   BOOLEAN;
205
    alias, _in: BOOLEAN;
Line 205... Line 206...
205
    unit:    PROG.UNIT;
206
    unit:    PROG.UNIT;
206
    ident:   PROG.IDENT;
207
    ident:   PROG.IDENT;
Line 220... Line 221...
220
            check(ident # NIL, pos, 30)
221
            check(ident # NIL, pos, 30)
221
        END;
222
        END;
Line 222... Line 223...
222
 
223
 
Line -... Line 224...
-
 
224
        Next(parser);
-
 
225
 
-
 
226
        path := parser.path;
-
 
227
        fname := "";
-
 
228
        ext := UTILS.FILE_EXT;
-
 
229
        COPY(name.s, _name);
-
 
230
        _in := FALSE;
-
 
231
 
-
 
232
        IF parser.sym = SCAN.lxIN THEN
-
 
233
            _in := TRUE;
-
 
234
            Next(parser);
-
 
235
            IF parser.sym = SCAN.lxSTRING THEN
-
 
236
                STRINGS.trim(parser.lex.string.s, fname)
-
 
237
            ELSIF parser.sym = SCAN.lxCHAR THEN
-
 
238
                fname[0] := CHR(ARITH.Int(parser.lex.value));
-
 
239
                fname[1] := 0X
-
 
240
            ELSE
-
 
241
                check1(FALSE, parser, 117)
-
 
242
            END;
-
 
243
            STRINGS.replace(fname, "/", UTILS.slash);
-
 
244
            STRINGS.replace(fname, "\", UTILS.slash);
-
 
245
            PATHS.DelSlashes(fname);
-
 
246
            PATHS.split(fname, path, _name, ext);
-
 
247
            IF PATHS.isRelative(path) THEN
-
 
248
                PATHS.RelPath(parser.path, path, fname);
-
 
249
                STRINGS.append(fname, _name);
-
 
250
                STRINGS.append(fname, ext);
-
 
251
                PATHS.split(fname, path, _name, ext)
-
 
252
            END;
-
 
253
            Next(parser)
223
        Next(parser);
254
        END;
224
 
255
 
-
 
256
        IF (parser.sym = SCAN.lxCOMMA) OR (parser.sym = SCAN.lxSEMI) THEN
-
 
257
            alias := FALSE;
-
 
258
            IF (fname = "") & ((_name = "SYSTEM") OR PROG.LowerCase & (_name = "system")) THEN
-
 
259
                unit := PROG.program.sysunit
-
 
260
            ELSE
-
 
261
                IF fname # "" THEN
-
 
262
                    unit := PROG.getUnit(fname)
-
 
263
                ELSE
-
 
264
                    fname := path;
225
        IF (parser.sym = SCAN.lxCOMMA) OR (parser.sym = SCAN.lxSEMI) THEN
265
                    STRINGS.append(fname, _name);
-
 
266
                    STRINGS.append(fname, UTILS.FILE_EXT);
-
 
267
                    unit := PROG.getUnit(fname);
-
 
268
                    IF unit = NIL THEN
-
 
269
                        fname := parser.lib_path;
-
 
270
                        STRINGS.append(fname, _name);
-
 
271
                        STRINGS.append(fname, UTILS.FILE_EXT);
-
 
272
                        unit := PROG.getUnit(fname)
-
 
273
                    END
Line 226... Line 274...
226
            alias := FALSE;
274
                END
227
            unit := PROG.getUnit(name);
275
            END;
228
 
276
 
229
            IF unit # NIL THEN
277
            IF unit # NIL THEN
230
                check(unit.closed, pos, 31)
278
                check(unit.closed, pos, 31)
Line 231... Line 279...
231
            ELSE
279
            ELSE
232
                parser2 := parser.create(parser.path, parser.lib_path,
280
                parser2 := parser.create(path, parser.lib_path,
233
                    parser.StatSeq, parser.expression, parser.designator, parser.chkreturn);
281
                    parser.StatSeq, parser.expression, parser.designator, parser.chkreturn);
234
 
282
 
235
                IF ~parser2.open(parser2, name.s) THEN
283
                IF ~parser2.open(parser2, _name, ext) THEN
236
                    IF parser.path # parser.lib_path THEN
284
                    IF (path # parser.lib_path) & ~_in THEN
237
                        destroy(parser2);
285
                        destroy(parser2);
238
                        parser2 := parser.create(parser.lib_path, parser.lib_path,
286
                        parser2 := parser.create(parser.lib_path, parser.lib_path,
239
                            parser.StatSeq, parser.expression, parser.designator, parser.chkreturn);
287
                            parser.StatSeq, parser.expression, parser.designator, parser.chkreturn);
240
                        check(parser2.open(parser2, name.s), pos, 29)
288
                        check(parser2.open(parser2, _name, ext), pos, 29)
Line 241... Line 289...
241
                    ELSE
289
                    ELSE
242
                        error(pos, 29)
290
                        error(pos, 29)
-
 
291
                    END
243
                    END
292
                END;
244
                END;
293
 
245
 
294
                parser2.parse(parser2);
246
                parser2.parse(parser2);
295
                unit := parser2.unit;
247
                unit := parser2.unit;
296
                unit.fname := parser2.fname;
Line 292... Line 341...
292
END QIdent;
341
END QIdent;
Line 293... Line 342...
293
 
342
 
294
 
343
 
295
PROCEDURE strcmp* (VAR v: ARITH.VALUE; v2: ARITH.VALUE; operator: INTEGER);
344
PROCEDURE strcmp* (VAR v: ARITH.VALUE; v2: ARITH.VALUE; operator: INTEGER);
296
VAR
345
VAR
297
    str: SCAN.LEXSTR;
346
    str: SCAN.TEXTSTR;
Line 298... Line 347...
298
    string1, string2: SCAN.IDENT;
347
    string1, string2: SCAN.STRING;
Line 299... Line 348...
299
    bool: BOOLEAN;
348
    bool: BOOLEAN;
300
 
349
 
301
BEGIN
350
BEGIN
302
 
351
 
303
    IF v.typ = ARITH.tCHAR THEN
352
    IF v.typ = ARITH.tCHAR THEN
304
        ASSERT(v2.typ = ARITH.tSTRING);
353
        ASSERT(v2.typ = ARITH.tSTRING);
Line 305... Line 354...
305
        ARITH.charToStr(v, str);
354
        ARITH.charToStr(v, str);
306
        string1 := SCAN.enterid(str);
355
        string1 := SCAN.enterStr(str);
307
        string2 := v2.string(SCAN.IDENT)
356
        string2 := v2.string(SCAN.STRING)
308
    END;
357
    END;
309
 
358
 
310
    IF v2.typ = ARITH.tCHAR THEN
359
    IF v2.typ = ARITH.tCHAR THEN
Line 311... Line 360...
311
        ASSERT(v.typ = ARITH.tSTRING);
360
        ASSERT(v.typ = ARITH.tSTRING);
312
        ARITH.charToStr(v2, str);
361
        ARITH.charToStr(v2, str);
313
        string2 := SCAN.enterid(str);
362
        string2 := SCAN.enterStr(str);
314
        string1 := v.string(SCAN.IDENT)
363
        string1 := v.string(SCAN.STRING)
Line 315... Line 364...
315
    END;
364
    END;
316
 
365
 
317
    IF v.typ = v2.typ THEN
366
    IF v.typ = v2.typ THEN
Line 480... Line 529...
480
PROCEDURE sysflag (parser: PARSER; proc: BOOLEAN): INTEGER;
529
PROCEDURE sysflag (parser: PARSER; proc: BOOLEAN): INTEGER;
481
VAR
530
VAR
482
    res, sf: INTEGER;
531
    res, sf: INTEGER;
Line 483... Line 532...
483
 
532
 
-
 
533
BEGIN
484
BEGIN
534
    checklex(parser, SCAN.lxIDENT);
485
    IF parser.lex.s = "stdcall" THEN
535
    IF parser.lex.ident.s = "stdcall" THEN
486
        sf := PROG.sf_stdcall
536
        sf := PROG.sf_stdcall
487
    ELSIF parser.lex.s = "stdcall64" THEN
537
    ELSIF parser.lex.ident.s = "cdecl" THEN
488
        sf := PROG.sf_stdcall64
538
        sf := PROG.sf_cdecl
489
    ELSIF parser.lex.s = "ccall" THEN
539
    ELSIF parser.lex.ident.s = "ccall" THEN
490
        sf := PROG.sf_ccall
-
 
491
    ELSIF parser.lex.s = "ccall16" THEN
-
 
492
        sf := PROG.sf_ccall16
540
        sf := PROG.sf_ccall
493
    ELSIF parser.lex.s = "win64" THEN
541
    ELSIF parser.lex.ident.s = "win64" THEN
494
        sf := PROG.sf_win64
542
        sf := PROG.sf_win64
495
    ELSIF parser.lex.s = "systemv" THEN
543
    ELSIF parser.lex.ident.s = "systemv" THEN
496
        sf := PROG.sf_systemv
544
        sf := PROG.sf_systemv
497
    ELSIF parser.lex.s = "windows" THEN
545
    ELSIF parser.lex.ident.s = "windows" THEN
498
        sf := PROG.sf_windows
546
        sf := PROG.sf_windows
499
    ELSIF parser.lex.s = "linux" THEN
547
    ELSIF parser.lex.ident.s = "linux" THEN
500
        sf := PROG.sf_linux
548
        sf := PROG.sf_linux
501
    ELSIF parser.lex.s = "code" THEN
549
    ELSIF parser.lex.ident.s = "code" THEN
502
        sf := PROG.sf_code
550
        sf := PROG.sf_code
503
    ELSIF parser.lex.s = "oberon" THEN
551
    ELSIF parser.lex.ident.s = "oberon" THEN
504
        sf := PROG.sf_oberon
552
        sf := PROG.sf_oberon
505
    ELSIF parser.lex.s = "noalign" THEN
553
    ELSIF parser.lex.ident.s = "noalign" THEN
506
        sf := PROG.sf_noalign
554
        sf := PROG.sf_noalign
507
    ELSE
555
    ELSE
508
        check1(FALSE, parser, 124)
556
        check1(FALSE, parser, 124)
Line 517... Line 565...
517
    END;
565
    END;
Line 518... Line 566...
518
 
566
 
519
    CASE sf OF
567
    CASE sf OF
520
    |PROG.sf_stdcall:
568
    |PROG.sf_stdcall:
521
        res := PROG.stdcall
569
        res := PROG.stdcall
522
    |PROG.sf_stdcall64:
570
    |PROG.sf_cdecl:
523
        res := PROG.stdcall64
571
        res := PROG.cdecl
-
 
572
    |PROG.sf_ccall:
524
    |PROG.sf_ccall:
573
        IF TARGETS.OS IN {TARGETS.osWIN32, TARGETS.osLINUX32, TARGETS.osKOS} THEN
-
 
574
            res := PROG.ccall
525
        res := PROG.ccall
575
        ELSIF TARGETS.OS = TARGETS.osWIN64 THEN
-
 
576
            res := PROG.win64
526
    |PROG.sf_ccall16:
577
        ELSIF TARGETS.OS = TARGETS.osLINUX64 THEN
-
 
578
            res := PROG.systemv
527
        res := PROG.ccall16
579
        END
528
    |PROG.sf_win64:
580
    |PROG.sf_win64:
529
        res := PROG.win64
581
        res := PROG.win64
530
    |PROG.sf_systemv:
582
    |PROG.sf_systemv:
531
        res := PROG.systemv
583
        res := PROG.systemv
Line 543... Line 595...
543
        ELSIF TARGETS.OS = TARGETS.osWIN64 THEN
595
        ELSIF TARGETS.OS = TARGETS.osWIN64 THEN
544
            res := PROG.win64
596
            res := PROG.win64
545
        END
597
        END
546
    |PROG.sf_linux:
598
    |PROG.sf_linux:
547
        IF TARGETS.OS = TARGETS.osLINUX32 THEN
599
        IF TARGETS.OS = TARGETS.osLINUX32 THEN
548
            res := PROG.ccall16
600
            res := PROG.ccall
549
        ELSIF TARGETS.OS = TARGETS.osLINUX64 THEN
601
        ELSIF TARGETS.OS = TARGETS.osLINUX64 THEN
550
            res := PROG.systemv
602
            res := PROG.systemv
551
        END
603
        END
552
    |PROG.sf_noalign:
604
    |PROG.sf_noalign:
553
        res := PROG.noalign
605
        res := PROG.noalign
Line 558... Line 610...
558
 
610
 
559
 
611
 
560
PROCEDURE procflag (parser: PARSER; VAR _import: IL.IMPORT_PROC; isProc: BOOLEAN): INTEGER;
612
PROCEDURE procflag (parser: PARSER; VAR _import: IL.IMPORT_PROC; isProc: BOOLEAN): INTEGER;
561
VAR
613
VAR
562
    call: INTEGER;
614
    call: INTEGER;
Line 563... Line 615...
563
    dll, proc: SCAN.LEXSTR;
615
    dll, proc: SCAN.TEXTSTR;
564
    pos: POSITION;
616
    pos: POSITION;
565
 
617
 
566
 
618
 
Line 567... Line 619...
567
    PROCEDURE getStr (parser: PARSER; VAR name: SCAN.LEXSTR);
619
    PROCEDURE getStr (parser: PARSER; VAR name: SCAN.TEXTSTR);
568
    VAR
620
    VAR
569
        pos: POSITION;
621
        pos: POSITION;
570
        str: ARITH.VALUE;
622
        str: ARITH.VALUE;
571
 
623
 
572
    BEGIN
624
    BEGIN
573
        getpos(parser, pos);
625
        getpos(parser, pos);
574
        ConstExpression(parser, str);
626
        ConstExpression(parser, str);
575
        IF str.typ = ARITH.tSTRING THEN
627
        IF str.typ = ARITH.tSTRING THEN
576
            name := str.string(SCAN.IDENT).s
628
            name := str.string(SCAN.STRING).s
Line 612... Line 664...
612
        CASE TARGETS.BitDepth OF
664
        CASE TARGETS.BitDepth OF
613
        |16: call := PROG.default16
665
        |16: call := PROG.default16
614
        |32: IF TARGETS.CPU = TARGETS.cpuX86 THEN
666
        |32: IF TARGETS.CPU = TARGETS.cpuX86 THEN
615
                 call := PROG.default32
667
                 call := PROG.default32
616
             ELSE
668
             ELSE
617
                 call := PROG.ccall
669
                 call := PROG.cdecl
-
 
670
             END
-
 
671
        |64: IF TARGETS.CPU = TARGETS.cpuAMD64 THEN
-
 
672
                 call := PROG.default64
-
 
673
             ELSE
-
 
674
                 call := PROG.cdecl
618
             END
675
             END
619
        |64: call := PROG.default64
-
 
620
        END
676
        END
621
    END;
677
    END;
Line 622... Line 678...
622
 
678
 
623
    IF _import # NIL THEN
679
    IF _import # NIL THEN
Line 918... Line 974...
918
        call:       INTEGER;
974
        call:       INTEGER;
919
        t:          PROG._TYPE;
975
        t:          PROG._TYPE;
920
        _import:    IL.IMPORT_PROC;
976
        _import:    IL.IMPORT_PROC;
921
        endmod, b:  BOOLEAN;
977
        endmod, b:  BOOLEAN;
922
        fparams:    SET;
978
        fparams:    SET;
923
        variables:  LISTS.LIST;
-
 
924
        int, flt:   INTEGER;
979
        int, flt:   INTEGER;
925
        comma:      BOOLEAN;
980
        comma:      BOOLEAN;
926
        code, iv:   ARITH.VALUE;
981
        code, iv:   ARITH.VALUE;
927
        codeProc,
982
        codeProc,
928
        handler:    BOOLEAN;
983
        handler:    BOOLEAN;
-
 
984
        line:       INTEGER;
Line 929... Line 985...
929
 
985
 
930
    BEGIN
986
    BEGIN
931
        endmod := FALSE;
987
        endmod := FALSE;
Line 936... Line 992...
936
        call := procflag(parser, _import, TRUE);
992
        call := procflag(parser, _import, TRUE);
Line 937... Line 993...
937
 
993
 
938
        getpos(parser, pos);
994
        getpos(parser, pos);
939
        pos1 := pos;
995
        pos1 := pos;
-
 
996
        checklex(parser, SCAN.lxIDENT);
Line 940... Line 997...
940
        checklex(parser, SCAN.lxIDENT);
997
        line := pos.line;
941
 
998
 
942
        IF _import # NIL THEN
999
        IF _import # NIL THEN
943
            proc := IdentDef(parser, PROG.idIMP, name);
1000
            proc := IdentDef(parser, PROG.idIMP, name);
944
            proc._import := _import;
1001
            proc._import := _import;
945
            IF _import.name = "" THEN
1002
            IF _import.name = "" THEN
946
                _import.name := name.s
1003
                COPY(name.s, _import.name)
947
            END;
1004
            END;
948
            PROG.program.procs.last(PROG.PROC)._import := _import
1005
            PROG.program.procs.last(PROG.PROC)._import := _import
949
        ELSE
1006
        ELSE
Line 959... Line 1016...
959
 
1016
 
Line 960... Line 1017...
960
        FormalParameters(parser, t);
1017
        FormalParameters(parser, t);
961
 
1018
 
962
        IF parser.sym = SCAN.lxLSQUARE THEN
1019
        IF parser.sym = SCAN.lxLSQUARE THEN
963
            getpos(parser, pos2);
1020
            getpos(parser, pos2);
964
            check(TARGETS.target = TARGETS.STM32CM3, pos2, 24);
1021
            check((TARGETS.CPU = TARGETS.cpuTHUMB) & (TARGETS.OS = TARGETS.osNONE), pos2, 24);
965
            Next(parser);
1022
            Next(parser);
966
            getpos(parser, pos2);
1023
            getpos(parser, pos2);
967
            ConstExpression(parser, iv);
1024
            ConstExpression(parser, iv);
Line 1073... Line 1130...
1073
                checklex(parser, SCAN.lxEND)
1130
                checklex(parser, SCAN.lxEND)
1074
            ELSE
1131
            ELSE
1075
                proc.proc.leave := IL.LeaveC()
1132
                proc.proc.leave := IL.LeaveC()
1076
            END;
1133
            END;
Line 1077... Line 1134...
1077
 
1134
 
1078
            IF TARGETS.CPU = TARGETS.cpuMSP430 THEN
1135
            IF (TARGETS.CPU = TARGETS.cpuMSP430) & ~codeProc THEN
-
 
1136
                check(MSP430.CheckProcDataSize(enter.param2 + proc._type.parSize, PROG.program.options.ram), pos1, 63);
-
 
1137
                enter.param2 := enter.param2 * 65536 + line;
1079
                check((enter.param2 * ORD(~codeProc) + proc._type.parSize) * 2 + 16 < PROG.program.options.ram, pos1, 63)
1138
                enter.param3 := IL.codes.errlabels[10]
1080
            END
1139
            END
Line 1081... Line 1140...
1081
        END;
1140
        END;
1082
 
1141
 
1083
        IF parser.sym = SCAN.lxEND THEN
1142
        IF parser.sym = SCAN.lxEND THEN
1084
            Next(parser);
1143
            Next(parser);
1085
            IF parser.sym = SCAN.lxIDENT THEN
1144
            IF parser.sym = SCAN.lxIDENT THEN
1086
                getpos(parser, pos);
1145
                getpos(parser, pos);
1087
                endname := parser.lex.ident;
1146
                endname := parser.lex.ident;
1088
                IF ~codeProc & (_import = NIL) THEN
1147
                IF ~codeProc & (_import = NIL) THEN
1089
                    check(endname = name, pos, 60);
1148
                    check(PROG.IdEq(endname, name), pos, 60);
1090
                    ExpectSym(parser, SCAN.lxSEMI);
1149
                    ExpectSym(parser, SCAN.lxSEMI);
1091
                    Next(parser)
1150
                    Next(parser)
1092
                ELSE
1151
                ELSE
1093
                    IF endname = parser.unit.name THEN
1152
                    IF PROG.IdEq(endname, parser.unit.name) THEN
1094
                        ExpectSym(parser, SCAN.lxPOINT);
1153
                        ExpectSym(parser, SCAN.lxPOINT);
1095
                        Next(parser);
1154
                        Next(parser);
1096
                        endmod := TRUE
1155
                        endmod := TRUE
1097
                    ELSIF endname = name THEN
1156
                    ELSIF PROG.IdEq(endname, name) THEN
1098
                        ExpectSym(parser, SCAN.lxSEMI);
1157
                        ExpectSym(parser, SCAN.lxSEMI);
1099
                        Next(parser)
1158
                        Next(parser)
1100
                    ELSE
1159
                    ELSE
Line 1106... Line 1165...
1106
            ELSE
1165
            ELSE
1107
                checklex(parser, SCAN.lxIDENT)
1166
                checklex(parser, SCAN.lxIDENT)
1108
            END
1167
            END
1109
        END;
1168
        END;
Line 1110... Line -...
1110
 
-
 
1111
        IF ~codeProc & (_import = NIL) THEN
-
 
1112
            variables := LISTS.create(NIL);
-
 
1113
        ELSE
-
 
1114
            variables := NIL
-
 
1115
        END;
-
 
1116
 
1169
 
1117
        PROG.closeScope(unit, variables);
-
 
1118
 
-
 
1119
        IF ~codeProc & (_import = NIL) THEN
-
 
1120
            enter.variables := variables
-
 
Line 1121... Line 1170...
1121
        END
1170
        PROG.closeScope(unit);
1122
 
1171
 
Line 1183... Line 1232...
1183
 
1232
 
1184
    ExpectSym(parser, SCAN.lxMODULE);
1233
    ExpectSym(parser, SCAN.lxMODULE);
Line 1185... Line 1234...
1185
    ExpectSym(parser, SCAN.lxIDENT);
1234
    ExpectSym(parser, SCAN.lxIDENT);
1186
 
1235
 
1187
    IF ~parser.main THEN
1236
    IF ~parser.main THEN
Line 1188... Line 1237...
1188
        check1(parser.lex.s = parser.modname, parser, 23)
1237
        check1(parser.lex.ident.s = parser.modname, parser, 23)
1189
    END;
-
 
-
 
1238
    END;
1190
 
1239
 
Line 1191... Line 1240...
1191
    unit := PROG.newUnit(parser.lex.ident);
1240
    unit := PROG.newUnit(parser.lex.ident);
Line 1192... Line 1241...
1192
 
1241
    unit.fname := parser.fname;
Line 1212... Line 1261...
1212
    IF TARGETS.CPU IN {TARGETS.cpuX86, TARGETS.cpuAMD64} THEN
1261
    IF TARGETS.CPU IN {TARGETS.cpuX86, TARGETS.cpuAMD64} THEN
1213
        IL.fname(parser.fname)
1262
        IL.fname(parser.fname)
1214
    END;
1263
    END;
Line 1215... Line 1264...
1215
 
1264
 
1216
    label := IL.NewLabel();
1265
    label := IL.NewLabel();
Line 1217... Line 1266...
1217
    IL.AddJmpCmd(IL.opJMP, label);
1266
    IL.Jmp(IL.opJMP, label);
Line 1218... Line 1267...
1218
 
1267
 
1219
    name := IL.putstr(unit.name.s);
1268
    name := IL.putstr(unit.name.s);
Line 1226... Line 1275...
1226
    IL.AddCmd0(IL.opERR);
1275
    IL.AddCmd0(IL.opERR);
Line 1227... Line 1276...
1227
 
1276
 
1228
    FOR errno := 1 TO LEN(IL.codes.errlabels) - 1 DO
1277
    FOR errno := 1 TO LEN(IL.codes.errlabels) - 1 DO
1229
        IL.SetErrLabel(errno);
1278
        IL.SetErrLabel(errno);
1230
        IL.AddCmd(IL.opPUSHC, errno);
1279
        IL.AddCmd(IL.opPUSHC, errno);
1231
        IL.AddJmpCmd(IL.opJMP, errlabel)
1280
        IL.Jmp(IL.opJMP, errlabel)
Line 1232... Line 1281...
1232
    END;
1281
    END;
Line 1233... Line 1282...
1233
 
1282
 
Line 1243... Line 1292...
1243
        END;
1292
        END;
Line 1244... Line 1293...
1244
 
1293
 
Line 1245... Line 1294...
1245
        checklex(parser, SCAN.lxEND);
1294
        checklex(parser, SCAN.lxEND);
1246
 
1295
 
1247
        ExpectSym(parser, SCAN.lxIDENT);
1296
        ExpectSym(parser, SCAN.lxIDENT);
1248
        check1(parser.lex.s = unit.name.s, parser, 25);
1297
        check1(parser.lex.ident.s = unit.name.s, parser, 25);
Line 1249... Line 1298...
1249
        ExpectSym(parser, SCAN.lxPOINT)
1298
        ExpectSym(parser, SCAN.lxPOINT)
1250
    END;
1299
    END;
1251
 
1300
 
Line 1252... Line 1301...
1252
    INC(lines, parser.lex.pos.line);
1301
    INC(lines, parser.lex.pos.line);
1253
    PROG.closeUnit(unit)
1302
    PROG.closeUnit(unit)
1254
END parse;
1303
END parse;
Line 1255... Line 1304...
1255
 
1304
 
1256
 
1305
 
1257
PROCEDURE open (parser: PARSER; modname: ARRAY OF CHAR): BOOLEAN;
1306
PROCEDURE open (parser: PARSER; modname, FileExt: ARRAY OF CHAR): BOOLEAN;
Line 1258... Line 1307...
1258
BEGIN
1307
BEGIN
Line 1259... Line 1308...
1259
    ASSERT(parser # NIL);
1308
    ASSERT(parser # NIL);