mirror of
https://github.com/AntKrotov/oberon-07-compiler.git
synced 2026-10-05 09:45:47 +00:00
условная компиляция: $ELSIF, обновление документации
This commit is contained in:
1 parent
96fb19fa3e
commit
68fd463de7
11 files changed
+89
-39
No files matched your search
Binary file not shown.
+36
@@ -0,0 +1,36 @@
|
||||
Условная компиляция
|
||||
|
||||
синтаксис:
|
||||
|
||||
$IF "(" ident {"|" ident} ")"
|
||||
<...>
|
||||
{$ELSIF "(" ident {"|" ident} ")"}
|
||||
<...>
|
||||
[$ELSE]
|
||||
<...>
|
||||
$END
|
||||
|
||||
где ident:
|
||||
- одно из возможных значений параметра <target> в командной строке
|
||||
- пользовательский идентификатор, переданный с ключом -def при компиляции
|
||||
|
||||
примеры:
|
||||
|
||||
$IF (win64con | win64gui | win64dll)
|
||||
OS := "WIN64";
|
||||
$ELSIF (win32con | win32gui | win32dll)
|
||||
OS := "WIN32";
|
||||
$ELSIF (linux64exe | linux64so)
|
||||
OS := "LINUX64";
|
||||
$ELSIF (linux32exe | linux32so)
|
||||
OS := "LINUX32";
|
||||
$ELSE
|
||||
OS := "UNKNOWN";
|
||||
$END
|
||||
|
||||
|
||||
$IF (CPUX86_64) (* -def CPUX86_64 *)
|
||||
bit_depth := 64;
|
||||
$ELSE
|
||||
bit_depth := 32;
|
||||
$END
|
||||
@@ -18,6 +18,7 @@ UTF-8 с BOM-сигнатурой.
|
||||
-nochk <"ptibcwra"> отключить проверки при выполнении
|
||||
-lower разрешить ключевые слова и встроенные идентификаторы в
|
||||
нижнем регистре
|
||||
-def <имя> задать символ условной компиляции
|
||||
|
||||
параметр -nochk задается в виде строки из символов:
|
||||
"p" - указатели
|
||||
|
||||
@@ -18,6 +18,7 @@ UTF-8 с BOM-сигнатурой.
|
||||
-nochk <"ptibcwra"> отключить проверки при выполнении
|
||||
-lower разрешить ключевые слова и встроенные идентификаторы в
|
||||
нижнем регистре
|
||||
-def <имя> задать символ условной компиляции
|
||||
|
||||
параметр -nochk задается в виде строки из символов:
|
||||
"p" - указатели
|
||||
|
||||
@@ -27,6 +27,7 @@ UTF-8 с BOM-сигнатурой.
|
||||
-nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже)
|
||||
-lower разрешить ключевые слова и встроенные идентификаторы в
|
||||
нижнем регистре
|
||||
-def <имя> задать символ условной компиляции
|
||||
-ver <major.minor> версия программы (только для kosdll)
|
||||
|
||||
параметр -nochk задается в виде строки из символов:
|
||||
|
||||
@@ -25,6 +25,7 @@ UTF-8 с BOM-сигнатурой.
|
||||
-nochk <"ptibcwra"> отключить проверки при выполнении
|
||||
-lower разрешить ключевые слова и встроенные идентификаторы в
|
||||
нижнем регистре
|
||||
-def <имя> задать символ условной компиляции
|
||||
|
||||
параметр -nochk задается в виде строки из символов:
|
||||
"p" - указатели
|
||||
|
||||
@@ -213,6 +213,7 @@ BEGIN
|
||||
C.StringLn(" -nochk <'ptibcwra'> disable runtime checking (pointers, types, indexes,");
|
||||
C.StringLn(" BYTE, CHR, WCHR)"); C.Ln;
|
||||
C.StringLn(" -lower allow lower case for keywords"); C.Ln;
|
||||
C.StringLn(" -def <identifier> define conditional compilation symbol"); C.Ln;
|
||||
C.StringLn(" -ver <major.minor> set version of program (KolibriOS DLL)"); C.Ln;
|
||||
C.StringLn(" -ram <size> set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
|
||||
C.StringLn(" -rom <size> set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
|
||||
|
||||
+2
-2
@@ -145,8 +145,8 @@ BEGIN
|
||||
|115: str := "recursive constant definition"
|
||||
|116: str := "procedure too deep nested"
|
||||
|117: str := "string expected"
|
||||
|118: str := "'$END' or '$ELSE' without '$IF'"
|
||||
|119: str := "'$IF', '$ELSE' or '$END' expected"
|
||||
|118: str := "'$END', '$ELSE' or '$ELSIF' without '$IF'"
|
||||
|119: str := "'$IF', '$ELSIF', '$ELSE' or '$END' expected"
|
||||
|120: str := "too many formal parameters"
|
||||
|121: str := "multiply defined handler"
|
||||
|122: str := "bad divisor"
|
||||
|
||||
+39
-34
@@ -481,10 +481,12 @@ VAR
|
||||
c: CHAR;
|
||||
|
||||
|
||||
PROCEDURE error (text: SCANNER; lex: LEX; errno: INTEGER);
|
||||
PROCEDURE check (cond: BOOLEAN; text: SCANNER; lex: LEX; errno: INTEGER);
|
||||
BEGIN
|
||||
IF ~cond THEN
|
||||
ERRORS.ErrorMsg(text.fname, lex.pos.line, lex.pos.col, errno)
|
||||
END error;
|
||||
END
|
||||
END check;
|
||||
|
||||
|
||||
PROCEDURE IsDef (str: ARRAY OF CHAR): BOOLEAN;
|
||||
@@ -501,18 +503,17 @@ VAR
|
||||
END IsDef;
|
||||
|
||||
|
||||
PROCEDURE IsSkip (text: SCANNER): BOOLEAN;
|
||||
PROCEDURE Skip (text: SCANNER);
|
||||
VAR
|
||||
i: INTEGER;
|
||||
|
||||
BEGIN
|
||||
i := 0;
|
||||
WHILE (i <= text._if) & ~text._skip[i] DO
|
||||
WHILE (i <= text.ifc) & ~text._skip[i] DO
|
||||
INC(i)
|
||||
END
|
||||
|
||||
RETURN i <= text._if
|
||||
END IsSkip;
|
||||
END;
|
||||
text.skip := i <= text.ifc
|
||||
END Skip;
|
||||
|
||||
|
||||
PROCEDURE prep_if (text: SCANNER; VAR lex: LEX);
|
||||
@@ -520,19 +521,21 @@ VAR
|
||||
skip: BOOLEAN;
|
||||
|
||||
BEGIN
|
||||
INC(text.ifc);
|
||||
text._elsif[text.ifc] := lex.sym = lxELSIF;
|
||||
IF lex.sym = lxIF THEN
|
||||
INC(text.elsec);
|
||||
text._else[text.elsec] := FALSE
|
||||
END;
|
||||
_if := TRUE;
|
||||
skip := TRUE;
|
||||
text.skip := FALSE;
|
||||
|
||||
Next(text, lex);
|
||||
IF lex.sym # lxLROUND THEN
|
||||
error(text, lex, 64)
|
||||
END;
|
||||
check(lex.sym = lxLROUND, text, lex, 64);
|
||||
|
||||
Next(text, lex);
|
||||
IF lex.sym # lxIDENT THEN
|
||||
error(text, lex, 22)
|
||||
END;
|
||||
check(lex.sym = lxIDENT, text, lex, 22);
|
||||
|
||||
REPEAT
|
||||
IF IsDef(lex.s) THEN
|
||||
@@ -542,37 +545,39 @@ VAR
|
||||
Next(text, lex);
|
||||
IF lex.sym = lxBAR THEN
|
||||
Next(text, lex);
|
||||
IF lex.sym # lxIDENT THEN
|
||||
error(text, lex, 22)
|
||||
END
|
||||
check(lex.sym = lxIDENT, text, lex, 22)
|
||||
ELSE
|
||||
IF lex.sym # lxRROUND THEN
|
||||
error(text, lex, 33)
|
||||
END
|
||||
check(lex.sym = lxRROUND, text, lex, 33)
|
||||
END
|
||||
UNTIL lex.sym = lxRROUND;
|
||||
|
||||
_if := FALSE;
|
||||
|
||||
INC(text._if);
|
||||
text._skip[text._if] := skip;
|
||||
text.skip := IsSkip(text);
|
||||
text._skip[text.ifc] := skip;
|
||||
Skip(text);
|
||||
Next(text, lex)
|
||||
END prep_if;
|
||||
|
||||
|
||||
PROCEDURE prep_end (text: SCANNER; VAR lex: LEX);
|
||||
BEGIN
|
||||
IF text._if = 0 THEN
|
||||
error(text, lex, 118)
|
||||
END;
|
||||
check(text.ifc > 0, text, lex, 118);
|
||||
IF lex.sym = lxEND THEN
|
||||
DEC(text._if)
|
||||
ELSIF lex.sym = lxELSE THEN
|
||||
text._skip[text._if] := ~text._skip[text._if]
|
||||
WHILE text._elsif[text.ifc] DO
|
||||
DEC(text.ifc)
|
||||
END;
|
||||
text.skip := IsSkip(text);
|
||||
DEC(text.ifc);
|
||||
DEC(text.elsec)
|
||||
ELSIF (lex.sym = lxELSE) OR (lex.sym = lxELSIF) THEN
|
||||
check(~text._else[text.elsec], text, lex, 118);
|
||||
text._skip[text.ifc] := ~text._skip[text.ifc];
|
||||
text._else[text.elsec] := lex.sym = lxELSE
|
||||
END;
|
||||
Skip(text);
|
||||
IF lex.sym = lxELSIF THEN
|
||||
prep_if(text, lex)
|
||||
ELSE
|
||||
Next(text, lex)
|
||||
END
|
||||
END prep_end;
|
||||
|
||||
|
||||
@@ -607,15 +612,15 @@ BEGIN
|
||||
IF ~_if THEN
|
||||
prep_if(text, lex)
|
||||
END
|
||||
ELSIF (lex.sym = lxEND) OR (lex.sym = lxELSE) THEN
|
||||
ELSIF (lex.sym = lxEND) OR (lex.sym = lxELSE) OR (lex.sym = lxELSIF) THEN
|
||||
IF ~_if THEN
|
||||
prep_end(text, lex)
|
||||
END
|
||||
ELSE
|
||||
error(text, lex, 119)
|
||||
check(FALSE, text, lex, 119)
|
||||
END
|
||||
ELSE
|
||||
error(text, lex, 119)
|
||||
check(FALSE, text, lex, 119)
|
||||
END
|
||||
ELSIF c = 0X THEN
|
||||
lex.sym := lxEOF;
|
||||
|
||||
+7
-3
@@ -28,12 +28,15 @@ TYPE
|
||||
CR: BOOLEAN;
|
||||
|
||||
line*, col*: INTEGER;
|
||||
_if*: INTEGER;
|
||||
ifc*: INTEGER;
|
||||
elsec*: INTEGER;
|
||||
eof*: BOOLEAN;
|
||||
eol*: BOOLEAN;
|
||||
skip*: BOOLEAN;
|
||||
peak*: CHAR;
|
||||
_skip*: ARRAY 100 OF BOOLEAN;
|
||||
_skip*,
|
||||
_elsif*,
|
||||
_else*: ARRAY 100 OF BOOLEAN;
|
||||
fname*: ARRAY 2048 OF CHAR
|
||||
|
||||
END;
|
||||
@@ -166,7 +169,8 @@ BEGIN
|
||||
text.eof := FALSE;
|
||||
text.eol := FALSE;
|
||||
text.skip := FALSE;
|
||||
text._if := 0;
|
||||
text.ifc := 0;
|
||||
text.elsec := 0;
|
||||
text._skip[0] := FALSE;
|
||||
text.peak := 0X;
|
||||
text.file := FILES.open(name);
|
||||
|
||||
Reference in new issue
Block a user