Wizard BASIC, v1.0, описание
Posted on

Wizard BASIC — компилируемый высокоуровневый язык программирования.
Исходники
Файлы исходного кода должны быть в кодировке ASCII.
Ключевые слова
10 ключевых слов:
function go if label let procedure string then to use
Типы
Числа
Тип: с плавающей запятой, 4 байт.
Копирование: по значению.
Хранение: на стеке.
Определение: ? /\d+(\.\d+)?/i ?.
Логические значения
В качестве ложного логического значения принимается число 0.
В качестве истинного логического значения принимаются числа, отличные от 0.
Массивы
Тип: динамический массив; доступ по хэндлеру; хэндлер представляет собой число (см. выше).
Копирование: хендлера — по значению.
Хранение:
- хэндлера — на стеке;
- массива — в куче.
Строки
Строками являются массивы, хранящие коды символов. Используется кодировка ASCII.
Определение: оператор
"string", identifier, "=", ? /"(\\.|[^"])*"/ ?, line break.
Файлы
Тип: файлы ОС; доступ по хэндлеру; хэндлер представляет собой число (см. выше).
Копирование: хендлера — по значению.
Хранение: хендлера — на стеке.
Операции
Перечислены в порядке убывания приоритета.
| Приоритет | Операция | Описание | Ассоциативность |
|---|---|---|---|
| 1 | ! |
логическое отрицание | правая |
| 2 | * |
умножение | левая |
| 2 | / |
деление | левая |
| 3 | + |
сложение | левая |
| 3 | - |
вычитание | левая |
| 3 | $ |
конкатенация массивов | левая |
| 4 | < |
меньше | левая |
| 4 | > |
больше | левая |
| 5 | = |
равенство | левая |
| 6 | & |
конъюнкция | левая |
| 7 | | |
дизъюнкция | левая |
Вызов функции
identifier, "(", [expression, {",", expression}], ")"
Является выражением.
Объявление переменных и присваивание
"let", identifier, "=", expression, line break
Оператор.
Управляющие конструкции
Метки
Объявление: оператор "label", identifier, line break.
Переход: оператор "go", "to", identifier, line break.
Условие
"if", expression, "then", line break,
statement, line break
Оператор.
Внешние библиотеки
Подключение: оператор "use", string, line break, где string —
относительный путь к библиотеке.
Если библиотека расположена по стандартному пути, его можно опустить. Путь может быть предварён строкой linux: или windows:, в этом случае данная библиотека будет подключена только при сборке на соответствующей ОС. Имя библиотеки может указываться в сокращённом варианте (Name вместо libName.a). Стандартные библиотеки языков C и C++ подключаются автоматически.
Импорт процедур: оператор "procedure", identifier, "/", number, line break;
number — число параметров.
Импорт функций: оператор "function", identifier, "/", number, line break;
number — число параметров.
Внимание! Из-за особенностей компилятора при вызове внешней процедуры или функции параметры ей передаются в обратном порядке!
Полная грамматика
program = statement list;
statement list = statement, {statement};
statement =
library linking
| procedure declaration
| function declaration
| string declaration
| label declaration
| assignment
| jump
| condition
| function call;
library linking = "use", string, line break;
procedure declaration = "procedure", identifier, "/", number, line break;
function declaration = "function", identifier, "/", number, line break;
string declaration = "string", identifier, "=", string, line break;
label declaration = "label", identifier, line break;
assignment = "let", identifier, "=", expression, line break;
jump = "go", "to", identifier, line break;
condition =
"if", expression, "then", line break,
statement, line break;
expression = disjunction;
disjunction = conjunction, {"|", conjunction};
conjunction = equality, {"&", equality};
equality = comparison, {"=", comparison};
comparison = sum, {("<" | ">"), sum};
sum = product, {("+" | "-" | "$"), product};
product = unary, {("*" | "/"), unary};
unary = {"!"}, atom;
atom = number | identifier | function call | ("(", expression, ")");
function call = identifier, "(", [expression, {",", expression}], ")";
number = ? /\d+(\.\d+)?/ ?;
string = ? /"(\\.|[^"])*"/ ?;
identifier = ? /[a-z_]\w*/i ?;
line break = "\n";
Стандартная библиотека
Модуль Array
Процедуры
ArrayDelete(array_id)— удаляет массив из памяти;ArrayItemSet(array_id, index, value);ArrayItemInsert(array_id, index, value);ArrayItemAppend(array_id, value);ArrayItemRemove(array_id, index).
Функции
ArrayCreate(size);ToString(number)— преобразует число в строку;ToNumber(array_id)— парсит число из строки;c_string(array_id)— преобразует строку в строку языка C; данная функция должна использоваться только для преобразования строк при передаче их во внешние функции; сохранять результат этой функции в переменной нельзя;ArrayGetSize(array_id);ArrayItemGet(array_id, index).
Модуль IO
Константы
FILE_OPEN_MODE_READ = 0;FILE_OPEN_MODE_APPEND = 1;FILE_OPEN_MODE_REWRITE = 2;FILE_OPEN_ERROR = -1;APP_PATH— путь к исполняемому файлу;NEW_LINE = "\n";PATH_SEPARATOR:"/"на Linux;"\\"на Windows.
Процедуры
Show(string_id)— выводит строку в консоль;FileClose(file_id);FileRemove(filename_id)— удаляет файл с жёсткого диска;FileWrite(file_id, array_id).
Функции
FileOpen(filename_id, mode);FileRead(file_id, number_of_bytes);FileReadAll(file_id).
Модуль Maths
Константы
FALSE = 0;TRUE = 1;PI = 3.14159;E = 2.71828.
Функции
MathsSin(number);MathsCos(number);MathsTg(number);MathsArcsin(number);MathsArccos(number);MathsArctg(number);MathsExp(number);MathsLn(number);MathsLg(number);MathsModulus(number);MathsPower(base, exponent);MathsIntegral(number)— возвращает целую часть числа;MathsSquareRoot(number);MathsAngle(x, y)—atan2;MathsRandom(minimum, maximum).
Модуль System
Константы
OS_LINUX = 1;OS_WINDOWS = 0.
Процедуры
TimerStart();Exit().
Функции
GetOs();TimerGetElapsedTimeInUs().