Язык μLua
μLua — модельный императивный язык программирования, являющийся строгим подмножеством языка Lua.
Пример программы для вычисления факториала:
n = input()
result = 1
while n > 0 do
result = result * n
n = n - 1
end
print(result)
Интерпретатор Lua
Вы можете использовать интерпретатор Lua для проверки вашей реализации языка:
lua -e 'function input() return io.read("*number") or error() end' program.lua
Мы здесь также определяем функцию input
, поскольку ее нет в стандартной библиотеке Lua.
Синтаксис
Конкретный синтаксис языка определяется грамматикой, записанной в расширенной форме Бэкуса-Наура.
Лексические соглашения
μLua является языком свободной формы, то есть игнорирует пробельные символы (включая переводы строк), за исключением использования их в качестве разделителя между идентификаторами и ключевыми словами.
Инструкции
BlockStatement ⩴
| { Statement }
Statement ⩴
| AssignmentStatement
| IfStatement
| WhileStatement
AssignmentStatement ⩴
| Identifier AssignmentOperator Expression
AssignmentOperator ⩴
| "="
IfStatement ⩴
| "if" Expression "then" BlockStatement [ "else" BlockStatement ] "end"
WhileStatement ⩴
| "while" Expression "do" BlockStatement "end"
Выражения
Expression ⩴
| Identifier
| Literal
| ParenthesizedExpression
| UnaryExpression
| BinaryExpression
Literal ⩴
| NilLiteral
| BooleanLiteral
| IntegerLiteral
NilLiteral ⩴
| "nil"
BooleanLiteral ⩴
| "false"
| "true"
ParenthesizedExpression ⩴
| "(" Expression ")"
UnaryExpression ⩴
| UnaryOperator Expression
UnaryOperator ⩴
| "-"
BinaryExpression ⩴
| Expression BinaryOperator Expression
BinaryOperator ⩴
| "+" | "-" | "*" | "//"
| "==" | "~="
| "<" | "<=" | ">" | ">="
Семантика
Предполагается, что семантика этого языка очевидна, поэтому достаточно прокомментировать некоторые тонкости.
Значения
Как можно заметить по синтаксису, все значения относятся к одному из следующих типов:
-
Nil
—nil
. -
Boolean
— либоtrue
, либоfalse
. -
Integer
— целое число.
Размер целочисленного типа не специфицируется, но должен быть достаточным, чтобы выполнять вычисления в интервале [-230; 230 - 1].
Выражения
Результат вычисления бинарных выражений с операторами <
, <=
, >
, >=
, +
, -
, *
, //
определен только в случае, когда оба операнда являются значениями типа Integer
, причем целочисленное деление на ноль не определено. В противном случае интерпретатор языка сообщает об ошибке.
Переменные
Все переменные являются глобальными. По умолчанию значением всех переменных является nil
.