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