условная компиляция: $ELSIF, обновление документации

This commit is contained in:
AntKrotov committed 2020-10-11 01:59:18 +03:00
1 parent 96fb19fa3e
commit 68fd463de7
11 files changed
+89 -39

No files matched your search

BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+36
View File
@@ -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
+1
View File
@@ -18,6 +18,7 @@ UTF-8 с BOM-сигнатурой.
-nochk <"ptibcwra"> отключить проверки при выполнении
-lower разрешить ключевые слова и встроенные идентификаторы в
нижнем регистре
-def <имя> задать символ условной компиляции
параметр -nochk задается в виде строки из символов:
"p" - указатели
+1
View File
@@ -18,6 +18,7 @@ UTF-8 с BOM-сигнатурой.
-nochk <"ptibcwra"> отключить проверки при выполнении
-lower разрешить ключевые слова и встроенные идентификаторы в
нижнем регистре
-def <имя> задать символ условной компиляции
параметр -nochk задается в виде строки из символов:
"p" - указатели
+1
View File
@@ -27,6 +27,7 @@ UTF-8 с BOM-сигнатурой.
-nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже)
-lower разрешить ключевые слова и встроенные идентификаторы в
нижнем регистре
-def <имя> задать символ условной компиляции
-ver <major.minor> версия программы (только для kosdll)
параметр -nochk задается в виде строки из символов:
+1
View File
@@ -25,6 +25,7 @@ UTF-8 с BOM-сигнатурой.
-nochk <"ptibcwra"> отключить проверки при выполнении
-lower разрешить ключевые слова и встроенные идентификаторы в
нижнем регистре
-def <имя> задать символ условной компиляции
параметр -nochk задается в виде строки из символов:
"p" - указатели
+1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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);