mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
мелкие правки
улучшена обработка пути главного модуля
-lower: допускается нижний регистр в числовых литералах ("1.37e14", "0abcdh", "0ffx")
RVMxI: исправлена ошибка, порт на Linux
This commit is contained in:
1 parent
6fb87a797f
commit
bb8f633206
12 files changed
+61
-51
No files matched your search
Binary file not shown.
+10
-1
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2020, Anton Krotov
|
||||
Copyright (c) 2020-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -12,9 +12,18 @@ IMPORT SYSTEM, Trap;
|
||||
|
||||
CONST
|
||||
|
||||
$IF (host_linux)
|
||||
|
||||
slash* = "/";
|
||||
eol* = 0AX;
|
||||
|
||||
$ELSE
|
||||
|
||||
slash* = "\";
|
||||
eol* = 0DX + 0AX;
|
||||
|
||||
$END
|
||||
|
||||
bit_depth* = 32;
|
||||
maxint* = 7FFFFFFFH;
|
||||
minint* = 80000000H;
|
||||
|
||||
@@ -12,9 +12,18 @@ IMPORT SYSTEM, Trap;
|
||||
|
||||
CONST
|
||||
|
||||
$IF (host_linux)
|
||||
|
||||
slash* = "/";
|
||||
eol* = 0AX;
|
||||
|
||||
$ELSE
|
||||
|
||||
slash* = "\";
|
||||
eol* = 0DX + 0AX;
|
||||
|
||||
$END
|
||||
|
||||
bit_depth* = 64;
|
||||
maxint* = ROR(-2, 1);
|
||||
minint* = ROR(1, 1);
|
||||
|
||||
+13
-6
@@ -158,7 +158,7 @@ BEGIN
|
||||
|
||||
n := -1;
|
||||
i := 0;
|
||||
WHILE (s[i] # "H") & (s[i] # "X") & (error = 0) DO
|
||||
WHILE (s[i] # "H") & (s[i] # "X") & (s[i] # "h") & (s[i] # "x") & (error = 0) DO
|
||||
|
||||
d := digit[ORD(s[i])];
|
||||
IF (n = -1) & (d # 0) THEN
|
||||
@@ -176,13 +176,13 @@ BEGIN
|
||||
|
||||
value := UTILS.Long(value);
|
||||
|
||||
IF (s[i] = "X") & (n # -1) & (i - n > 4) THEN
|
||||
IF ((s[i] = "X") OR (s[i] = "x")) & (n # -1) & (i - n > 4) THEN
|
||||
error := 3
|
||||
END;
|
||||
|
||||
IF error = 0 THEN
|
||||
v.int := value;
|
||||
IF s[i] = "X" THEN
|
||||
IF (s[i] = "X") OR (s[i] = "x") THEN
|
||||
v.typ := tCHAR;
|
||||
IF ~check(v) THEN
|
||||
v.typ := tWCHAR;
|
||||
@@ -217,6 +217,7 @@ END opFloat2;
|
||||
PROCEDURE fconv* (s: ARRAY OF CHAR; VAR v: VALUE; VAR error: INTEGER);
|
||||
VAR
|
||||
value: REAL;
|
||||
frac: REAL;
|
||||
exp10: REAL;
|
||||
i, n, d: INTEGER;
|
||||
minus: BOOLEAN;
|
||||
@@ -224,7 +225,8 @@ VAR
|
||||
BEGIN
|
||||
error := 0;
|
||||
value := 0.0;
|
||||
exp10 := 10.0;
|
||||
frac := 0.0;
|
||||
exp10 := 1.0;
|
||||
minus := FALSE;
|
||||
n := 0;
|
||||
|
||||
@@ -240,14 +242,19 @@ BEGIN
|
||||
INC(i);
|
||||
|
||||
WHILE (error = 0) & STRINGS.digit(s[i]) DO
|
||||
IF opFloat2(value, FLT(digit[ORD(s[i])]) / exp10, "+") & opFloat2(exp10, 10.0, "*") THEN
|
||||
IF opFloat2(frac, 10.0, "*") & opFloat2(frac, FLT(digit[ORD(s[i])]), "+") THEN
|
||||
exp10 := exp10 * 10.0;
|
||||
INC(i)
|
||||
ELSE
|
||||
error := 4
|
||||
END
|
||||
END;
|
||||
|
||||
IF s[i] = "E" THEN
|
||||
IF ~opFloat2(value, frac / exp10, "+") THEN
|
||||
error := 4
|
||||
END;
|
||||
|
||||
IF (s[i] = "E") OR (s[i] = "e") THEN
|
||||
INC(i)
|
||||
END;
|
||||
|
||||
|
||||
+1
-11
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2020, Anton Krotov
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -33,16 +33,6 @@ BEGIN
|
||||
END Int;
|
||||
|
||||
|
||||
PROCEDURE Hex* (x, n: INTEGER);
|
||||
VAR
|
||||
s: ARRAY 24 OF CHAR;
|
||||
|
||||
BEGIN
|
||||
STRINGS.IntToHex(x, s, n);
|
||||
String(s)
|
||||
END Hex;
|
||||
|
||||
|
||||
PROCEDURE Int2* (x: INTEGER);
|
||||
BEGIN
|
||||
IF x < 10 THEN
|
||||
|
||||
@@ -198,6 +198,8 @@ BEGIN
|
||||
lib_path := path;
|
||||
|
||||
UTILS.GetArg(1, inname);
|
||||
STRINGS.replace(inname, "\", UTILS.slash);
|
||||
STRINGS.replace(inname, "/", UTILS.slash);
|
||||
|
||||
C.Ln;
|
||||
C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor);
|
||||
|
||||
+5
-3
@@ -1,7 +1,7 @@
|
||||
(*
|
||||
BSD 2-Clause License
|
||||
|
||||
Copyright (c) 2018-2020, Anton Krotov
|
||||
Copyright (c) 2018-2021, Anton Krotov
|
||||
All rights reserved.
|
||||
*)
|
||||
|
||||
@@ -66,8 +66,10 @@ BEGIN
|
||||
|
||||
error := FALSE;
|
||||
j := 0;
|
||||
IF (relative[0] = ".") & (relative[1] = slash) THEN
|
||||
j := 2
|
||||
WHILE (relative[j] = ".") & (relative[j + 1] = slash) DO
|
||||
INC(j, 2)
|
||||
ELSIF relative[j] = slash DO
|
||||
INC(j)
|
||||
END;
|
||||
|
||||
WHILE ~error & (relative[j] # 0X) DO
|
||||
|
||||
+5
-4
@@ -243,18 +243,19 @@ BEGIN
|
||||
c := nextc(text)
|
||||
END;
|
||||
|
||||
WHILE S.hexdigit(c) DO
|
||||
WHILE S.hexdigit(c) OR LowerCase & ("a" <= c) & (c <= "f") DO
|
||||
S.cap(c);
|
||||
push(num, i, c);
|
||||
c := nextc(text);
|
||||
hex := TRUE
|
||||
END;
|
||||
|
||||
IF c = "H" THEN
|
||||
IF (c = "H") OR LowerCase & (c = "h") THEN
|
||||
push(num, i, c);
|
||||
TXT.next(text);
|
||||
sym := lxHEX
|
||||
|
||||
ELSIF c = "X" THEN
|
||||
ELSIF (c = "X") OR LowerCase & (c = "x") THEN
|
||||
push(num, i, c);
|
||||
TXT.next(text);
|
||||
sym := lxCHAR
|
||||
@@ -281,7 +282,7 @@ BEGIN
|
||||
c := nextc(text)
|
||||
END;
|
||||
|
||||
IF c = "E" THEN
|
||||
IF (c = "E") OR LowerCase & (c = "e") THEN
|
||||
|
||||
push(num, i, c);
|
||||
c := nextc(text);
|
||||
|
||||
+1
-12
@@ -73,17 +73,6 @@ BEGIN
|
||||
END IntToStr;
|
||||
|
||||
|
||||
PROCEDURE IntToHex* (x: INTEGER; VAR str: ARRAY OF CHAR; n: INTEGER);
|
||||
BEGIN
|
||||
str[n] := 0X;
|
||||
WHILE n > 0 DO
|
||||
str[n - 1] := CHR(UTILS.hexdgt(x MOD 16));
|
||||
x := x DIV 16;
|
||||
DEC(n)
|
||||
END
|
||||
END IntToHex;
|
||||
|
||||
|
||||
PROCEDURE search* (s: ARRAY OF CHAR; VAR pos: INTEGER; c: CHAR; forward: BOOLEAN);
|
||||
VAR
|
||||
length: INTEGER;
|
||||
@@ -171,7 +160,7 @@ PROCEDURE space* (c: CHAR): BOOLEAN;
|
||||
END space;
|
||||
|
||||
|
||||
PROCEDURE cap (VAR c: CHAR);
|
||||
PROCEDURE cap* (VAR c: CHAR);
|
||||
BEGIN
|
||||
IF ("a" <= c) & (c <= "z") THEN
|
||||
c := CHR(ORD(c) - 32)
|
||||
|
||||
+3
-4
@@ -8,8 +8,6 @@
|
||||
(*
|
||||
RVMxI executor and disassembler
|
||||
|
||||
for Windows only
|
||||
|
||||
Usage:
|
||||
RVMxI.exe <program file> -run [program parameters]
|
||||
RVMxI.exe <program file> -dis <output file>
|
||||
@@ -83,7 +81,7 @@ VAR
|
||||
|
||||
PROCEDURE syscall (ptr: INTEGER);
|
||||
VAR
|
||||
fn, r: INTEGER;
|
||||
fn, r, n: INTEGER;
|
||||
|
||||
proc2: PROCEDURE (a, b: INTEGER): INTEGER;
|
||||
proc3: PROCEDURE (a, b, c: INTEGER): INTEGER;
|
||||
@@ -120,8 +118,9 @@ BEGIN
|
||||
r := proc2(GetInt(ptr, 1), GetInt(ptr, 2))
|
||||
|
||||
| 2:
|
||||
n := GetInt(ptr, 1);
|
||||
SYSTEM.PUT(SYSTEM.ADR(proc3), SYSTEM.ADR(HOST.GetArg));
|
||||
r := proc3(GetInt(ptr, 1) + 2, GetInt(ptr, 2), GetInt(ptr, 3))
|
||||
r := proc3(n - ORD(n = 0) + 2, GetInt(ptr, 2), GetInt(ptr, 3))
|
||||
|
||||
| 3:
|
||||
SYSTEM.PUT(SYSTEM.ADR(proc4), SYSTEM.ADR(HOST.FileRead));
|
||||
|
||||
+12
-10
@@ -4,31 +4,33 @@
|
||||
|
||||
Использование
|
||||
|
||||
Скомпилировать исполнитель/дизассемблер в \tools\RVMxI.ob07 (для Windows32/64 Console):
|
||||
Скомпилировать исполнитель/дизассемблер в .\tools\RVMxI.ob07
|
||||
для Windows32/64 Console или Linux32/64:
|
||||
|
||||
Compiler.exe .\tools\RVMxI.ob07 win32con -nochk a -out RVM32I.exe
|
||||
Compiler.exe .\tools\RVMxI.ob07 win64con -nochk a -out RVM64I.exe
|
||||
Compiler.exe .\tools\RVMxI.ob07 win32con -nochk a -out RVMxI.exe
|
||||
Compiler.exe .\tools\RVMxI.ob07 win64con -nochk a -out RVMxI.exe
|
||||
Compiler ./tools/RVMxI.ob07 linux32exe -nochk a -out RVMxI
|
||||
Compiler ./tools/RVMxI.ob07 linux64exe -nochk a -out RVMxI
|
||||
|
||||
Будет создан файл "RVM32I.exe" и/или "RVM64I.exe".
|
||||
Будет создан файл "RVMxI.exe" и/или "RVMxI".
|
||||
|
||||
Компилировать программу в байт-код RVMxI:
|
||||
|
||||
Compiler.exe program.ob07 rvm32i [-ram size]
|
||||
Compiler.exe program.ob07 rvm64i [-ram size]
|
||||
Compiler.exe program.ob07 rvm32i [-ram size] [-def host_linux]
|
||||
Compiler.exe program.ob07 rvm64i [-ram size] [-def host_linux]
|
||||
-ram size -- установить размер оперативной памяти для программы в килобайтах 32768..262144
|
||||
(32..256 Мбайт), по умолчанию 32768 (32 Мбайт)
|
||||
-def host_linux -- если байт-код будет исполняться на Linux (по умолчанию -- Windows)
|
||||
|
||||
Будет создан файл "program.bin".
|
||||
|
||||
Выпонить программу:
|
||||
|
||||
RVM32I.exe program.bin -run
|
||||
RVM64I.exe program.bin -run
|
||||
RVMxI.exe program.bin -run <параметры>
|
||||
|
||||
Дизассемблировать программу:
|
||||
|
||||
RVM32I.exe program.bin -dis program.txt
|
||||
RVM64I.exe program.bin -dis program.txt
|
||||
RVMxI.exe program.bin -dis program.txt
|
||||
|
||||
Будет создан файл "program.txt".
|
||||
---------------------------------------------------------------------------------------------------
|
||||
|
||||
Reference in new issue
Block a user