mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
v1.44
импорт модулей с указанием пути: IMPORT mod IN "./lib/mod.ob07";
This commit is contained in:
1 parent
af99c55423
commit
fb12e18a2f
10 files changed
+110
-21
No files matched your search
Binary file not shown.
+7
-1
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2019, Anton Krotov
|
||||
Copyright (c) 2018-2020, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -79,4 +79,10 @@ BEGIN
|
||||
END Int2Ln;
|
||||
|
||||
|
||||
PROCEDURE Dashes*;
|
||||
BEGIN
|
||||
StringLn("------------------------------------------------")
|
||||
END Dashes;
|
||||
|
||||
|
||||
END CONSOLE.
|
||||
@@ -190,7 +190,7 @@ BEGIN
|
||||
|
||||
C.Ln;
|
||||
C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
|
||||
C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)");
|
||||
C.String(" ("); C.Int(UTILS.bit_depth); C.String("-bit) "); C.StringLn("2020-12-02");
|
||||
C.StringLn("Copyright (c) 2018-2020, Anton Krotov");
|
||||
|
||||
IF inname = "" THEN
|
||||
@@ -227,7 +227,7 @@ BEGIN
|
||||
UTILS.Exit(0)
|
||||
END;
|
||||
|
||||
C.StringLn("--------------------------------------------");
|
||||
C.Dashes;
|
||||
PATHS.split(inname, path, modname, ext);
|
||||
|
||||
IF ext # UTILS.FILE_EXT THEN
|
||||
@@ -288,7 +288,7 @@ BEGIN
|
||||
ST.compile(path, lib_path, modname, outname, target, options);
|
||||
|
||||
time := UTILS.GetTickCount() - UTILS.time;
|
||||
C.StringLn("--------------------------------------------");
|
||||
C.Dashes;
|
||||
C.Int(PARS.lines); C.String(" lines, ");
|
||||
C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, ");
|
||||
C.Int(WRITER.counter); C.StringLn(" bytes");
|
||||
|
||||
+1
-1
@@ -1729,7 +1729,7 @@ BEGIN
|
||||
INC(TextSize, IntVectorSize + TypesSize);
|
||||
INC(Bss.size, minStackSize + RTL.VarSize);
|
||||
|
||||
C.StringLn("--------------------------------------------");
|
||||
C.Dashes;
|
||||
C.String( " rom: "); C.Int(TextSize); C.String(" of "); C.Int(rom); C.String(" ("); C.Int(TextSize * 100 DIV rom); C.StringLn("%)");
|
||||
IF Free.size > 0 THEN
|
||||
C.String( " "); C.Int(Free.size); C.String(" bytes free (0");
|
||||
|
||||
+51
-7
@@ -198,10 +198,11 @@ END ExpectSym;
|
||||
|
||||
PROCEDURE ImportList (parser: PARSER);
|
||||
VAR
|
||||
fname, path, ext, _name: PATH;
|
||||
name: SCAN.IDENT;
|
||||
parser2: PARSER;
|
||||
pos: POSITION;
|
||||
alias: BOOLEAN;
|
||||
alias, _in: BOOLEAN;
|
||||
unit: PROG.UNIT;
|
||||
ident: PROG.IDENT;
|
||||
|
||||
@@ -222,22 +223,64 @@ BEGIN
|
||||
|
||||
Next(parser);
|
||||
|
||||
path := parser.path;
|
||||
fname := "";
|
||||
COPY(name.s, _name);
|
||||
_in := FALSE;
|
||||
|
||||
IF parser.sym = SCAN.lxIN THEN
|
||||
_in := TRUE;
|
||||
Next(parser);
|
||||
IF parser.sym = SCAN.lxSTRING THEN
|
||||
STRINGS.trim(parser.lex.s, fname);
|
||||
STRINGS.replace(fname, "/", UTILS.slash);
|
||||
STRINGS.replace(fname, "\", UTILS.slash);
|
||||
PATHS.split(fname, path, _name, ext);
|
||||
IF PATHS.isRelative(path) THEN
|
||||
PATHS.RelPath(parser.path, path, fname);
|
||||
STRINGS.append(fname, _name);
|
||||
STRINGS.append(fname, ext);
|
||||
PATHS.split(fname, path, _name, ext)
|
||||
END;
|
||||
Next(parser)
|
||||
ELSE
|
||||
check1(FALSE, parser, 117)
|
||||
END
|
||||
END;
|
||||
|
||||
IF (parser.sym = SCAN.lxCOMMA) OR (parser.sym = SCAN.lxSEMI) THEN
|
||||
alias := FALSE;
|
||||
unit := PROG.getUnit(name);
|
||||
IF (fname = "") & ((_name = "SYSTEM") OR PROG.LowerCase & (_name = "system")) THEN
|
||||
unit := PROG.program.sysunit
|
||||
ELSE
|
||||
IF fname # "" THEN
|
||||
unit := PROG.getUnit(fname)
|
||||
ELSE
|
||||
fname := path;
|
||||
STRINGS.append(fname, _name);
|
||||
STRINGS.append(fname, UTILS.FILE_EXT);
|
||||
unit := PROG.getUnit(fname);
|
||||
IF unit = NIL THEN
|
||||
fname := parser.lib_path;
|
||||
STRINGS.append(fname, _name);
|
||||
STRINGS.append(fname, UTILS.FILE_EXT);
|
||||
unit := PROG.getUnit(fname)
|
||||
END
|
||||
END
|
||||
END;
|
||||
|
||||
IF unit # NIL THEN
|
||||
check(unit.closed, pos, 31)
|
||||
ELSE
|
||||
parser2 := parser.create(parser.path, parser.lib_path,
|
||||
parser2 := parser.create(path, parser.lib_path,
|
||||
parser.StatSeq, parser.expression, parser.designator, parser.chkreturn);
|
||||
|
||||
IF ~parser2.open(parser2, name.s) THEN
|
||||
IF parser.path # parser.lib_path THEN
|
||||
IF ~parser2.open(parser2, _name) THEN
|
||||
IF (path # parser.lib_path) & ~_in THEN
|
||||
destroy(parser2);
|
||||
parser2 := parser.create(parser.lib_path, parser.lib_path,
|
||||
parser.StatSeq, parser.expression, parser.designator, parser.chkreturn);
|
||||
check(parser2.open(parser2, name.s), pos, 29)
|
||||
check(parser2.open(parser2, _name), pos, 29)
|
||||
ELSE
|
||||
error(pos, 29)
|
||||
END
|
||||
@@ -245,6 +288,7 @@ BEGIN
|
||||
|
||||
parser2.parse(parser2);
|
||||
unit := parser2.unit;
|
||||
unit.fname := parser2.fname;
|
||||
destroy(parser2)
|
||||
END;
|
||||
IF unit = PROG.program.sysunit THEN
|
||||
@@ -1189,7 +1233,7 @@ BEGIN
|
||||
END;
|
||||
|
||||
unit := PROG.newUnit(parser.lex.ident);
|
||||
|
||||
unit.fname := parser.fname;
|
||||
parser.unit := unit;
|
||||
|
||||
ExpectSym(parser, SCAN.lxSEMI);
|
||||
|
||||
+7
-7
@@ -7,7 +7,7 @@
|
||||
|
||||
MODULE PROG;
|
||||
|
||||
IMPORT SCAN, LISTS, ARITH, ERRORS, C := COLLECTIONS, IL, UTILS, TARGETS, STRINGS;
|
||||
IMPORT SCAN, LISTS, ARITH, ERRORS, C := COLLECTIONS, IL, UTILS, TARGETS, STRINGS, PATHS;
|
||||
|
||||
|
||||
CONST
|
||||
@@ -115,6 +115,7 @@ TYPE
|
||||
|
||||
rUNIT = RECORD (LISTS.ITEM)
|
||||
|
||||
fname*: PATHS.PATH;
|
||||
name*: SCAN.IDENT;
|
||||
idents*: LISTS.LIST;
|
||||
frwPointers: LISTS.LIST;
|
||||
@@ -214,7 +215,7 @@ TYPE
|
||||
|
||||
VAR
|
||||
|
||||
LowerCase: BOOLEAN;
|
||||
LowerCase*: BOOLEAN;
|
||||
idents: C.COLLECTION;
|
||||
program*: PROGRAM;
|
||||
|
||||
@@ -626,20 +627,18 @@ PROCEDURE arrcomp* (src, dst: _TYPE): BOOLEAN;
|
||||
END arrcomp;
|
||||
|
||||
|
||||
PROCEDURE getUnit* (name: SCAN.IDENT): UNIT;
|
||||
PROCEDURE getUnit* (name: PATHS.PATH): UNIT;
|
||||
VAR
|
||||
item: UNIT;
|
||||
|
||||
BEGIN
|
||||
ASSERT(name # NIL);
|
||||
|
||||
item := program.units.first(UNIT);
|
||||
|
||||
WHILE (item # NIL) & (item.name # name) DO
|
||||
WHILE (item # NIL) & (item.fname # name) DO
|
||||
item := item.next(UNIT)
|
||||
END;
|
||||
|
||||
IF (item = NIL) & ((name.s = "SYSTEM") OR LowerCase & (name.s = "system")) THEN
|
||||
IF (item = NIL) & ((name = "SYSTEM") OR LowerCase & (name = "system")) THEN
|
||||
item := program.sysunit
|
||||
END
|
||||
|
||||
@@ -1126,6 +1125,7 @@ VAR
|
||||
|
||||
BEGIN
|
||||
unit := newUnit(SCAN.enterid("$SYSTEM"));
|
||||
unit.fname := "SYSTEM";
|
||||
|
||||
EnterProc(unit, "adr", idSYSFUNC, sysADR);
|
||||
EnterProc(unit, "size", idSYSFUNC, sysSIZE);
|
||||
|
||||
@@ -110,6 +110,45 @@ BEGIN
|
||||
END search;
|
||||
|
||||
|
||||
PROCEDURE replace* (VAR s: ARRAY OF CHAR; find, repl: CHAR);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
i := 0;
|
||||
WHILE s[i] # 0X DO
|
||||
IF s[i] = find THEN
|
||||
s[i] := repl
|
||||
END;
|
||||
INC(i)
|
||||
END
|
||||
END replace;
|
||||
|
||||
|
||||
PROCEDURE trim* (source: ARRAY OF CHAR; VAR result: ARRAY OF CHAR);
|
||||
VAR
|
||||
LenS, start, _end, i, j: INTEGER;
|
||||
|
||||
BEGIN
|
||||
LenS := LENGTH(source);
|
||||
IF LenS > 0 THEN
|
||||
WHILE source[start] <= 20X DO
|
||||
INC(start)
|
||||
END;
|
||||
_end := LenS - 1;
|
||||
WHILE source[_end] <= 20X DO
|
||||
DEC(_end)
|
||||
END;
|
||||
|
||||
FOR i := start TO _end DO
|
||||
result[j] := source[i];
|
||||
INC(j)
|
||||
END;
|
||||
result[j] := 0X
|
||||
END
|
||||
END trim;
|
||||
|
||||
|
||||
PROCEDURE letter* (c: CHAR): BOOLEAN;
|
||||
RETURN ("a" <= c) & (c <= "z") OR ("A" <= c) & (c <= "Z") OR (c = "_")
|
||||
END letter;
|
||||
|
||||
+1
-1
@@ -2381,7 +2381,7 @@ BEGIN
|
||||
|
||||
WR.Close;
|
||||
|
||||
C.StringLn("--------------------------------------------");
|
||||
C.Dashes;
|
||||
C.String( " rom: "); C.Int(CodeSize); C.String(" of "); C.Int(rom); C.String(" ("); C.Int(CodeSize * 100 DIV rom); C.StringLn("%)");
|
||||
C.Ln;
|
||||
C.String( " ram: "); C.Int(DataSize); C.String(" of "); C.Int(ram); C.String(" ("); C.Int(DataSize * 100 DIV ram); C.StringLn("%)")
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ CONST
|
||||
max32* = 2147483647;
|
||||
|
||||
vMajor* = 1;
|
||||
vMinor* = 43;
|
||||
vMinor* = 44;
|
||||
|
||||
FILE_EXT* = ".ob07";
|
||||
RTL_NAME* = "RTL";
|
||||
|
||||
Reference in new issue
Block a user