<программа> =
strings
<описание строки>*
.
labels
<описание метки>*
.
functions
<описание функции>*
.
commands
<описание команды>*
.
<описание строки> =
<идентификатор> <текст></n>
<описание метки> =
<идентификатор>
<описание функции> =
function <идентификатор>
<программа>
<описание команды> =
<print> | <read> | <push> | <pop> | <move> | <if> | <call> | <equal> | <add> | <subtract> | <return> | <pushaddr> | <exit> | <label> | <str>
<print> = print ( <регистр> | <число> )
<read> = read
<push> = push ( <регистр> | <число> )
<pop> = pop
<move> = move ( <регистр> | <число> ) <регистр>
<if> = if ( <регистр> | <число> ) <идентификатор>
<call> = call <идентификатор>
<equal> = equal ( <регистр> | <число> ) ( <регистр> | <число> )
<add> = add ( <регистр> | <число> ) ( <регистр> | <число> )
<subtract> = subtract ( <регистр> | <число> ) ( <регистр> | <число> )
<return> = return
<pushaddr> = pushaddr
<exit> = exit
<label> = label <идентификатор>
<str> = str <идентификатор>
<регистр> = reg1 | reg2 | reg3 | reg4 | reg5 | reg6 | reg7 | res
<число> = [0-9]+
<идентификатор> = [0-9a-z]+
- Все идентификаторы строк различны, все идентификаторы меток различны, все идентификаторы функций различны.
- Все идентификаторы, используемые в описании команд, определены в блоках
strings
,labels
,functions
. - Команда
label
определяет метоположении метки, и оно не более чем единственное для каждой метки.
Команды read
, pop
, equal
, add
и subtract
возвращают некоторый результат, который записывается в регистр res
. Остальные функции не влияют на регистры.
print
— выводит значение (в регистре или число) на экранread
— считывает число с клавиатурыpop
— удаляет значение с вершины стека и возвращает полученное значение, вершину стека сдвигает влевоpush
— кладет значение на вершину стека, сдвигает вершину вправоmove
— кладет значение в регистрif
— если значение не равно 0, то делает переход по меткеcall
— вызов функцииequal
— возвращает 1, если два значения равны, и 0 иначеadd
— складывает два числаsubtract
— вычитает второе число из первого; важно, чтобы второе не было большеreturn
— завершает вызов функцииpushaddr
— кладет на вершину стека указатель на текущую команду (то естьpushaddr
) плюс двеexit
— завершает выполнение программы; возможно использование внутри функцииlabel
— указывает местоположение метки; при переходе по этой метки выполнение начнется со следующей командыstr
— выводит на экран строку
- Все числа являются целыми неотрицательными, максимальное возможное число — 2147483647.
- От криво написанной программы запрещается ожидать чего-то конкретного.
- В конце функции обязательна команда
return
. - В конце всей программа обязательная команда
exit
. - Непосредственно перед командной
call
должна быть выполнена командаpushaddr
.
Остальное на вкус программиста.