World Conquest Chronicles

World Conquest Chronicles

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

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

Wizard BASIC 0 — компилируемый высокоуровневый язык программирования.

Исходники

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

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

11 ключевых слов: and, as, define, end, go to, if, label, let, not, or, then.

Типы

Числа

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

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

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

Определение: /\d+|(\d+.\d*)|(\d*.\d+)/.

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

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

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

Строковые константы

Определение: оператор "define", identifier, "as", ? /"([^"\\]|(\\(t|n|r|"|\\)))*"/ ?, line break.

Операции

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

Приоритет Операция Описание Ассоциативность
1 not логическое отрицание правая
2 * умножение левая
2 / деление левая
3 + сложение левая
3 - вычитание левая
4 < меньше левая
4 > больше левая
5 = равенство левая
6 and конъюнкция левая
7 or дизъюнкция левая

Вызов функции

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
"end", line break

Оператор.

Комментарии

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

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

LINE_BREAK =          ["\r"], "\n", {["\r"], "\n"};
CONSTANT_REAL =       ? /\b(\d+|(\d+.\d*)|(\d*.\d+))\b/ ?;
CONSTANT_STRING =     ? /"([^"\\]|(\\(t|n|r|"|\\)))*"/ ?;
IDENTIFIER_SIMPLE =   ? /\b[A-Za-z_]\w*\b/ ?;

expression_atom =     CONSTANT_REAL | IDENTIFIER_SIMPLE | ("(", expression, ")")
    | function_call;
expression_unary =    "not", expression_atom;
expression_mul =      expression_unary, {("*" | "/"), expression_unary};
expression_add =      expression_mul, {("+" | "-"), expression_mul};
expression_compare =  expression_add, {("<" | ">"), expression_add};
expression_equality = expression_compare, {"=", expression_compare};
expression_and =      expression_equality, {"and", expression_equality};
expression_or =       expression_and, {"or", expression_and};
expression =          expression_or;

statement_assign =    "let", IDENTIFIER_SIMPLE, "=", expression, LINE_BREAK;
statement_if =        "if", expression, "then", LINE_BREAK, statement_list,
    LINE_BREAK, "end", LINE_BREAK;
statement_label =     "label", IDENTIFIER_SIMPLE, LINE_BREAK;
statement_goto =      "go to", IDENTIFIER_SIMPLE, LINE_BREAK;
statement_define =    "define", IDENTIFIER_SIMPLE, "as", CONSTANT_STRING,
    LINE_BREAK;
statement =           statement_assign | statement_if | statement_label |
    statement_goto | statement_define | function_call;
statement_list =      statement, {statement};

function_call =       IDENTIFIER_SIMPLE, "(", [expression {",", expression}],
    ")";

program =             statement_list;

Рантайм

  • модуль system:
    • Number Exit(Number code);
    • модуль system.io:
      • Number ShowNumber(Number number);
      • Number ShowString(String string);
  • модуль maths:
    • Number Sin(Number number);
    • Number Cos(Number number);
    • Number Tg(Number number);
    • Number Arcsin(Number number);
    • Number Arccos(Number number);
    • Number Arctg(Number number);
    • Number Arctg2(Number y, Number x);
    • Number Pow(Number base, Number exponent);
    • Number Exp(Number number);
    • Number Sqrt(Number number);
    • Number Ln(Number number);
    • Number Lg(Number number);
    • Number Abs(Number number);
    • Number Trunc(Number number);
    • Number Rand(Number number).