World Conquest Chronicles

World Conquest Chronicles

Wizard BASIC 3, v0.1, описание

Скриншот примера кода и подсветки синтаксиса

Wizard BASIC 3 — компилируемый высокоуровневый язык программирования. Поддерживает структурную парадигму, обладает строгой динамической типизацией и сборкой мусора.

Исходники

Файлы исходного кода должны быть в кодировке ASCII.

Ключевые слова

19 ключевых слов: and, break, continue, do, else, end, function, if, include, let, new, not, note, NULL, or, return, structure, then, while.

Типы

Типизация: строгая динамическая.

Менеджмент памяти: сборка мусора.

Нулевой тип

Название: null.

Тип: фиктивный тип; не хранит значение, а служит маркером его отсутствия.

Копирование: по значению.

Хранение: на стеке.

Определение: "NULL".

Числа

Название: number.

Тип: с плавающей запятой, 8 байт.

Копирование: по значению.

Хранение: на стеке.

Определение:

? /'(\.|[^'])'/ ?
? /\d+(\.\d+)?/ ?

Массивы

Название: array.

Тип: динамический массив.

Копирование: по ссылке.

Хранение:

  • ссылки — на стеке;
  • значения — в куче.

Определение:

"new", "array", "(", expression, ")"
"[", [expression, {",", expression}], "]"

Доступ к элементам: expression, "[", expression, "]".

Строки

Строками являются массивы, хранящие коды символов. Используется кодировка ASCII.

Определение: ? /"(\.|[^"])*"/ ?.

Структуры

Название: задаётся программистом.

Копирование: по ссылке.

Хранение:

  • ссылки — на стеке;
  • значения — в куче.

Объявление:

"structure", identifier,
    identifier,
    {identifier},
"end"

Может располагаться только в глобальной области видимости.

Определение: "new", identifier.

Доступ к полям: expression, ".", identifier.

Логические значения

В качестве ложного логического значения принимаются число 0 и значение NULL.

В качестве истинного логического значения принимаются числа, отличные от 0, и любые ссылки на массивы и структуры.

Операции

Перечислены в порядке убывания приоритета.

Приоритет Операция Описание Ассоциативность Типы Особенности
1 [] доступ к элементам массива левая массивы
1 . доступ к полям структур левая структуры
2 new определение структур идентификаторы структур
2 - унарный минус правая числа
2 not логическое отрицание правая все
3 * умножение левая числа
3 / деление левая числа
3 % остаток от деления левая числа
4 + сложение левая числа
4 - вычитание левая числа
5 < меньше левая числа
5 <= меньше или равно левая числа
5 > больше левая числа
5 >= больше или равно левая числа
6 == равенство левая все при сравнении массивов и структур сравнивает ссылки
6 /= неравенство левая все при сравнении массивов и структур сравнивает ссылки
7 and логическое и левая все
8 or логическое или левая все

Переменные

Объявление и определение: "let", identifier, "=", expression.

Присваивание

expression, "=", expression

В качестве левого expression могут использоваться переменные, элементы массивов и поля структур.

Управляющие конструкции

Условие

"if", expression, "then",
    statement,
    {statement},
{"else", "if", expression, "then",
    statement,
    {statement}},
["else",
    statement,
    {statement}],
"end"

Цикл

"while", expression, "do",
    statement,
    {statement},
"end"

Переход к следующей итерации цикла: continue.

Прерывание цикла: break.

Функции

Объявление:

"function", identifier, "(", [identifier, {",", identifier}], ")",
    statement,
    {statement},
"end"

Может располагаться только в глобальной области видимости.

Перегрузка функций не поддерживается.

Возврат из функции: "return", [expression]. По умолчанию возвращается NULL.

Вызов функции: identifier, "(", [expression, {",", expression}], ")". При вызове функции проверяется соответствие числа аргументов числу параметров.

Точка входа

function Main(arguments)

В arguments передаются аргументы командной строки. В arguments[0] передаётся путь к исполняемому файлу.

Комментарии

Однострочные: ? /^\s*note[^\n]*\n/ ?.

Многострочные: ? /^\s*long\s+note.*?\.\.\.\s*$/ ?.

Модульность

Тип: включением кода как текста.

Использование: "include", expression.

В качестве expression может использоваться лишь определение строки. Строка должна содержать относительный путь к файлу с кодом.

Файлы включаются рекурсивно, и каждый только один раз.

Полная грамматика

program =
    variable definition
    | structure declaration
    | function declaration;

variable definition = "let", identifier, "=", expression;
structure declaration =
    "structure", identifier,
        identifier,
        {identifier},
    "end";
function declaration =
    "function", identifier, "(", [identifier, {",", identifier}], ")",
        statement list,
    "end";

statement list = statement, {statement};
statement =
    variable definition
    | assignment
    | condition
    | loop
    | loop continue
    | loop break
    | function return
    | expression;

assignment = expression, "=", expression;
condition =
    "if", expression, "then",
        statement list,
    {"else", "if", expression, "then",
        statement list},
    ["else",
        statement list],
    "end";
loop =
    "while", expression, "do",
        statement list,
    "end";
loop continue = "continue";
loop break = "break";
function return = "return", [expression];

expression = disjunction;
disjunction = conjunction, {"or", conjunction};
conjunction = equality, {"and", equality};
equality = comparison, {("==" | "/="), comparison};
comparison = sum, {("<" | "<=" | ">" | ">="), sum};
sum = product, {("+" | "-"), product};
product = unary, {("*" | "/" | "%"), unary};
unary =
    ("new", identifier)
    | array sized definition
    | ({"-" | "not"}, accessor);

array sized definition = "new", "array", "(", expression, ")";
accessor = atom, {array item access | structure field access};
array item access = "[", expression, "]";
structure field access = ".", identifier;

atom =
    null definition
    | number
    | identifier
    | array listed definition
    | string definition
    | function call
    | ("(", expression, ")");
array listed definition = "[", [expression, {",", expression}], "]";
function call = identifier, "(", [expression, {",", expression}], ")";

null definition = "NULL";
number = ? /'(\.|[^'])'/ ? | ? /\d+(\.\d+)?/ ?;
identifier = ? /[a-z_]\w*/i ? - key words;
string definition = ? /"(\.|[^"])*"/ ?;

key words =
    "and"
    | "break"
    | "continue"
    | "do"
    | "else"
    | "end"
    | "function"
    | "if"
    | "include"
    | "let"
    | "new"
    | "not"
    | "NULL"
    | "or"
    | "return"
    | "structure"
    | "then"
    | "while";

Рантайм

Модуль lang

  • ToString(number, precision);
  • GetLength(array);
  • GetType(value) — возвращает имя типа переданного значения.

Модуль system

  • GetTime();
  • Exit(exit_code).
Модуль system.io
  • Read(stream_id, number_of_bytes);
  • Write(stream_id, bytes);
  • Open(path, mode) — режим открытия может быть:
    • 0 (чтение);
    • 1 (запись);
    • 2 (дополнение);
  • Close(stream_id).

По умолчанию доступны три уже открытых потока:

  • 0 — stdin;
  • 1 — stdout;
  • 2 — stderr.

Модуль maths

  • Sin(number);
  • Cos(number);
  • Tg(number);
  • Arcsin(number);
  • Arccos(number);
  • Arctg(number);
  • SquareRoot(number);
  • Power(base, exponent);
  • Exp(number);
  • Ln(number);
  • Integral(number);
  • GetRandom() — возвращает случайное число в диапазоне [0; 1].