Oberon07: v1.53

git-svn-id: svn://kolibrios.org@9177 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Anton Krotov 2021-09-03 17:21:37 +00:00
parent e861f97224
commit ce8fecbc6b
16 changed files with 8639 additions and 8608 deletions

Binary file not shown.

View File

@ -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.

View File

@ -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-библиотек.

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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";