forked from KolibriOS/kolibrios
Oberon07: v1.53
git-svn-id: svn://kolibrios.org@9177 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
e861f97224
commit
ce8fecbc6b
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,413 +1,415 @@
|
|||||||
Компилятор языка программирования Oberon-07/16 для i486
|
Компилятор языка программирования Oberon-07/16 для i486
|
||||||
Windows/Linux/KolibriOS.
|
Windows/Linux/KolibriOS.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
Параметры командной строки
|
Параметры командной строки
|
||||||
|
|
||||||
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
|
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
|
||||||
UTF-8 с BOM-сигнатурой.
|
UTF-8 с BOM-сигнатурой.
|
||||||
Выход - испоняемый файл формата PE32, ELF или MENUET01/MSCOFF.
|
Выход - испоняемый файл формата PE32, ELF или MENUET01/MSCOFF.
|
||||||
Параметры:
|
Параметры:
|
||||||
1) имя главного модуля
|
1) имя главного модуля
|
||||||
2) тип приложения
|
2) тип приложения
|
||||||
"win32con" - Windows console
|
"win32con" - Windows console
|
||||||
"win32gui" - Windows GUI
|
"win32gui" - Windows GUI
|
||||||
"win32dll" - Windows DLL
|
"win32dll" - Windows DLL
|
||||||
"linux32exe" - Linux ELF-EXEC
|
"linux32exe" - Linux ELF-EXEC
|
||||||
"linux32so" - Linux ELF-SO
|
"linux32so" - Linux ELF-SO
|
||||||
"kosexe" - KolibriOS
|
"kosexe" - KolibriOS
|
||||||
"kosdll" - KolibriOS DLL
|
"kosdll" - KolibriOS DLL
|
||||||
|
|
||||||
3) необязательные параметры-ключи
|
3) необязательные параметры-ключи
|
||||||
-out <file_name> имя результирующего файла; по умолчанию,
|
-out <file_name> имя результирующего файла; по умолчанию,
|
||||||
совпадает с именем главного модуля, но с другим расширением
|
совпадает с именем главного модуля, но с другим расширением
|
||||||
(соответствует типу исполняемого файла)
|
(соответствует типу исполняемого файла)
|
||||||
-stk <size> размер стэка в мегабайтах (по умолчанию 2 Мб,
|
-stk <size> размер стэка в мегабайтах (по умолчанию 2 Мб,
|
||||||
допустимо от 1 до 32 Мб)
|
допустимо от 1 до 32 Мб)
|
||||||
-nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже)
|
-tab <width> размер табуляции (используется для вычисления координат в
|
||||||
-lower разрешить ключевые слова и встроенные идентификаторы в
|
исходном коде), по умолчанию - 4
|
||||||
нижнем регистре
|
-nochk <"ptibcwra"> отключить проверки при выполнении (см. ниже)
|
||||||
-def <имя> задать символ условной компиляции
|
-lower разрешить ключевые слова и встроенные идентификаторы в
|
||||||
-ver <major.minor> версия программы (только для kosdll)
|
нижнем регистре
|
||||||
|
-def <имя> задать символ условной компиляции
|
||||||
параметр -nochk задается в виде строки из символов:
|
-ver <major.minor> версия программы (только для kosdll)
|
||||||
"p" - указатели
|
|
||||||
"t" - типы
|
параметр -nochk задается в виде строки из символов:
|
||||||
"i" - индексы
|
"p" - указатели
|
||||||
"b" - неявное приведение INTEGER к BYTE
|
"t" - типы
|
||||||
"c" - диапазон аргумента функции CHR
|
"i" - индексы
|
||||||
"w" - диапазон аргумента функции WCHR
|
"b" - неявное приведение INTEGER к BYTE
|
||||||
"r" - эквивалентно "bcw"
|
"c" - диапазон аргумента функции CHR
|
||||||
"a" - все проверки
|
"w" - диапазон аргумента функции WCHR
|
||||||
|
"r" - эквивалентно "bcw"
|
||||||
Порядок символов может быть любым. Наличие в строке того или иного
|
"a" - все проверки
|
||||||
символа отключает соответствующую проверку.
|
|
||||||
|
Порядок символов может быть любым. Наличие в строке того или иного
|
||||||
Например: -nochk it - отключить проверку индексов и охрану типа.
|
символа отключает соответствующую проверку.
|
||||||
-nochk a - отключить все отключаемые проверки.
|
|
||||||
|
Например: -nochk it - отключить проверку индексов и охрану типа.
|
||||||
Например:
|
-nochk a - отключить все отключаемые проверки.
|
||||||
|
|
||||||
Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -stk 1
|
Например:
|
||||||
Compiler.exe "C:\example.ob07" win32dll -out "C:\example.dll"
|
|
||||||
Compiler.exe "C:\example.ob07" win32gui -out "C:\example.exe" -stk 4
|
Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -stk 1
|
||||||
Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -nochk pti
|
Compiler.exe "C:\example.ob07" win32dll -out "C:\example.dll"
|
||||||
Compiler.kex "/tmp0/1/example.ob07" kosexe -out "/tmp0/1/example.kex" -stk 4
|
Compiler.exe "C:\example.ob07" win32gui -out "C:\example.exe" -stk 4
|
||||||
Compiler.kex "/tmp0/1/example.ob07" kosdll -out "/tmp0/1/mydll.obj" -ver 2.7
|
Compiler.exe "C:\example.ob07" win32con -out "C:\example.exe" -nochk pti
|
||||||
Compiler.exe "C:\example.ob07" linux32exe -out "C:\example" -stk 1 -nochk a
|
Compiler.kex "/tmp0/1/example.ob07" kosexe -out "/tmp0/1/example.kex" -stk 4
|
||||||
|
Compiler.kex "/tmp0/1/example.ob07" kosdll -out "/tmp0/1/mydll.obj" -ver 2.7
|
||||||
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
|
Compiler.exe "C:\example.ob07" linux32exe -out "C:\example" -stk 1 -nochk a
|
||||||
При работе компилятора в KolibriOS, код завершения не передается.
|
|
||||||
|
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
|
||||||
------------------------------------------------------------------------------
|
При работе компилятора в KolibriOS, код завершения не передается.
|
||||||
Отличия от оригинала
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
1. Расширен псевдомодуль SYSTEM
|
Отличия от оригинала
|
||||||
2. В идентификаторах допускается символ "_"
|
|
||||||
3. Добавлены системные флаги
|
1. Расширен псевдомодуль SYSTEM
|
||||||
4. Усовершенствован оператор CASE (добавлены константные выражения в
|
2. В идентификаторах допускается символ "_"
|
||||||
метках вариантов и необязательная ветка ELSE)
|
3. Добавлены системные флаги
|
||||||
5. Расширен набор стандартных процедур
|
4. Усовершенствован оператор CASE (добавлены константные выражения в
|
||||||
6. Семантика охраны/проверки типа уточнена для нулевого указателя
|
метках вариантов и необязательная ветка ELSE)
|
||||||
7. Добавлены однострочные комментарии (начинаются с пары символов "//")
|
5. Расширен набор стандартных процедур
|
||||||
8. Разрешено наследование от типа-указателя
|
6. Семантика охраны/проверки типа уточнена для нулевого указателя
|
||||||
9. Добавлен синтаксис для импорта процедур из внешних библиотек
|
7. Добавлены однострочные комментарии (начинаются с пары символов "//")
|
||||||
10. "Строки" можно заключать также в одиночные кавычки: 'строка'
|
8. Разрешено наследование от типа-указателя
|
||||||
11. Добавлен тип WCHAR
|
9. Добавлен синтаксис для импорта процедур из внешних библиотек
|
||||||
12. Добавлена операция конкатенации строковых и символьных констант
|
10. "Строки" можно заключать также в одиночные кавычки: 'строка'
|
||||||
13. Возможен импорт модулей с указанием пути и имени файла
|
11. Добавлен тип WCHAR
|
||||||
14. Добавлен специальный синтаксис для условной компиляции (см. CC.txt)
|
12. Добавлена операция конкатенации строковых и символьных констант
|
||||||
15. Имя процедуры в конце объявления (после END) необязательно
|
13. Возможен импорт модулей с указанием пути и имени файла
|
||||||
|
14. Добавлен специальный синтаксис для условной компиляции (см. CC.txt)
|
||||||
------------------------------------------------------------------------------
|
15. Имя процедуры в конце объявления (после END) необязательно
|
||||||
Особенности реализации
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
1. Основные типы
|
Особенности реализации
|
||||||
|
|
||||||
Тип Диапазон значений Размер, байт
|
1. Основные типы
|
||||||
|
|
||||||
INTEGER -2147483648 .. 2147483647 4
|
Тип Диапазон значений Размер, байт
|
||||||
REAL 4.94E-324 .. 1.70E+308 8
|
|
||||||
CHAR символ ASCII (0X .. 0FFX) 1
|
INTEGER -2147483648 .. 2147483647 4
|
||||||
BOOLEAN FALSE, TRUE 1
|
REAL 4.94E-324 .. 1.70E+308 8
|
||||||
SET множество из целых чисел {0 .. 31} 4
|
CHAR символ ASCII (0X .. 0FFX) 1
|
||||||
BYTE 0 .. 255 1
|
BOOLEAN FALSE, TRUE 1
|
||||||
WCHAR символ юникода (0X .. 0FFFFX) 2
|
SET множество из целых чисел {0 .. 31} 4
|
||||||
|
BYTE 0 .. 255 1
|
||||||
2. Максимальная длина идентификаторов - 255 символов
|
WCHAR символ юникода (0X .. 0FFFFX) 2
|
||||||
3. Максимальная длина строковых констант - 511 символов (UTF-8)
|
|
||||||
4. Максимальная размерность открытых массивов - 5
|
2. Максимальная длина идентификаторов - 255 символов
|
||||||
5. Процедура NEW заполняет нулями выделенный блок памяти
|
3. Максимальная длина строковых констант - 511 символов (UTF-8)
|
||||||
6. Глобальные и локальные переменные инициализируются нулями
|
4. Максимальная размерность открытых массивов - 5
|
||||||
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
|
5. Процедура NEW заполняет нулями выделенный блок памяти
|
||||||
модульность отсутствуют
|
6. Глобальные и локальные переменные инициализируются нулями
|
||||||
8. Тип BYTE в выражениях всегда приводится к INTEGER
|
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
|
||||||
9. Контроль переполнения значений выражений не производится
|
модульность отсутствуют
|
||||||
10. Ошибки времени выполнения:
|
8. Тип BYTE в выражениях всегда приводится к INTEGER
|
||||||
|
9. Контроль переполнения значений выражений не производится
|
||||||
1 ASSERT(x), при x = FALSE
|
10. Ошибки времени выполнения:
|
||||||
2 разыменование нулевого указателя
|
|
||||||
3 целочисленное деление на неположительное число
|
1 ASSERT(x), при x = FALSE
|
||||||
4 вызов процедуры через процедурную переменную с нулевым значением
|
2 разыменование нулевого указателя
|
||||||
5 ошибка охраны типа
|
3 целочисленное деление на неположительное число
|
||||||
6 нарушение границ массива
|
4 вызов процедуры через процедурную переменную с нулевым значением
|
||||||
7 непредусмотренное значение выражения в операторе CASE
|
5 ошибка охраны типа
|
||||||
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x)
|
6 нарушение границ массива
|
||||||
9 CHR(x), если (x < 0) OR (x > 255)
|
7 непредусмотренное значение выражения в операторе CASE
|
||||||
10 WCHR(x), если (x < 0) OR (x > 65535)
|
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x)
|
||||||
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
|
9 CHR(x), если (x < 0) OR (x > 255)
|
||||||
|
10 WCHR(x), если (x < 0) OR (x > 65535)
|
||||||
------------------------------------------------------------------------------
|
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
|
||||||
Псевдомодуль SYSTEM
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
|
Псевдомодуль SYSTEM
|
||||||
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
|
|
||||||
повреждению данных времени выполнения и аварийному завершению программы.
|
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
|
||||||
|
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
|
||||||
PROCEDURE ADR(v: любой тип): INTEGER
|
повреждению данных времени выполнения и аварийному завершению программы.
|
||||||
v - переменная или процедура;
|
|
||||||
возвращает адрес v
|
PROCEDURE ADR(v: любой тип): INTEGER
|
||||||
|
v - переменная или процедура;
|
||||||
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
|
возвращает адрес v
|
||||||
возвращает адрес x
|
|
||||||
|
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
|
||||||
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
|
возвращает адрес x
|
||||||
возвращает адрес x
|
|
||||||
|
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
|
||||||
PROCEDURE SIZE(T): INTEGER
|
возвращает адрес x
|
||||||
возвращает размер типа T
|
|
||||||
|
PROCEDURE SIZE(T): INTEGER
|
||||||
PROCEDURE TYPEID(T): INTEGER
|
возвращает размер типа T
|
||||||
T - тип-запись или тип-указатель,
|
|
||||||
возвращает номер типа в таблице типов-записей
|
PROCEDURE TYPEID(T): INTEGER
|
||||||
|
T - тип-запись или тип-указатель,
|
||||||
PROCEDURE INF(): REAL
|
возвращает номер типа в таблице типов-записей
|
||||||
возвращает специальное вещественное значение "бесконечность"
|
|
||||||
|
PROCEDURE INF(): REAL
|
||||||
PROCEDURE MOVE(Source, Dest, n: INTEGER)
|
возвращает специальное вещественное значение "бесконечность"
|
||||||
Копирует n байт памяти из Source в Dest,
|
|
||||||
области Source и Dest не могут перекрываться
|
PROCEDURE MOVE(Source, Dest, n: INTEGER)
|
||||||
|
Копирует n байт памяти из Source в Dest,
|
||||||
PROCEDURE GET(a: INTEGER;
|
области Source и Dest не могут перекрываться
|
||||||
VAR v: любой основной тип, PROCEDURE, POINTER)
|
|
||||||
v := Память[a]
|
PROCEDURE GET(a: INTEGER;
|
||||||
|
VAR v: любой основной тип, PROCEDURE, POINTER)
|
||||||
PROCEDURE GET8(a: INTEGER;
|
v := Память[a]
|
||||||
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
|
||||||
Эквивалентно
|
PROCEDURE GET8(a: INTEGER;
|
||||||
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
|
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
||||||
|
Эквивалентно
|
||||||
PROCEDURE GET16(a: INTEGER;
|
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
|
||||||
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
|
|
||||||
Эквивалентно
|
PROCEDURE GET16(a: INTEGER;
|
||||||
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
|
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
|
||||||
|
Эквивалентно
|
||||||
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
|
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
|
||||||
Эквивалентно
|
|
||||||
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
|
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
|
||||||
|
Эквивалентно
|
||||||
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
|
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
|
||||||
Память[a] := x;
|
|
||||||
Если x: BYTE или x: WCHAR, то значение x будет расширено
|
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
|
||||||
до 32 бит, для записи байтов использовать SYSTEM.PUT8,
|
Память[a] := x;
|
||||||
для WCHAR -- SYSTEM.PUT16
|
Если x: BYTE или x: WCHAR, то значение x будет расширено
|
||||||
|
до 32 бит, для записи байтов использовать SYSTEM.PUT8,
|
||||||
PROCEDURE PUT8(a: INTEGER;
|
для WCHAR -- SYSTEM.PUT16
|
||||||
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
|
||||||
Память[a] := младшие 8 бит (x)
|
PROCEDURE PUT8(a: INTEGER;
|
||||||
|
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
||||||
PROCEDURE PUT16(a: INTEGER;
|
Память[a] := младшие 8 бит (x)
|
||||||
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
|
||||||
Память[a] := младшие 16 бит (x)
|
PROCEDURE PUT16(a: INTEGER;
|
||||||
|
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
||||||
PROCEDURE PUT32(a: INTEGER;
|
Память[a] := младшие 16 бит (x)
|
||||||
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
|
||||||
Память[a] := младшие 32 бит (x)
|
PROCEDURE PUT32(a: INTEGER;
|
||||||
|
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
||||||
PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER)
|
Память[a] := младшие 32 бит (x)
|
||||||
Копирует n байт памяти из Source в Dest.
|
|
||||||
Эквивалентно
|
PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER)
|
||||||
SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n)
|
Копирует n байт памяти из Source в Dest.
|
||||||
|
Эквивалентно
|
||||||
PROCEDURE CODE(byte1, byte2,... : INTEGER)
|
SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n)
|
||||||
Вставка машинного кода,
|
|
||||||
byte1, byte2 ... - константы в диапазоне 0..255,
|
PROCEDURE CODE(byte1, byte2,... : INTEGER)
|
||||||
например:
|
Вставка машинного кода,
|
||||||
SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *)
|
byte1, byte2 ... - константы в диапазоне 0..255,
|
||||||
|
например:
|
||||||
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не
|
SYSTEM.CODE(08BH, 045H, 008H) (* mov eax, dword [ebp + 08h] *)
|
||||||
допускаются никакие явные операции, за исключением присваивания.
|
|
||||||
|
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не
|
||||||
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
|
допускаются никакие явные операции, за исключением присваивания.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
|
||||||
Системные флаги
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
При объявлении процедурных типов и глобальных процедур, после ключевого
|
Системные флаги
|
||||||
слова PROCEDURE может быть указан флаг соглашения о вызове: [stdcall],
|
|
||||||
[cdecl], [ccall], [windows], [linux], [oberon]. Например:
|
При объявлении процедурных типов и глобальных процедур, после ключевого
|
||||||
|
слова PROCEDURE может быть указан флаг соглашения о вызове: [stdcall],
|
||||||
PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER;
|
[cdecl], [ccall], [windows], [linux], [oberon]. Например:
|
||||||
|
|
||||||
Если указан флаг [ccall], то принимается соглашение cdecl, но перед
|
PROCEDURE [ccall] MyProc (x, y, z: INTEGER): INTEGER;
|
||||||
вызовом указатель стэка будет выравнен по границе 16 байт.
|
|
||||||
Флаг [windows] - синоним для [stdcall], [linux] - синоним для [ccall].
|
Если указан флаг [ccall], то принимается соглашение cdecl, но перед
|
||||||
Знак "-" после имени флага ([stdcall-], [linux-], ...) означает, что
|
вызовом указатель стэка будет выравнен по границе 16 байт.
|
||||||
результат процедуры можно игнорировать (не допускается для типа REAL).
|
Флаг [windows] - синоним для [stdcall], [linux] - синоним для [ccall].
|
||||||
Если флаг не указан или указан флаг [oberon], то принимается внутреннее
|
Знак "-" после имени флага ([stdcall-], [linux-], ...) означает, что
|
||||||
соглашение о вызове.
|
результат процедуры можно игнорировать (не допускается для типа REAL).
|
||||||
|
Если флаг не указан или указан флаг [oberon], то принимается внутреннее
|
||||||
При объявлении типов-записей, после ключевого слова RECORD может быть
|
соглашение о вызове.
|
||||||
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей
|
|
||||||
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть
|
При объявлении типов-записей, после ключевого слова RECORD может быть
|
||||||
базовыми типами для других записей.
|
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей
|
||||||
Для использования системных флагов, требуется импортировать SYSTEM.
|
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть
|
||||||
|
базовыми типами для других записей.
|
||||||
------------------------------------------------------------------------------
|
Для использования системных флагов, требуется импортировать SYSTEM.
|
||||||
Оператор CASE
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Синтаксис оператора CASE:
|
Оператор CASE
|
||||||
|
|
||||||
CaseStatement =
|
Синтаксис оператора CASE:
|
||||||
CASE Expression OF Case {"|" Case}
|
|
||||||
[ELSE StatementSequence] END.
|
CaseStatement =
|
||||||
Case = [CaseLabelList ":" StatementSequence].
|
CASE Expression OF Case {"|" Case}
|
||||||
CaseLabelList = CaseLabels {"," CaseLabels}.
|
[ELSE StatementSequence] END.
|
||||||
CaseLabels = ConstExpression [".." ConstExpression].
|
Case = [CaseLabelList ":" StatementSequence].
|
||||||
|
CaseLabelList = CaseLabels {"," CaseLabels}.
|
||||||
Например:
|
CaseLabels = ConstExpression [".." ConstExpression].
|
||||||
|
|
||||||
CASE x OF
|
Например:
|
||||||
|-1: DoSomething1
|
|
||||||
| 1: DoSomething2
|
CASE x OF
|
||||||
| 0: DoSomething3
|
|-1: DoSomething1
|
||||||
ELSE
|
| 1: DoSomething2
|
||||||
DoSomething4
|
| 0: DoSomething3
|
||||||
END
|
ELSE
|
||||||
|
DoSomething4
|
||||||
В метках вариантов можно использовать константные выражения, ветка ELSE
|
END
|
||||||
необязательна. Если значение x не соответствует ни одному варианту и ELSE
|
|
||||||
отсутствует, то программа прерывается с ошибкой времени выполнения.
|
В метках вариантов можно использовать константные выражения, ветка ELSE
|
||||||
|
необязательна. Если значение x не соответствует ни одному варианту и ELSE
|
||||||
------------------------------------------------------------------------------
|
отсутствует, то программа прерывается с ошибкой времени выполнения.
|
||||||
Тип WCHAR
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
|
Тип WCHAR
|
||||||
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
|
|
||||||
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
|
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
|
||||||
только тип CHAR. Для получения значения типа WCHAR, следует использовать
|
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
|
||||||
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
|
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
|
||||||
исходный код в кодировке UTF-8 с BOM.
|
только тип CHAR. Для получения значения типа WCHAR, следует использовать
|
||||||
|
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
|
||||||
------------------------------------------------------------------------------
|
исходный код в кодировке UTF-8 с BOM.
|
||||||
Конкатенация строковых и символьных констант
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Допускается конкатенация ("+") константных строк и символов типа CHAR:
|
Конкатенация строковых и символьных констант
|
||||||
|
|
||||||
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
|
Допускается конкатенация ("+") константных строк и символов типа CHAR:
|
||||||
|
|
||||||
newline = 0DX + 0AX;
|
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
newline = 0DX + 0AX;
|
||||||
Проверка и охрана типа нулевого указателя
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Оригинальное сообщение о языке не определяет поведение программы при
|
Проверка и охрана типа нулевого указателя
|
||||||
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
|
|
||||||
Oberon-реализациях выполнение такой операции приводит к ошибке времени
|
Оригинальное сообщение о языке не определяет поведение программы при
|
||||||
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
|
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
|
||||||
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
|
Oberon-реализациях выполнение такой операции приводит к ошибке времени
|
||||||
значительно сократить частоту применения охраны типа.
|
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
|
||||||
|
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
|
||||||
------------------------------------------------------------------------------
|
значительно сократить частоту применения охраны типа.
|
||||||
Дополнительные стандартные процедуры
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
DISPOSE (VAR v: любой_указатель)
|
Дополнительные стандартные процедуры
|
||||||
Освобождает память, выделенную процедурой NEW для
|
|
||||||
динамической переменной v^, и присваивает переменной v
|
DISPOSE (VAR v: любой_указатель)
|
||||||
значение NIL.
|
Освобождает память, выделенную процедурой NEW для
|
||||||
|
динамической переменной v^, и присваивает переменной v
|
||||||
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
|
значение NIL.
|
||||||
v := x;
|
|
||||||
Если LEN(v) < LEN(x), то строка x будет скопирована
|
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
|
||||||
не полностью
|
v := x;
|
||||||
|
Если LEN(v) < LEN(x), то строка x будет скопирована
|
||||||
LSR (x, n: INTEGER): INTEGER
|
не полностью
|
||||||
Логический сдвиг x на n бит вправо.
|
|
||||||
|
LSR (x, n: INTEGER): INTEGER
|
||||||
MIN (a, b: INTEGER): INTEGER
|
Логический сдвиг x на n бит вправо.
|
||||||
Минимум из двух значений.
|
|
||||||
|
MIN (a, b: INTEGER): INTEGER
|
||||||
MAX (a, b: INTEGER): INTEGER
|
Минимум из двух значений.
|
||||||
Максимум из двух значений.
|
|
||||||
|
MAX (a, b: INTEGER): INTEGER
|
||||||
BITS (x: INTEGER): SET
|
Максимум из двух значений.
|
||||||
Интерпретирует x как значение типа SET.
|
|
||||||
Выполняется на этапе компиляции.
|
BITS (x: INTEGER): SET
|
||||||
|
Интерпретирует x как значение типа SET.
|
||||||
LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
|
Выполняется на этапе компиляции.
|
||||||
Длина 0X-завершенной строки s, без учета символа 0X.
|
|
||||||
Если символ 0X отсутствует, функция возвращает длину
|
LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
|
||||||
массива s. s не может быть константой.
|
Длина 0X-завершенной строки s, без учета символа 0X.
|
||||||
|
Если символ 0X отсутствует, функция возвращает длину
|
||||||
WCHR (n: INTEGER): WCHAR
|
массива s. s не может быть константой.
|
||||||
Преобразование типа, аналогично CHR(n: INTEGER): CHAR
|
|
||||||
|
WCHR (n: INTEGER): WCHAR
|
||||||
------------------------------------------------------------------------------
|
Преобразование типа, аналогично CHR(n: INTEGER): CHAR
|
||||||
Импорт модулей с указанием пути и имени файла
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Примеры:
|
Импорт модулей с указанием пути и имени файла
|
||||||
|
|
||||||
IMPORT Math IN "./lib/math.ob07"; (* относительно текущего модуля *)
|
Примеры:
|
||||||
|
|
||||||
IMPORT M1 IN "C:\lib\math.ob07"; (* абсолютный путь *)
|
IMPORT Math IN "./lib/math.ob07"; (* относительно текущего модуля *)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
IMPORT M1 IN "C:\lib\math.ob07"; (* абсолютный путь *)
|
||||||
Импортированные процедуры
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Синтаксис импорта:
|
Импортированные процедуры
|
||||||
|
|
||||||
PROCEDURE [callconv, library, function] proc_name (FormalParam): Type;
|
Синтаксис импорта:
|
||||||
|
|
||||||
- callconv -- соглашение о вызове
|
PROCEDURE [callconv, library, function] proc_name (FormalParam): Type;
|
||||||
- library -- имя файла динамической библиотеки (строковая константа)
|
|
||||||
- function -- имя импортируемой процедуры (строковая константа), если
|
- callconv -- соглашение о вызове
|
||||||
указана пустая строка, то имя процедуры = proc_name
|
- library -- имя файла динамической библиотеки (строковая константа)
|
||||||
|
- function -- имя импортируемой процедуры (строковая константа), если
|
||||||
например:
|
указана пустая строка, то имя процедуры = proc_name
|
||||||
|
|
||||||
PROCEDURE [windows, "kernel32.dll", ""] ExitProcess (code: INTEGER);
|
например:
|
||||||
|
|
||||||
PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN);
|
PROCEDURE [windows, "kernel32.dll", ""] ExitProcess (code: INTEGER);
|
||||||
|
|
||||||
В конце объявления может быть добавлено (необязательно) "END proc_name;"
|
PROCEDURE [stdcall, "Console.obj", "con_exit"] exit (bCloseWindow: BOOLEAN);
|
||||||
|
|
||||||
Объявления импортированных процедур должны располагаться в глобальной
|
В конце объявления может быть добавлено (необязательно) "END proc_name;"
|
||||||
области видимости модуля после объявления переменных, вместе с объявлением
|
|
||||||
"обычных" процедур, от которых импортированные отличаются только отсутствием
|
Объявления импортированных процедур должны располагаться в глобальной
|
||||||
тела процедуры. В остальном, к таким процедурам применимы те же правила:
|
области видимости модуля после объявления переменных, вместе с объявлением
|
||||||
их можно вызвать, присвоить процедурной переменной или получить адрес.
|
"обычных" процедур, от которых импортированные отличаются только отсутствием
|
||||||
|
тела процедуры. В остальном, к таким процедурам применимы те же правила:
|
||||||
Так как импортированная процедура всегда имеет явное указание соглашения о
|
их можно вызвать, присвоить процедурной переменной или получить адрес.
|
||||||
вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием
|
|
||||||
соглашения о вызове:
|
Так как импортированная процедура всегда имеет явное указание соглашения о
|
||||||
|
вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием
|
||||||
VAR
|
соглашения о вызове:
|
||||||
ExitProcess: PROCEDURE [windows] (code: INTEGER);
|
|
||||||
con_exit: PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
|
VAR
|
||||||
|
ExitProcess: PROCEDURE [windows] (code: INTEGER);
|
||||||
В KolibriOS импортировать процедуры можно только из библиотек, размещенных
|
con_exit: PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
|
||||||
в /rd/1/lib. Импортировать и вызывать функции инициализации библиотек
|
|
||||||
(lib_init, START) при этом не нужно.
|
В KolibriOS импортировать процедуры можно только из библиотек, размещенных
|
||||||
|
в /rd/1/lib. Импортировать и вызывать функции инициализации библиотек
|
||||||
Для Linux, импортированные процедуры не реализованы.
|
(lib_init, START) при этом не нужно.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
Для Linux, импортированные процедуры не реализованы.
|
||||||
Скрытые параметры процедур
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
|
Скрытые параметры процедур
|
||||||
формальных параметров, но учитываются компилятором при трансляции вызовов.
|
|
||||||
Это возможно в следующих случаях:
|
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
|
||||||
|
формальных параметров, но учитываются компилятором при трансляции вызовов.
|
||||||
1. Процедура имеет формальный параметр открытый массив:
|
Это возможно в следующих случаях:
|
||||||
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL);
|
|
||||||
Вызов транслируется так:
|
1. Процедура имеет формальный параметр открытый массив:
|
||||||
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x))
|
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL);
|
||||||
2. Процедура имеет формальный параметр-переменную типа RECORD:
|
Вызов транслируется так:
|
||||||
PROCEDURE Proc (VAR x: Rec);
|
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x))
|
||||||
Вызов транслируется так:
|
2. Процедура имеет формальный параметр-переменную типа RECORD:
|
||||||
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x))
|
PROCEDURE Proc (VAR x: Rec);
|
||||||
|
Вызов транслируется так:
|
||||||
Скрытые параметры необходимо учитывать при связи с внешними приложениями.
|
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x))
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
Скрытые параметры необходимо учитывать при связи с внешними приложениями.
|
||||||
Модуль RTL
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Все программы неявно используют модуль RTL. Компилятор транслирует
|
Модуль RTL
|
||||||
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об
|
|
||||||
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
|
Все программы неявно используют модуль RTL. Компилятор транслирует
|
||||||
следует вызывать эти процедуры явно.
|
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об
|
||||||
Сообщения об ошибках времени выполнения выводятся в диалоговых окнах
|
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
|
||||||
(Windows), в терминал (Linux), на доску отладки (KolibriOS).
|
следует вызывать эти процедуры явно.
|
||||||
|
Сообщения об ошибках времени выполнения выводятся в диалоговых окнах
|
||||||
------------------------------------------------------------------------------
|
(Windows), в терминал (Linux), на доску отладки (KolibriOS).
|
||||||
Модуль API
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Существуют несколько реализаций модуля API (для различных ОС).
|
Модуль API
|
||||||
Как и модуль RTL, модуль API не предназначен для прямого использования.
|
|
||||||
Он обеспечивает связь RTL с ОС.
|
Существуют несколько реализаций модуля API (для различных ОС).
|
||||||
|
Как и модуль RTL, модуль API не предназначен для прямого использования.
|
||||||
------------------------------------------------------------------------------
|
Он обеспечивает связь RTL с ОС.
|
||||||
Генерация исполняемых файлов DLL
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Разрешается экспортировать только процедуры. Для этого, процедура должна
|
Генерация исполняемых файлов DLL
|
||||||
находиться в главном модуле программы, и ее имя должно быть отмечено символом
|
|
||||||
экспорта ("*"). Нельзя экспортировать процедуры, которые импортированы из
|
Разрешается экспортировать только процедуры. Для этого, процедура должна
|
||||||
других dll-библиотек.
|
находиться в главном модуле программы, и ее имя должно быть отмечено символом
|
||||||
|
экспорта ("*"). Нельзя экспортировать процедуры, которые импортированы из
|
||||||
KolibriOS DLL всегда экспортируют идентификаторы "version" (версия
|
других dll-библиотек.
|
||||||
программы) и "lib_init" - адрес процедуры инициализации DLL:
|
|
||||||
|
KolibriOS DLL всегда экспортируют идентификаторы "version" (версия
|
||||||
PROCEDURE [stdcall] lib_init (): INTEGER
|
программы) и "lib_init" - адрес процедуры инициализации DLL:
|
||||||
|
|
||||||
Эта процедура должна быть вызвана перед использованием DLL.
|
PROCEDURE [stdcall] lib_init (): INTEGER
|
||||||
|
|
||||||
|
Эта процедура должна быть вызвана перед использованием DLL.
|
||||||
Процедура всегда возвращает 1.
|
Процедура всегда возвращает 1.
|
@ -1,394 +1,396 @@
|
|||||||
Компилятор языка программирования Oberon-07/16 для x86_64
|
Компилятор языка программирования Oberon-07/16 для x86_64
|
||||||
Windows/Linux
|
Windows/Linux
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
Параметры командной строки
|
Параметры командной строки
|
||||||
|
|
||||||
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
|
Вход - текстовые файлы модулей с расширением ".ob07", кодировка ANSI или
|
||||||
UTF-8 с BOM-сигнатурой.
|
UTF-8 с BOM-сигнатурой.
|
||||||
Выход - испоняемый файл формата PE32+ или ELF64.
|
Выход - испоняемый файл формата PE32+ или ELF64.
|
||||||
Параметры:
|
Параметры:
|
||||||
1) имя главного модуля
|
1) имя главного модуля
|
||||||
2) тип приложения
|
2) тип приложения
|
||||||
"win64con" - Windows64 console
|
"win64con" - Windows64 console
|
||||||
"win64gui" - Windows64 GUI
|
"win64gui" - Windows64 GUI
|
||||||
"win64dll" - Windows64 DLL
|
"win64dll" - Windows64 DLL
|
||||||
"linux64exe" - Linux ELF64-EXEC
|
"linux64exe" - Linux ELF64-EXEC
|
||||||
"linux64so" - Linux ELF64-SO
|
"linux64so" - Linux ELF64-SO
|
||||||
|
|
||||||
3) необязательные параметры-ключи
|
3) необязательные параметры-ключи
|
||||||
-out <file_name> имя результирующего файла; по умолчанию,
|
-out <file_name> имя результирующего файла; по умолчанию,
|
||||||
совпадает с именем главного модуля, но с другим расширением
|
совпадает с именем главного модуля, но с другим расширением
|
||||||
(соответствует типу исполняемого файла)
|
(соответствует типу исполняемого файла)
|
||||||
-stk <size> размер стэка в мегабайтах (по умолчанию 2 Мб,
|
-stk <size> размер стэка в мегабайтах (по умолчанию 2 Мб,
|
||||||
допустимо от 1 до 32 Мб)
|
допустимо от 1 до 32 Мб)
|
||||||
-nochk <"ptibcwra"> отключить проверки при выполнении
|
-tab <width> размер табуляции (используется для вычисления координат в
|
||||||
-lower разрешить ключевые слова и встроенные идентификаторы в
|
исходном коде), по умолчанию - 4
|
||||||
нижнем регистре
|
-nochk <"ptibcwra"> отключить проверки при выполнении
|
||||||
-def <имя> задать символ условной компиляции
|
-lower разрешить ключевые слова и встроенные идентификаторы в
|
||||||
|
нижнем регистре
|
||||||
параметр -nochk задается в виде строки из символов:
|
-def <имя> задать символ условной компиляции
|
||||||
"p" - указатели
|
|
||||||
"t" - типы
|
параметр -nochk задается в виде строки из символов:
|
||||||
"i" - индексы
|
"p" - указатели
|
||||||
"b" - неявное приведение INTEGER к BYTE
|
"t" - типы
|
||||||
"c" - диапазон аргумента функции CHR
|
"i" - индексы
|
||||||
"w" - диапазон аргумента функции WCHR
|
"b" - неявное приведение INTEGER к BYTE
|
||||||
"r" - эквивалентно "bcw"
|
"c" - диапазон аргумента функции CHR
|
||||||
"a" - все проверки
|
"w" - диапазон аргумента функции WCHR
|
||||||
|
"r" - эквивалентно "bcw"
|
||||||
Порядок символов может быть любым. Наличие в строке того или иного
|
"a" - все проверки
|
||||||
символа отключает соответствующую проверку.
|
|
||||||
|
Порядок символов может быть любым. Наличие в строке того или иного
|
||||||
Например: -nochk it - отключить проверку индексов и охрану типа.
|
символа отключает соответствующую проверку.
|
||||||
-nochk a - отключить все отключаемые проверки.
|
|
||||||
|
Например: -nochk it - отключить проверку индексов и охрану типа.
|
||||||
Например:
|
-nochk a - отключить все отключаемые проверки.
|
||||||
|
|
||||||
Compiler.exe "C:\example.ob07" win64con -out "C:\example.exe" -stk 1
|
Например:
|
||||||
Compiler.exe "C:\example.ob07" win64dll -out "C:\example.dll" -nochk pti
|
|
||||||
Compiler "source/Compiler.ob07" linux64exe -out "source/Compiler" -nochk a
|
Compiler.exe "C:\example.ob07" win64con -out "C:\example.exe" -stk 1
|
||||||
|
Compiler.exe "C:\example.ob07" win64dll -out "C:\example.dll" -nochk pti
|
||||||
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
|
Compiler "source/Compiler.ob07" linux64exe -out "source/Compiler" -nochk a
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
В случае успешной компиляции, компилятор передает код завершения 0, иначе 1.
|
||||||
Отличия от оригинала
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
1. Расширен псевдомодуль SYSTEM
|
Отличия от оригинала
|
||||||
2. В идентификаторах допускается символ "_"
|
|
||||||
3. Добавлены системные флаги
|
1. Расширен псевдомодуль SYSTEM
|
||||||
4. Усовершенствован оператор CASE (добавлены константные выражения в
|
2. В идентификаторах допускается символ "_"
|
||||||
метках вариантов и необязательная ветка ELSE)
|
3. Добавлены системные флаги
|
||||||
5. Расширен набор стандартных процедур
|
4. Усовершенствован оператор CASE (добавлены константные выражения в
|
||||||
6. Семантика охраны/проверки типа уточнена для нулевого указателя
|
метках вариантов и необязательная ветка ELSE)
|
||||||
7. Добавлены однострочные комментарии (начинаются с пары символов "//")
|
5. Расширен набор стандартных процедур
|
||||||
8. Разрешено наследование от типа-указателя
|
6. Семантика охраны/проверки типа уточнена для нулевого указателя
|
||||||
9. Добавлен синтаксис для импорта процедур из внешних библиотек
|
7. Добавлены однострочные комментарии (начинаются с пары символов "//")
|
||||||
10. "Строки" можно заключать также в одиночные кавычки: 'строка'
|
8. Разрешено наследование от типа-указателя
|
||||||
11. Добавлен тип WCHAR
|
9. Добавлен синтаксис для импорта процедур из внешних библиотек
|
||||||
12. Добавлена операция конкатенации строковых и символьных констант
|
10. "Строки" можно заключать также в одиночные кавычки: 'строка'
|
||||||
13. Возможен импорт модулей с указанием пути и имени файла
|
11. Добавлен тип WCHAR
|
||||||
14. Добавлен специальный синтаксис для условной компиляции (см. CC.txt)
|
12. Добавлена операция конкатенации строковых и символьных констант
|
||||||
15. Имя процедуры в конце объявления (после END) необязательно
|
13. Возможен импорт модулей с указанием пути и имени файла
|
||||||
|
14. Добавлен специальный синтаксис для условной компиляции (см. CC.txt)
|
||||||
------------------------------------------------------------------------------
|
15. Имя процедуры в конце объявления (после END) необязательно
|
||||||
Особенности реализации
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
1. Основные типы
|
Особенности реализации
|
||||||
|
|
||||||
Тип Диапазон значений Размер, байт
|
1. Основные типы
|
||||||
|
|
||||||
INTEGER -9223372036854775808 .. 9223372036854775807 8
|
Тип Диапазон значений Размер, байт
|
||||||
REAL 4.94E-324 .. 1.70E+308 8
|
|
||||||
CHAR символ ASCII (0X .. 0FFX) 1
|
INTEGER -9223372036854775808 .. 9223372036854775807 8
|
||||||
BOOLEAN FALSE, TRUE 1
|
REAL 4.94E-324 .. 1.70E+308 8
|
||||||
SET множество из целых чисел {0 .. 63} 8
|
CHAR символ ASCII (0X .. 0FFX) 1
|
||||||
BYTE 0 .. 255 1
|
BOOLEAN FALSE, TRUE 1
|
||||||
WCHAR символ юникода (0X .. 0FFFFX) 2
|
SET множество из целых чисел {0 .. 63} 8
|
||||||
|
BYTE 0 .. 255 1
|
||||||
2. Максимальная длина идентификаторов - 255 символов
|
WCHAR символ юникода (0X .. 0FFFFX) 2
|
||||||
3. Максимальная длина строковых констант - 511 символов (UTF-8)
|
|
||||||
4. Максимальная размерность открытых массивов - 5
|
2. Максимальная длина идентификаторов - 255 символов
|
||||||
5. Процедура NEW заполняет нулями выделенный блок памяти
|
3. Максимальная длина строковых констант - 511 символов (UTF-8)
|
||||||
6. Глобальные и локальные переменные инициализируются нулями
|
4. Максимальная размерность открытых массивов - 5
|
||||||
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
|
5. Процедура NEW заполняет нулями выделенный блок памяти
|
||||||
модульность отсутствуют
|
6. Глобальные и локальные переменные инициализируются нулями
|
||||||
8. Тип BYTE в выражениях всегда приводится к INTEGER
|
7. В отличие от многих Oberon-реализаций, сборщик мусора и динамическая
|
||||||
9. Контроль переполнения значений выражений не производится
|
модульность отсутствуют
|
||||||
10. Ошибки времени выполнения:
|
8. Тип BYTE в выражениях всегда приводится к INTEGER
|
||||||
|
9. Контроль переполнения значений выражений не производится
|
||||||
1 ASSERT(x), при x = FALSE
|
10. Ошибки времени выполнения:
|
||||||
2 разыменование нулевого указателя
|
|
||||||
3 целочисленное деление на неположительное число
|
1 ASSERT(x), при x = FALSE
|
||||||
4 вызов процедуры через процедурную переменную с нулевым значением
|
2 разыменование нулевого указателя
|
||||||
5 ошибка охраны типа
|
3 целочисленное деление на неположительное число
|
||||||
6 нарушение границ массива
|
4 вызов процедуры через процедурную переменную с нулевым значением
|
||||||
7 непредусмотренное значение выражения в операторе CASE
|
5 ошибка охраны типа
|
||||||
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x)
|
6 нарушение границ массива
|
||||||
9 CHR(x), если (x < 0) OR (x > 255)
|
7 непредусмотренное значение выражения в операторе CASE
|
||||||
10 WCHR(x), если (x < 0) OR (x > 65535)
|
8 ошибка копирования массивов v := x, если LEN(v) < LEN(x)
|
||||||
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
|
9 CHR(x), если (x < 0) OR (x > 255)
|
||||||
|
10 WCHR(x), если (x < 0) OR (x > 65535)
|
||||||
------------------------------------------------------------------------------
|
11 неявное приведение x:INTEGER к v:BYTE, если (x < 0) OR (x > 255)
|
||||||
Псевдомодуль SYSTEM
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
|
Псевдомодуль SYSTEM
|
||||||
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
|
|
||||||
повреждению данных времени выполнения и аварийному завершению программы.
|
Псевдомодуль SYSTEM содержит низкоуровневые и небезопасные процедуры,
|
||||||
|
ошибки при использовании процедур псевдомодуля SYSTEM могут привести к
|
||||||
PROCEDURE ADR(v: любой тип): INTEGER
|
повреждению данных времени выполнения и аварийному завершению программы.
|
||||||
v - переменная или процедура;
|
|
||||||
возвращает адрес v
|
PROCEDURE ADR(v: любой тип): INTEGER
|
||||||
|
v - переменная или процедура;
|
||||||
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
|
возвращает адрес v
|
||||||
возвращает адрес x
|
|
||||||
|
PROCEDURE SADR(x: строковая константа (CHAR UTF-8)): INTEGER
|
||||||
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
|
возвращает адрес x
|
||||||
возвращает адрес x
|
|
||||||
|
PROCEDURE WSADR(x: строковая константа (WCHAR)): INTEGER
|
||||||
PROCEDURE SIZE(T): INTEGER
|
возвращает адрес x
|
||||||
возвращает размер типа T
|
|
||||||
|
PROCEDURE SIZE(T): INTEGER
|
||||||
PROCEDURE TYPEID(T): INTEGER
|
возвращает размер типа T
|
||||||
T - тип-запись или тип-указатель,
|
|
||||||
возвращает номер типа в таблице типов-записей
|
PROCEDURE TYPEID(T): INTEGER
|
||||||
|
T - тип-запись или тип-указатель,
|
||||||
PROCEDURE INF(): REAL
|
возвращает номер типа в таблице типов-записей
|
||||||
возвращает специальное вещественное значение "бесконечность"
|
|
||||||
|
PROCEDURE INF(): REAL
|
||||||
PROCEDURE MOVE(Source, Dest, n: INTEGER)
|
возвращает специальное вещественное значение "бесконечность"
|
||||||
Копирует n байт памяти из Source в Dest,
|
|
||||||
области Source и Dest не могут перекрываться
|
PROCEDURE MOVE(Source, Dest, n: INTEGER)
|
||||||
|
Копирует n байт памяти из Source в Dest,
|
||||||
PROCEDURE GET(a: INTEGER;
|
области Source и Dest не могут перекрываться
|
||||||
VAR v: любой основной тип, PROCEDURE, POINTER)
|
|
||||||
v := Память[a]
|
PROCEDURE GET(a: INTEGER;
|
||||||
|
VAR v: любой основной тип, PROCEDURE, POINTER)
|
||||||
PROCEDURE GET8(a: INTEGER;
|
v := Память[a]
|
||||||
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
|
||||||
Эквивалентно
|
PROCEDURE GET8(a: INTEGER;
|
||||||
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
|
VAR x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
||||||
|
Эквивалентно
|
||||||
PROCEDURE GET16(a: INTEGER;
|
SYSTEM.MOVE(a, SYSTEM.ADR(x), 1)
|
||||||
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
|
|
||||||
Эквивалентно
|
PROCEDURE GET16(a: INTEGER;
|
||||||
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
|
VAR x: INTEGER, SET, WCHAR, SYSTEM.CARD32)
|
||||||
|
Эквивалентно
|
||||||
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
|
SYSTEM.MOVE(a, SYSTEM.ADR(x), 2)
|
||||||
Эквивалентно
|
|
||||||
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
|
PROCEDURE GET32(a: INTEGER; VAR x: INTEGER, SET, SYSTEM.CARD32)
|
||||||
|
Эквивалентно
|
||||||
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
|
SYSTEM.MOVE(a, SYSTEM.ADR(x), 4)
|
||||||
Память[a] := x;
|
|
||||||
Если x: BYTE или x: WCHAR, то значение x будет расширено
|
PROCEDURE PUT(a: INTEGER; x: любой основной тип, PROCEDURE, POINTER)
|
||||||
до 64 бит, для записи байтов использовать SYSTEM.PUT8,
|
Память[a] := x;
|
||||||
для WCHAR -- SYSTEM.PUT16
|
Если x: BYTE или x: WCHAR, то значение x будет расширено
|
||||||
|
до 64 бит, для записи байтов использовать SYSTEM.PUT8,
|
||||||
PROCEDURE PUT8(a: INTEGER;
|
для WCHAR -- SYSTEM.PUT16
|
||||||
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
|
||||||
Память[a] := младшие 8 бит (x)
|
PROCEDURE PUT8(a: INTEGER;
|
||||||
|
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
||||||
PROCEDURE PUT16(a: INTEGER;
|
Память[a] := младшие 8 бит (x)
|
||||||
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
|
||||||
Память[a] := младшие 16 бит (x)
|
PROCEDURE PUT16(a: INTEGER;
|
||||||
|
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
||||||
PROCEDURE PUT32(a: INTEGER;
|
Память[a] := младшие 16 бит (x)
|
||||||
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
|
||||||
Память[a] := младшие 32 бит (x)
|
PROCEDURE PUT32(a: INTEGER;
|
||||||
|
x: INTEGER, SET, BYTE, CHAR, WCHAR, SYSTEM.CARD32)
|
||||||
PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER)
|
Память[a] := младшие 32 бит (x)
|
||||||
Копирует n байт памяти из Source в Dest.
|
|
||||||
Эквивалентно
|
PROCEDURE COPY(VAR Source: любой тип; VAR Dest: любой тип; n: INTEGER)
|
||||||
SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n)
|
Копирует n байт памяти из Source в Dest.
|
||||||
|
Эквивалентно
|
||||||
PROCEDURE CODE(byte1, byte2,... : BYTE)
|
SYSTEM.MOVE(SYSTEM.ADR(Source), SYSTEM.ADR(Dest), n)
|
||||||
Вставка машинного кода,
|
|
||||||
byte1, byte2 ... - константы в диапазоне 0..255,
|
PROCEDURE CODE(byte1, byte2,... : BYTE)
|
||||||
например:
|
Вставка машинного кода,
|
||||||
|
byte1, byte2 ... - константы в диапазоне 0..255,
|
||||||
SYSTEM.CODE(048H,08BH,045H,010H) (* mov rax,qword[rbp+16] *)
|
например:
|
||||||
|
|
||||||
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не
|
SYSTEM.CODE(048H,08BH,045H,010H) (* mov rax,qword[rbp+16] *)
|
||||||
допускаются никакие явные операции, за исключением присваивания.
|
|
||||||
|
Также, в модуле SYSTEM определен тип CARD32 (4 байта). Для типа CARD32 не
|
||||||
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
|
допускаются никакие явные операции, за исключением присваивания.
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
Функции псевдомодуля SYSTEM нельзя использовать в константных выражениях.
|
||||||
Системные флаги
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
При объявлении процедурных типов и глобальных процедур, после ключевого
|
Системные флаги
|
||||||
слова PROCEDURE может быть указан флаг соглашения о вызове:
|
|
||||||
[win64], [systemv], [windows], [linux], [oberon], [ccall].
|
При объявлении процедурных типов и глобальных процедур, после ключевого
|
||||||
Например:
|
слова PROCEDURE может быть указан флаг соглашения о вызове:
|
||||||
|
[win64], [systemv], [windows], [linux], [oberon], [ccall].
|
||||||
PROCEDURE [win64] MyProc (x, y, z: INTEGER): INTEGER;
|
Например:
|
||||||
|
|
||||||
Флаг [windows] - синоним для [win64], [linux] - синоним для [systemv].
|
PROCEDURE [win64] MyProc (x, y, z: INTEGER): INTEGER;
|
||||||
Флаг [ccall] - синоним для [win64] или [systemv] (зависит от целевой ОС).
|
|
||||||
Знак "-" после имени флага ([win64-], [linux-], ...) означает, что
|
Флаг [windows] - синоним для [win64], [linux] - синоним для [systemv].
|
||||||
результат процедуры можно игнорировать (не допускается для типа REAL).
|
Флаг [ccall] - синоним для [win64] или [systemv] (зависит от целевой ОС).
|
||||||
Если флаг не указан или указан флаг [oberon], то принимается внутреннее
|
Знак "-" после имени флага ([win64-], [linux-], ...) означает, что
|
||||||
соглашение о вызове. [win64] и [systemv] используются для связи с
|
результат процедуры можно игнорировать (не допускается для типа REAL).
|
||||||
операционной системой и внешними приложениями.
|
Если флаг не указан или указан флаг [oberon], то принимается внутреннее
|
||||||
|
соглашение о вызове. [win64] и [systemv] используются для связи с
|
||||||
При объявлении типов-записей, после ключевого слова RECORD может быть
|
операционной системой и внешними приложениями.
|
||||||
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей
|
|
||||||
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть
|
При объявлении типов-записей, после ключевого слова RECORD может быть
|
||||||
базовыми типами для других записей.
|
указан флаг [noalign]. Флаг [noalign] означает отсутствие выравнивания полей
|
||||||
Для использования системных флагов, требуется импортировать SYSTEM.
|
записи. Записи с системным флагом не могут иметь базовый тип и не могут быть
|
||||||
|
базовыми типами для других записей.
|
||||||
------------------------------------------------------------------------------
|
Для использования системных флагов, требуется импортировать SYSTEM.
|
||||||
Оператор CASE
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Синтаксис оператора CASE:
|
Оператор CASE
|
||||||
|
|
||||||
CaseStatement =
|
Синтаксис оператора CASE:
|
||||||
CASE Expression OF Case {"|" Case}
|
|
||||||
[ELSE StatementSequence] END.
|
CaseStatement =
|
||||||
Case = [CaseLabelList ":" StatementSequence].
|
CASE Expression OF Case {"|" Case}
|
||||||
CaseLabelList = CaseLabels {"," CaseLabels}.
|
[ELSE StatementSequence] END.
|
||||||
CaseLabels = ConstExpression [".." ConstExpression].
|
Case = [CaseLabelList ":" StatementSequence].
|
||||||
|
CaseLabelList = CaseLabels {"," CaseLabels}.
|
||||||
Например:
|
CaseLabels = ConstExpression [".." ConstExpression].
|
||||||
|
|
||||||
CASE x OF
|
Например:
|
||||||
|-1: DoSomething1
|
|
||||||
| 1: DoSomething2
|
CASE x OF
|
||||||
| 0: DoSomething3
|
|-1: DoSomething1
|
||||||
ELSE
|
| 1: DoSomething2
|
||||||
DoSomething4
|
| 0: DoSomething3
|
||||||
END
|
ELSE
|
||||||
|
DoSomething4
|
||||||
В метках вариантов можно использовать константные выражения, ветка ELSE
|
END
|
||||||
необязательна. Если значение x не соответствует ни одному варианту и ELSE
|
|
||||||
отсутствует, то программа прерывается с ошибкой времени выполнения.
|
В метках вариантов можно использовать константные выражения, ветка ELSE
|
||||||
|
необязательна. Если значение x не соответствует ни одному варианту и ELSE
|
||||||
------------------------------------------------------------------------------
|
отсутствует, то программа прерывается с ошибкой времени выполнения.
|
||||||
Тип WCHAR
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
|
Тип WCHAR
|
||||||
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
|
|
||||||
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
|
Тип WCHAR добавлен в язык для удобной поддежки юникода. Для типов WCHAR и
|
||||||
только тип CHAR. Для получения значения типа WCHAR, следует использовать
|
ARRAY OF WCHAR допускаются все те же операции, как для типов CHAR и
|
||||||
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
|
ARRAY OF CHAR, за исключением встроенной процедуры CHR, которая возвращает
|
||||||
исходный код в кодировке UTF-8 с BOM.
|
только тип CHAR. Для получения значения типа WCHAR, следует использовать
|
||||||
|
процедуру WCHR вместо CHR. Для правильной работы с типом, необходимо сохранять
|
||||||
------------------------------------------------------------------------------
|
исходный код в кодировке UTF-8 с BOM.
|
||||||
Конкатенация строковых и символьных констант
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Допускается конкатенация ("+") константных строк и символов типа CHAR:
|
Конкатенация строковых и символьных констант
|
||||||
|
|
||||||
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
|
Допускается конкатенация ("+") константных строк и символов типа CHAR:
|
||||||
|
|
||||||
newline = 0DX + 0AX;
|
str = CHR(39) + "string" + CHR(39); (* str = "'string'" *)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
newline = 0DX + 0AX;
|
||||||
Проверка и охрана типа нулевого указателя
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Оригинальное сообщение о языке не определяет поведение программы при
|
Проверка и охрана типа нулевого указателя
|
||||||
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
|
|
||||||
Oberon-реализациях выполнение такой операции приводит к ошибке времени
|
Оригинальное сообщение о языке не определяет поведение программы при
|
||||||
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
|
выполнении охраны p(T) и проверки типа p IS T при p = NIL. Во многих
|
||||||
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
|
Oberon-реализациях выполнение такой операции приводит к ошибке времени
|
||||||
значительно сократить частоту применения охраны типа.
|
выполнения. В данной реализации охрана типа нулевого указателя не приводит к
|
||||||
|
ошибке, а проверка типа дает результат FALSE. В ряде случаев это позволяет
|
||||||
------------------------------------------------------------------------------
|
значительно сократить частоту применения охраны типа.
|
||||||
Дополнительные стандартные процедуры
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
DISPOSE (VAR v: любой_указатель)
|
Дополнительные стандартные процедуры
|
||||||
Освобождает память, выделенную процедурой NEW для
|
|
||||||
динамической переменной v^, и присваивает переменной v
|
DISPOSE (VAR v: любой_указатель)
|
||||||
значение NIL.
|
Освобождает память, выделенную процедурой NEW для
|
||||||
|
динамической переменной v^, и присваивает переменной v
|
||||||
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
|
значение NIL.
|
||||||
v := x;
|
|
||||||
Если LEN(v) < LEN(x), то строка x будет скопирована
|
COPY (x: ARRAY OF CHAR/WCHAR; VAR v: ARRAY OF CHAR/WCHAR);
|
||||||
не полностью
|
v := x;
|
||||||
|
Если LEN(v) < LEN(x), то строка x будет скопирована
|
||||||
LSR (x, n: INTEGER): INTEGER
|
не полностью
|
||||||
Логический сдвиг x на n бит вправо.
|
|
||||||
|
LSR (x, n: INTEGER): INTEGER
|
||||||
MIN (a, b: INTEGER): INTEGER
|
Логический сдвиг x на n бит вправо.
|
||||||
Минимум из двух значений.
|
|
||||||
|
MIN (a, b: INTEGER): INTEGER
|
||||||
MAX (a, b: INTEGER): INTEGER
|
Минимум из двух значений.
|
||||||
Максимум из двух значений.
|
|
||||||
|
MAX (a, b: INTEGER): INTEGER
|
||||||
BITS (x: INTEGER): SET
|
Максимум из двух значений.
|
||||||
Интерпретирует x как значение типа SET.
|
|
||||||
Выполняется на этапе компиляции.
|
BITS (x: INTEGER): SET
|
||||||
|
Интерпретирует x как значение типа SET.
|
||||||
LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
|
Выполняется на этапе компиляции.
|
||||||
Длина 0X-завершенной строки s, без учета символа 0X.
|
|
||||||
Если символ 0X отсутствует, функция возвращает длину
|
LENGTH (s: ARRAY OF CHAR/WCHAR): INTEGER
|
||||||
массива s. s не может быть константой.
|
Длина 0X-завершенной строки s, без учета символа 0X.
|
||||||
|
Если символ 0X отсутствует, функция возвращает длину
|
||||||
WCHR (n: INTEGER): WCHAR
|
массива s. s не может быть константой.
|
||||||
Преобразование типа, аналогично CHR(n: INTEGER): CHAR
|
|
||||||
|
WCHR (n: INTEGER): WCHAR
|
||||||
------------------------------------------------------------------------------
|
Преобразование типа, аналогично CHR(n: INTEGER): CHAR
|
||||||
Импорт модулей с указанием пути и имени файла
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Примеры:
|
Импорт модулей с указанием пути и имени файла
|
||||||
|
|
||||||
IMPORT Math IN "./lib/math.ob07"; (* относительно текущего модуля *)
|
Примеры:
|
||||||
|
|
||||||
IMPORT M1 IN "C:\lib\math.ob07"; (* абсолютный путь *)
|
IMPORT Math IN "./lib/math.ob07"; (* относительно текущего модуля *)
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
IMPORT M1 IN "C:\lib\math.ob07"; (* абсолютный путь *)
|
||||||
Импортированные процедуры
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Синтаксис импорта:
|
Импортированные процедуры
|
||||||
|
|
||||||
PROCEDURE [callconv, library, function] proc_name (FormalParam): Type;
|
Синтаксис импорта:
|
||||||
|
|
||||||
- callconv -- соглашение о вызове
|
PROCEDURE [callconv, library, function] proc_name (FormalParam): Type;
|
||||||
- library -- имя файла динамической библиотеки (строковая константа)
|
|
||||||
- function -- имя импортируемой процедуры (строковая константа), если
|
- callconv -- соглашение о вызове
|
||||||
указана пустая строка, то имя процедуры = proc_name
|
- library -- имя файла динамической библиотеки (строковая константа)
|
||||||
|
- function -- имя импортируемой процедуры (строковая константа), если
|
||||||
например:
|
указана пустая строка, то имя процедуры = proc_name
|
||||||
|
|
||||||
PROCEDURE [windows, "kernel32.dll", "ExitProcess"] exit (code: INTEGER);
|
например:
|
||||||
|
|
||||||
PROCEDURE [windows, "kernel32.dll", ""] GetTickCount (): INTEGER;
|
PROCEDURE [windows, "kernel32.dll", "ExitProcess"] exit (code: INTEGER);
|
||||||
|
|
||||||
В конце объявления может быть добавлено (необязательно) "END proc_name;"
|
PROCEDURE [windows, "kernel32.dll", ""] GetTickCount (): INTEGER;
|
||||||
|
|
||||||
Объявления импортированных процедур должны располагаться в глобальной
|
В конце объявления может быть добавлено (необязательно) "END proc_name;"
|
||||||
области видимости модуля после объявления переменных, вместе с объявлением
|
|
||||||
"обычных" процедур, от которых импортированные отличаются только отсутствием
|
Объявления импортированных процедур должны располагаться в глобальной
|
||||||
тела процедуры. В остальном, к таким процедурам применимы те же правила:
|
области видимости модуля после объявления переменных, вместе с объявлением
|
||||||
их можно вызвать, присвоить процедурной переменной или получить адрес.
|
"обычных" процедур, от которых импортированные отличаются только отсутствием
|
||||||
|
тела процедуры. В остальном, к таким процедурам применимы те же правила:
|
||||||
Так как импортированная процедура всегда имеет явное указание соглашения о
|
их можно вызвать, присвоить процедурной переменной или получить адрес.
|
||||||
вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием
|
|
||||||
соглашения о вызове:
|
Так как импортированная процедура всегда имеет явное указание соглашения о
|
||||||
|
вызове, то совместимый процедурный тип тоже должен быть объявлен с указанием
|
||||||
VAR
|
соглашения о вызове:
|
||||||
ExitProcess: PROCEDURE [windows] (code: INTEGER);
|
|
||||||
|
VAR
|
||||||
Для Linux, импортированные процедуры не реализованы.
|
ExitProcess: PROCEDURE [windows] (code: INTEGER);
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
Для Linux, импортированные процедуры не реализованы.
|
||||||
Скрытые параметры процедур
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
|
Скрытые параметры процедур
|
||||||
формальных параметров, но учитываются компилятором при трансляции вызовов.
|
|
||||||
Это возможно в следующих случаях:
|
Некоторые процедуры могут иметь скрытые параметры, они отсутствуют в списке
|
||||||
|
формальных параметров, но учитываются компилятором при трансляции вызовов.
|
||||||
1. Процедура имеет формальный параметр открытый массив:
|
Это возможно в следующих случаях:
|
||||||
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL);
|
|
||||||
Вызов транслируется так:
|
1. Процедура имеет формальный параметр открытый массив:
|
||||||
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x))
|
PROCEDURE Proc (x: ARRAY OF ARRAY OF REAL);
|
||||||
2. Процедура имеет формальный параметр-переменную типа RECORD:
|
Вызов транслируется так:
|
||||||
PROCEDURE Proc (VAR x: Rec);
|
Proc(LEN(x), LEN(x[0]), SYSTEM.ADR(x))
|
||||||
Вызов транслируется так:
|
2. Процедура имеет формальный параметр-переменную типа RECORD:
|
||||||
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x))
|
PROCEDURE Proc (VAR x: Rec);
|
||||||
|
Вызов транслируется так:
|
||||||
Скрытые параметры необходимо учитывать при связи с внешними приложениями.
|
Proc(SYSTEM.TYPEID(Rec), SYSTEM.ADR(x))
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
Скрытые параметры необходимо учитывать при связи с внешними приложениями.
|
||||||
Модуль RTL
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Все программы неявно используют модуль RTL. Компилятор транслирует
|
Модуль RTL
|
||||||
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об
|
|
||||||
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
|
Все программы неявно используют модуль RTL. Компилятор транслирует
|
||||||
следует вызывать эти процедуры явно.
|
некоторые операции (проверка и охрана типа, сравнение строк, сообщения об
|
||||||
Сообщения об ошибках времени выполнения выводятся в диалоговых окнах
|
ошибках времени выполнения и др.) как вызовы процедур этого модуля. Не
|
||||||
(Windows), в терминал (Linux).
|
следует вызывать эти процедуры явно.
|
||||||
|
Сообщения об ошибках времени выполнения выводятся в диалоговых окнах
|
||||||
------------------------------------------------------------------------------
|
(Windows), в терминал (Linux).
|
||||||
Модуль API
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Существуют несколько реализаций модуля API (для различных ОС).
|
Модуль API
|
||||||
Как и модуль RTL, модуль API не предназначен для прямого использования.
|
|
||||||
Он обеспечивает связь RTL с ОС.
|
Существуют несколько реализаций модуля API (для различных ОС).
|
||||||
|
Как и модуль RTL, модуль API не предназначен для прямого использования.
|
||||||
------------------------------------------------------------------------------
|
Он обеспечивает связь RTL с ОС.
|
||||||
Генерация исполняемых файлов DLL
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
Разрешается экспортировать только процедуры. Для этого, процедура должна
|
Генерация исполняемых файлов DLL
|
||||||
находиться в главном модуле программы, ее имя должно быть отмечено символом
|
|
||||||
экспорта ("*") и должно быть указано соглашение о вызове. Нельзя
|
Разрешается экспортировать только процедуры. Для этого, процедура должна
|
||||||
|
находиться в главном модуле программы, ее имя должно быть отмечено символом
|
||||||
|
экспорта ("*") и должно быть указано соглашение о вызове. Нельзя
|
||||||
экспортировать процедуры, которые импортированы из других dll-библиотек.
|
экспортировать процедуры, которые импортированы из других dll-библиотек.
|
@ -8,7 +8,7 @@
|
|||||||
MODULE Compiler;
|
MODULE Compiler;
|
||||||
|
|
||||||
IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE,
|
IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE,
|
||||||
ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS, SCAN;
|
ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS, SCAN, TEXTDRV;
|
||||||
|
|
||||||
|
|
||||||
CONST
|
CONST
|
||||||
@ -30,6 +30,23 @@ VAR
|
|||||||
major: INTEGER;
|
major: INTEGER;
|
||||||
checking: SET;
|
checking: SET;
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE getVal (VAR i: INTEGER; VAR value: INTEGER);
|
||||||
|
VAR
|
||||||
|
param: PARS.PATH;
|
||||||
|
val: INTEGER;
|
||||||
|
BEGIN
|
||||||
|
INC(i);
|
||||||
|
UTILS.GetArg(i, param);
|
||||||
|
IF STRINGS.StrToInt(param, val) THEN
|
||||||
|
value := val
|
||||||
|
END;
|
||||||
|
IF param[0] = "-" THEN
|
||||||
|
DEC(i)
|
||||||
|
END
|
||||||
|
END getVal;
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
out := "";
|
out := "";
|
||||||
checking := options.checking;
|
checking := options.checking;
|
||||||
@ -57,25 +74,14 @@ BEGIN
|
|||||||
out := param
|
out := param
|
||||||
END
|
END
|
||||||
|
|
||||||
|
ELSIF param = "-tab" THEN
|
||||||
|
getVal(i, options.tab)
|
||||||
|
|
||||||
ELSIF param = "-ram" THEN
|
ELSIF param = "-ram" THEN
|
||||||
INC(i);
|
getVal(i, options.ram)
|
||||||
UTILS.GetArg(i, param);
|
|
||||||
IF STRINGS.StrToInt(param, value) THEN
|
|
||||||
options.ram := value
|
|
||||||
END;
|
|
||||||
IF param[0] = "-" THEN
|
|
||||||
DEC(i)
|
|
||||||
END
|
|
||||||
|
|
||||||
ELSIF param = "-rom" THEN
|
ELSIF param = "-rom" THEN
|
||||||
INC(i);
|
getVal(i, options.rom)
|
||||||
UTILS.GetArg(i, param);
|
|
||||||
IF STRINGS.StrToInt(param, value) THEN
|
|
||||||
options.rom := value
|
|
||||||
END;
|
|
||||||
IF param[0] = "-" THEN
|
|
||||||
DEC(i)
|
|
||||||
END
|
|
||||||
|
|
||||||
ELSIF param = "-nochk" THEN
|
ELSIF param = "-nochk" THEN
|
||||||
INC(i);
|
INC(i);
|
||||||
@ -182,6 +188,7 @@ VAR
|
|||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
options.stack := 2;
|
options.stack := 2;
|
||||||
|
options.tab := TEXTDRV.defTabSize;
|
||||||
options.version := 65536;
|
options.version := 65536;
|
||||||
options.pic := FALSE;
|
options.pic := FALSE;
|
||||||
options.lower := FALSE;
|
options.lower := FALSE;
|
||||||
@ -237,6 +244,7 @@ BEGIN
|
|||||||
C.StringLn(" -ver <major.minor> set version of program (KolibriOS DLL)"); 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(" -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;
|
C.StringLn(" -rom <size> set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
|
||||||
|
C.StringLn(" -tab <width> set width for tabs"); C.Ln;
|
||||||
UTILS.Exit(0)
|
UTILS.Exit(0)
|
||||||
END;
|
END;
|
||||||
|
|
||||||
@ -285,6 +293,7 @@ BEGIN
|
|||||||
STRINGS.append(lib_path, UTILS.slash);
|
STRINGS.append(lib_path, UTILS.slash);
|
||||||
|
|
||||||
keys(options, outname);
|
keys(options, outname);
|
||||||
|
TEXTDRV.setTabSize(options.tab);
|
||||||
IF outname = "" THEN
|
IF outname = "" THEN
|
||||||
outname := path;
|
outname := path;
|
||||||
STRINGS.append(outname, modname);
|
STRINGS.append(outname, modname);
|
||||||
|
@ -1,117 +1,117 @@
|
|||||||
(*
|
(*
|
||||||
BSD 2-Clause License
|
BSD 2-Clause License
|
||||||
|
|
||||||
Copyright (c) 2020, Anton Krotov
|
Copyright (c) 2020, Anton Krotov
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
*)
|
*)
|
||||||
|
|
||||||
MODULE HEX;
|
MODULE HEX;
|
||||||
|
|
||||||
IMPORT WRITER, CHL := CHUNKLISTS, UTILS;
|
IMPORT WRITER, CHL := CHUNKLISTS, UTILS;
|
||||||
|
|
||||||
|
|
||||||
VAR
|
VAR
|
||||||
|
|
||||||
chksum: INTEGER;
|
chksum: INTEGER;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE Byte (byte: BYTE);
|
PROCEDURE Byte (byte: BYTE);
|
||||||
BEGIN
|
BEGIN
|
||||||
WRITER.WriteByte(UTILS.hexdgt(byte DIV 16));
|
WRITER.WriteByte(UTILS.hexdgt(byte DIV 16));
|
||||||
WRITER.WriteByte(UTILS.hexdgt(byte MOD 16));
|
WRITER.WriteByte(UTILS.hexdgt(byte MOD 16));
|
||||||
INC(chksum, byte)
|
INC(chksum, byte)
|
||||||
END Byte;
|
END Byte;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE Byte4 (a, b, c, d: BYTE);
|
PROCEDURE Byte4 (a, b, c, d: BYTE);
|
||||||
BEGIN
|
BEGIN
|
||||||
Byte(a);
|
Byte(a);
|
||||||
Byte(b);
|
Byte(b);
|
||||||
Byte(c);
|
Byte(c);
|
||||||
Byte(d)
|
Byte(d)
|
||||||
END Byte4;
|
END Byte4;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE NewLine;
|
PROCEDURE NewLine;
|
||||||
BEGIN
|
BEGIN
|
||||||
Byte((-chksum) MOD 256);
|
Byte((-chksum) MOD 256);
|
||||||
chksum := 0;
|
chksum := 0;
|
||||||
WRITER.WriteByte(0DH);
|
WRITER.WriteByte(0DH);
|
||||||
WRITER.WriteByte(0AH)
|
WRITER.WriteByte(0AH)
|
||||||
END NewLine;
|
END NewLine;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE StartCode;
|
PROCEDURE StartCode;
|
||||||
BEGIN
|
BEGIN
|
||||||
WRITER.WriteByte(ORD(":"));
|
WRITER.WriteByte(ORD(":"));
|
||||||
chksum := 0
|
chksum := 0
|
||||||
END StartCode;
|
END StartCode;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE Data* (mem: ARRAY OF BYTE; idx, cnt: INTEGER);
|
PROCEDURE Data* (mem: ARRAY OF BYTE; idx, cnt: INTEGER);
|
||||||
VAR
|
VAR
|
||||||
i, len: INTEGER;
|
i, len: INTEGER;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
WHILE cnt > 0 DO
|
WHILE cnt > 0 DO
|
||||||
len := MIN(cnt, 16);
|
len := MIN(cnt, 16);
|
||||||
StartCode;
|
StartCode;
|
||||||
Byte4(len, idx DIV 256, idx MOD 256, 0);
|
Byte4(len, idx DIV 256, idx MOD 256, 0);
|
||||||
FOR i := 1 TO len DO
|
FOR i := 1 TO len DO
|
||||||
Byte(mem[idx]);
|
Byte(mem[idx]);
|
||||||
INC(idx)
|
INC(idx)
|
||||||
END;
|
END;
|
||||||
DEC(cnt, len);
|
DEC(cnt, len);
|
||||||
NewLine
|
NewLine
|
||||||
END
|
END
|
||||||
END Data;
|
END Data;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE ExtLA* (LA: INTEGER);
|
PROCEDURE ExtLA* (LA: INTEGER);
|
||||||
BEGIN
|
BEGIN
|
||||||
ASSERT((0 <= LA) & (LA <= 0FFFFH));
|
ASSERT((0 <= LA) & (LA <= 0FFFFH));
|
||||||
StartCode;
|
StartCode;
|
||||||
Byte4(2, 0, 0, 4);
|
Byte4(2, 0, 0, 4);
|
||||||
Byte(LA DIV 256);
|
Byte(LA DIV 256);
|
||||||
Byte(LA MOD 256);
|
Byte(LA MOD 256);
|
||||||
NewLine
|
NewLine
|
||||||
END ExtLA;
|
END ExtLA;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE Data2* (mem: CHL.BYTELIST; idx, cnt, LA: INTEGER);
|
PROCEDURE Data2* (mem: CHL.BYTELIST; idx, cnt, LA: INTEGER);
|
||||||
VAR
|
VAR
|
||||||
i, len, offset: INTEGER;
|
i, len, offset: INTEGER;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
ExtLA(LA);
|
ExtLA(LA);
|
||||||
offset := 0;
|
offset := 0;
|
||||||
WHILE cnt > 0 DO
|
WHILE cnt > 0 DO
|
||||||
ASSERT(offset <= 65536);
|
ASSERT(offset <= 65536);
|
||||||
IF offset = 65536 THEN
|
IF offset = 65536 THEN
|
||||||
INC(LA);
|
INC(LA);
|
||||||
ExtLA(LA);
|
ExtLA(LA);
|
||||||
offset := 0
|
offset := 0
|
||||||
END;
|
END;
|
||||||
len := MIN(cnt, 16);
|
len := MIN(cnt, 16);
|
||||||
StartCode;
|
StartCode;
|
||||||
Byte4(len, offset DIV 256, offset MOD 256, 0);
|
Byte4(len, offset DIV 256, offset MOD 256, 0);
|
||||||
FOR i := 1 TO len DO
|
FOR i := 1 TO len DO
|
||||||
Byte(CHL.GetByte(mem, idx));
|
Byte(CHL.GetByte(mem, idx));
|
||||||
INC(idx);
|
INC(idx);
|
||||||
INC(offset)
|
INC(offset)
|
||||||
END;
|
END;
|
||||||
DEC(cnt, len);
|
DEC(cnt, len);
|
||||||
NewLine
|
NewLine
|
||||||
END
|
END
|
||||||
END Data2;
|
END Data2;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE End*;
|
PROCEDURE End*;
|
||||||
BEGIN
|
BEGIN
|
||||||
StartCode;
|
StartCode;
|
||||||
Byte4(0, 0, 0, 1);
|
Byte4(0, 0, 0, 1);
|
||||||
NewLine
|
NewLine
|
||||||
END End;
|
END End;
|
||||||
|
|
||||||
|
|
||||||
END HEX.
|
END HEX.
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -71,7 +71,7 @@ TYPE
|
|||||||
|
|
||||||
OPTIONS* = RECORD
|
OPTIONS* = RECORD
|
||||||
|
|
||||||
version*, stack*, ram*, rom*: INTEGER;
|
version*, stack*, ram*, rom*, tab*: INTEGER;
|
||||||
pic*, lower*: BOOLEAN;
|
pic*, lower*: BOOLEAN;
|
||||||
checking*: SET
|
checking*: SET
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,153 +1,153 @@
|
|||||||
(*
|
(*
|
||||||
BSD 2-Clause License
|
BSD 2-Clause License
|
||||||
|
|
||||||
Copyright (c) 2019-2021, Anton Krotov
|
Copyright (c) 2019-2021, Anton Krotov
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
*)
|
*)
|
||||||
|
|
||||||
MODULE TARGETS;
|
MODULE TARGETS;
|
||||||
|
|
||||||
IMPORT UTILS;
|
IMPORT UTILS;
|
||||||
|
|
||||||
|
|
||||||
CONST
|
CONST
|
||||||
|
|
||||||
MSP430* = 0;
|
MSP430* = 0;
|
||||||
Win32C* = 1;
|
Win32C* = 1;
|
||||||
Win32GUI* = 2;
|
Win32GUI* = 2;
|
||||||
Win32DLL* = 3;
|
Win32DLL* = 3;
|
||||||
KolibriOS* = 4;
|
KolibriOS* = 4;
|
||||||
KolibriOSDLL* = 5;
|
KolibriOSDLL* = 5;
|
||||||
Win64C* = 6;
|
Win64C* = 6;
|
||||||
Win64GUI* = 7;
|
Win64GUI* = 7;
|
||||||
Win64DLL* = 8;
|
Win64DLL* = 8;
|
||||||
Linux32* = 9;
|
Linux32* = 9;
|
||||||
Linux32SO* = 10;
|
Linux32SO* = 10;
|
||||||
Linux64* = 11;
|
Linux64* = 11;
|
||||||
Linux64SO* = 12;
|
Linux64SO* = 12;
|
||||||
STM32CM3* = 13;
|
STM32CM3* = 13;
|
||||||
RVM32I* = 14;
|
RVM32I* = 14;
|
||||||
RVM64I* = 15;
|
RVM64I* = 15;
|
||||||
|
|
||||||
cpuX86* = 0; cpuAMD64* = 1; cpuMSP430* = 2; cpuTHUMB* = 3;
|
cpuX86* = 0; cpuAMD64* = 1; cpuMSP430* = 2; cpuTHUMB* = 3;
|
||||||
cpuRVM32I* = 4; cpuRVM64I* = 5;
|
cpuRVM32I* = 4; cpuRVM64I* = 5;
|
||||||
|
|
||||||
osNONE* = 0; osWIN32* = 1; osWIN64* = 2;
|
osNONE* = 0; osWIN32* = 1; osWIN64* = 2;
|
||||||
osLINUX32* = 3; osLINUX64* = 4; osKOS* = 5;
|
osLINUX32* = 3; osLINUX64* = 4; osKOS* = 5;
|
||||||
|
|
||||||
noDISPOSE = {MSP430, STM32CM3, RVM32I, RVM64I};
|
noDISPOSE = {MSP430, STM32CM3, RVM32I, RVM64I};
|
||||||
|
|
||||||
noRTL = {MSP430};
|
noRTL = {MSP430};
|
||||||
|
|
||||||
libRVM32I = "RVMxI" + UTILS.slash + "32";
|
libRVM32I = "RVMxI" + UTILS.slash + "32";
|
||||||
libRVM64I = "RVMxI" + UTILS.slash + "64";
|
libRVM64I = "RVMxI" + UTILS.slash + "64";
|
||||||
|
|
||||||
|
|
||||||
TYPE
|
TYPE
|
||||||
|
|
||||||
STRING = ARRAY 32 OF CHAR;
|
STRING = ARRAY 32 OF CHAR;
|
||||||
|
|
||||||
TARGET = RECORD
|
TARGET = RECORD
|
||||||
|
|
||||||
target, CPU, OS, RealSize: INTEGER;
|
target, CPU, OS, RealSize: INTEGER;
|
||||||
ComLinePar*, LibDir, FileExt: STRING
|
ComLinePar*, LibDir, FileExt: STRING
|
||||||
|
|
||||||
END;
|
END;
|
||||||
|
|
||||||
|
|
||||||
VAR
|
VAR
|
||||||
|
|
||||||
Targets*: ARRAY 16 OF TARGET;
|
Targets*: ARRAY 16 OF TARGET;
|
||||||
|
|
||||||
CPUs: ARRAY 6 OF
|
CPUs: ARRAY 6 OF
|
||||||
RECORD
|
RECORD
|
||||||
BitDepth, InstrSize: INTEGER;
|
BitDepth, InstrSize: INTEGER;
|
||||||
LittleEndian: BOOLEAN
|
LittleEndian: BOOLEAN
|
||||||
END;
|
END;
|
||||||
|
|
||||||
target*, CPU*, BitDepth*, OS*, RealSize*, WordSize*, AdrSize*, InstrSize*: INTEGER;
|
target*, CPU*, BitDepth*, OS*, RealSize*, WordSize*, AdrSize*, InstrSize*: INTEGER;
|
||||||
ComLinePar*, LibDir*, FileExt*: STRING;
|
ComLinePar*, LibDir*, FileExt*: STRING;
|
||||||
Import*, Dispose*, RTL*, Dll*, LittleEndian*: BOOLEAN;
|
Import*, Dispose*, RTL*, Dll*, LittleEndian*: BOOLEAN;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE Enter (idx, CPU, RealSize, OS: INTEGER; ComLinePar, LibDir, FileExt: STRING);
|
PROCEDURE Enter (idx, CPU, RealSize, OS: INTEGER; ComLinePar, LibDir, FileExt: STRING);
|
||||||
BEGIN
|
BEGIN
|
||||||
Targets[idx].target := idx;
|
Targets[idx].target := idx;
|
||||||
Targets[idx].CPU := CPU;
|
Targets[idx].CPU := CPU;
|
||||||
Targets[idx].RealSize := RealSize;
|
Targets[idx].RealSize := RealSize;
|
||||||
Targets[idx].OS := OS;
|
Targets[idx].OS := OS;
|
||||||
Targets[idx].ComLinePar := ComLinePar;
|
Targets[idx].ComLinePar := ComLinePar;
|
||||||
Targets[idx].LibDir := LibDir;
|
Targets[idx].LibDir := LibDir;
|
||||||
Targets[idx].FileExt := FileExt;
|
Targets[idx].FileExt := FileExt;
|
||||||
END Enter;
|
END Enter;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE Select* (ComLineParam: ARRAY OF CHAR): BOOLEAN;
|
PROCEDURE Select* (ComLineParam: ARRAY OF CHAR): BOOLEAN;
|
||||||
VAR
|
VAR
|
||||||
i: INTEGER;
|
i: INTEGER;
|
||||||
res: BOOLEAN;
|
res: BOOLEAN;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
i := 0;
|
i := 0;
|
||||||
WHILE (i < LEN(Targets)) & (Targets[i].ComLinePar # ComLineParam) DO
|
WHILE (i < LEN(Targets)) & (Targets[i].ComLinePar # ComLineParam) DO
|
||||||
INC(i)
|
INC(i)
|
||||||
END;
|
END;
|
||||||
|
|
||||||
res := i < LEN(Targets);
|
res := i < LEN(Targets);
|
||||||
IF res THEN
|
IF res THEN
|
||||||
target := Targets[i].target;
|
target := Targets[i].target;
|
||||||
CPU := Targets[i].CPU;
|
CPU := Targets[i].CPU;
|
||||||
BitDepth := CPUs[CPU].BitDepth;
|
BitDepth := CPUs[CPU].BitDepth;
|
||||||
InstrSize := CPUs[CPU].InstrSize;
|
InstrSize := CPUs[CPU].InstrSize;
|
||||||
LittleEndian := CPUs[CPU].LittleEndian;
|
LittleEndian := CPUs[CPU].LittleEndian;
|
||||||
RealSize := Targets[i].RealSize;
|
RealSize := Targets[i].RealSize;
|
||||||
OS := Targets[i].OS;
|
OS := Targets[i].OS;
|
||||||
ComLinePar := Targets[i].ComLinePar;
|
ComLinePar := Targets[i].ComLinePar;
|
||||||
LibDir := Targets[i].LibDir;
|
LibDir := Targets[i].LibDir;
|
||||||
FileExt := Targets[i].FileExt;
|
FileExt := Targets[i].FileExt;
|
||||||
|
|
||||||
Import := OS IN {osWIN32, osWIN64, osKOS};
|
Import := OS IN {osWIN32, osWIN64, osKOS};
|
||||||
Dispose := ~(target IN noDISPOSE);
|
Dispose := ~(target IN noDISPOSE);
|
||||||
RTL := ~(target IN noRTL);
|
RTL := ~(target IN noRTL);
|
||||||
Dll := target IN {Linux32SO, Linux64SO, Win32DLL, Win64DLL, KolibriOSDLL};
|
Dll := target IN {Linux32SO, Linux64SO, Win32DLL, Win64DLL, KolibriOSDLL};
|
||||||
WordSize := BitDepth DIV 8;
|
WordSize := BitDepth DIV 8;
|
||||||
AdrSize := WordSize
|
AdrSize := WordSize
|
||||||
END
|
END
|
||||||
|
|
||||||
RETURN res
|
RETURN res
|
||||||
END Select;
|
END Select;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE EnterCPU (cpu, BitDepth, InstrSize: INTEGER; LittleEndian: BOOLEAN);
|
PROCEDURE EnterCPU (cpu, BitDepth, InstrSize: INTEGER; LittleEndian: BOOLEAN);
|
||||||
BEGIN
|
BEGIN
|
||||||
CPUs[cpu].BitDepth := BitDepth;
|
CPUs[cpu].BitDepth := BitDepth;
|
||||||
CPUs[cpu].InstrSize := InstrSize;
|
CPUs[cpu].InstrSize := InstrSize;
|
||||||
CPUs[cpu].LittleEndian := LittleEndian
|
CPUs[cpu].LittleEndian := LittleEndian
|
||||||
END EnterCPU;
|
END EnterCPU;
|
||||||
|
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
EnterCPU(cpuX86, 32, 1, TRUE);
|
EnterCPU(cpuX86, 32, 1, TRUE);
|
||||||
EnterCPU(cpuAMD64, 64, 1, TRUE);
|
EnterCPU(cpuAMD64, 64, 1, TRUE);
|
||||||
EnterCPU(cpuMSP430, 16, 2, TRUE);
|
EnterCPU(cpuMSP430, 16, 2, TRUE);
|
||||||
EnterCPU(cpuTHUMB, 32, 2, TRUE);
|
EnterCPU(cpuTHUMB, 32, 2, TRUE);
|
||||||
EnterCPU(cpuRVM32I, 32, 4, TRUE);
|
EnterCPU(cpuRVM32I, 32, 4, TRUE);
|
||||||
EnterCPU(cpuRVM64I, 64, 8, TRUE);
|
EnterCPU(cpuRVM64I, 64, 8, TRUE);
|
||||||
|
|
||||||
Enter( MSP430, cpuMSP430, 0, osNONE, "msp430", "MSP430", ".hex");
|
Enter( MSP430, cpuMSP430, 0, osNONE, "msp430", "MSP430", ".hex");
|
||||||
Enter( Win32C, cpuX86, 8, osWIN32, "win32con", "Windows", ".exe");
|
Enter( Win32C, cpuX86, 8, osWIN32, "win32con", "Windows", ".exe");
|
||||||
Enter( Win32GUI, cpuX86, 8, osWIN32, "win32gui", "Windows", ".exe");
|
Enter( Win32GUI, cpuX86, 8, osWIN32, "win32gui", "Windows", ".exe");
|
||||||
Enter( Win32DLL, cpuX86, 8, osWIN32, "win32dll", "Windows", ".dll");
|
Enter( Win32DLL, cpuX86, 8, osWIN32, "win32dll", "Windows", ".dll");
|
||||||
Enter( KolibriOS, cpuX86, 8, osKOS, "kosexe", "KolibriOS", "");
|
Enter( KolibriOS, cpuX86, 8, osKOS, "kosexe", "KolibriOS", "");
|
||||||
Enter( KolibriOSDLL, cpuX86, 8, osKOS, "kosdll", "KolibriOS", ".obj");
|
Enter( KolibriOSDLL, cpuX86, 8, osKOS, "kosdll", "KolibriOS", ".obj");
|
||||||
Enter( Win64C, cpuAMD64, 8, osWIN64, "win64con", "Windows", ".exe");
|
Enter( Win64C, cpuAMD64, 8, osWIN64, "win64con", "Windows", ".exe");
|
||||||
Enter( Win64GUI, cpuAMD64, 8, osWIN64, "win64gui", "Windows", ".exe");
|
Enter( Win64GUI, cpuAMD64, 8, osWIN64, "win64gui", "Windows", ".exe");
|
||||||
Enter( Win64DLL, cpuAMD64, 8, osWIN64, "win64dll", "Windows", ".dll");
|
Enter( Win64DLL, cpuAMD64, 8, osWIN64, "win64dll", "Windows", ".dll");
|
||||||
Enter( Linux32, cpuX86, 8, osLINUX32, "linux32exe", "Linux", "");
|
Enter( Linux32, cpuX86, 8, osLINUX32, "linux32exe", "Linux", "");
|
||||||
Enter( Linux32SO, cpuX86, 8, osLINUX32, "linux32so", "Linux", ".so");
|
Enter( Linux32SO, cpuX86, 8, osLINUX32, "linux32so", "Linux", ".so");
|
||||||
Enter( Linux64, cpuAMD64, 8, osLINUX64, "linux64exe", "Linux", "");
|
Enter( Linux64, cpuAMD64, 8, osLINUX64, "linux64exe", "Linux", "");
|
||||||
Enter( Linux64SO, cpuAMD64, 8, osLINUX64, "linux64so", "Linux", ".so");
|
Enter( Linux64SO, cpuAMD64, 8, osLINUX64, "linux64so", "Linux", ".so");
|
||||||
Enter( STM32CM3, cpuTHUMB, 4, osNONE, "stm32cm3", "STM32CM3", ".hex");
|
Enter( STM32CM3, cpuTHUMB, 4, osNONE, "stm32cm3", "STM32CM3", ".hex");
|
||||||
Enter( RVM32I, cpuRVM32I, 4, osNONE, "rvm32i", libRVM32I, ".bin");
|
Enter( RVM32I, cpuRVM32I, 4, osNONE, "rvm32i", libRVM32I, ".bin");
|
||||||
Enter( RVM64I, cpuRVM64I, 8, osNONE, "rvm64i", libRVM64I, ".bin");
|
Enter( RVM64I, cpuRVM64I, 8, osNONE, "rvm64i", libRVM64I, ".bin");
|
||||||
END TARGETS.
|
END TARGETS.
|
@ -1,7 +1,7 @@
|
|||||||
(*
|
(*
|
||||||
BSD 2-Clause License
|
BSD 2-Clause License
|
||||||
|
|
||||||
Copyright (c) 2018-2020, Anton Krotov
|
Copyright (c) 2018-2021, Anton Krotov
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
*)
|
*)
|
||||||
|
|
||||||
@ -12,10 +12,12 @@ IMPORT FILES, C := COLLECTIONS;
|
|||||||
|
|
||||||
CONST
|
CONST
|
||||||
|
|
||||||
CR = 0DX; LF = 0AX;
|
CR = 0DX; LF = 0AX; HT = 9X;
|
||||||
|
|
||||||
CHUNK = 1024 * 256;
|
CHUNK = 1024 * 256;
|
||||||
|
|
||||||
|
defTabSize* = 4;
|
||||||
|
|
||||||
|
|
||||||
TYPE
|
TYPE
|
||||||
|
|
||||||
@ -45,6 +47,7 @@ TYPE
|
|||||||
VAR
|
VAR
|
||||||
|
|
||||||
texts: C.COLLECTION;
|
texts: C.COLLECTION;
|
||||||
|
TabSize: INTEGER;
|
||||||
|
|
||||||
|
|
||||||
PROCEDURE load (text: TEXT);
|
PROCEDURE load (text: TEXT);
|
||||||
@ -91,8 +94,11 @@ BEGIN
|
|||||||
text.eol := FALSE
|
text.eol := FALSE
|
||||||
END;
|
END;
|
||||||
text.CR := FALSE
|
text.CR := FALSE
|
||||||
|
ELSIF c = HT THEN
|
||||||
|
text.col := text.col + TabSize - text.col MOD TabSize;
|
||||||
|
text.eol := FALSE;
|
||||||
|
text.CR := FALSE
|
||||||
ELSE
|
ELSE
|
||||||
text.eol := FALSE;
|
|
||||||
IF text.utf8 THEN
|
IF text.utf8 THEN
|
||||||
IF ORD(c) DIV 64 # 2 THEN
|
IF ORD(c) DIV 64 # 2 THEN
|
||||||
INC(text.col)
|
INC(text.col)
|
||||||
@ -100,7 +106,8 @@ BEGIN
|
|||||||
ELSE
|
ELSE
|
||||||
INC(text.col)
|
INC(text.col)
|
||||||
END;
|
END;
|
||||||
text.CR := FALSE
|
text.eol := FALSE;
|
||||||
|
text.CR := FALSE
|
||||||
END
|
END
|
||||||
|
|
||||||
END
|
END
|
||||||
@ -187,6 +194,17 @@ BEGIN
|
|||||||
END open;
|
END open;
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE setTabSize* (n: INTEGER);
|
||||||
BEGIN
|
BEGIN
|
||||||
|
IF (0 < n) & (n <= 64) THEN
|
||||||
|
TabSize := n
|
||||||
|
ELSE
|
||||||
|
TabSize := defTabSize
|
||||||
|
END
|
||||||
|
END setTabSize;
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
TabSize := defTabSize;
|
||||||
texts := C.create()
|
texts := C.create()
|
||||||
END TEXTDRV.
|
END TEXTDRV.
|
File diff suppressed because it is too large
Load Diff
@ -23,8 +23,8 @@ CONST
|
|||||||
max32* = 2147483647;
|
max32* = 2147483647;
|
||||||
|
|
||||||
vMajor* = 1;
|
vMajor* = 1;
|
||||||
vMinor* = 52;
|
vMinor* = 53;
|
||||||
Date* = "07-may-2021";
|
Date* = "26-aug-2021";
|
||||||
|
|
||||||
FILE_EXT* = ".ob07";
|
FILE_EXT* = ".ob07";
|
||||||
RTL_NAME* = "RTL";
|
RTL_NAME* = "RTL";
|
||||||
|
Loading…
Reference in New Issue
Block a user