Реализовать на языке по выбору С/С++/Java алгоритм работы стековой машины с учетом возможных ошибочных ситуаций при выполнении команд. В число обязательно учитываемых ошибок входят следующие:
· арифметическое переполнение (т.е. выход результата любой арифметической операции за диапазон принимаемых стековой машиной чисел [-9999 9999])
· ошибка адресации (обращение к данным по чтению или записи за пределами границ массива D или С)
· неверная команда
Входные данные и команды должны быть загружены из текстового файла, имеющего такой внутренний формат:
Таблица 3
CN | DN | C1 | … | CN | D1 | .. | DM |
CN число команд
С1…СN команды
DM число элентов стека данных
D1…DM данные
Задание 2
Реализовать с использованием инструментального средства ANTLR на языке по выбору C/C++/java ассемблер виртуальной стековой машины. Входной текстовый файл ассемблера удовлетворяет следующей грамматике:
<инструкция>::= <число> |
add |
mult |
div |
minus |
if= |
if< |
goto |
load |
free |
store |
count |
print |
read |
stop
<входные данные>::={<число>,}*
|
|
<программа>::= DATA: <входные данные> PROGRAM: {<инструкция>,}*
Выходной текстовый файл, получаемый в результате работы ассемблера, должен содержать правильную последовательность данных и команд стековой машины в ее внутреннем формате (см. задание 1).
ЗАДАНИЕ 3
Модельный язык задается следующей грамматикой (выражение EXP?n,m означает повторение выражения EXP от n до m раз):
<программа>::= INPUT <список параметров>
FUNCTIONS <список объявлений>
OUTPUT <список выражений>
END
<список объявлений>::= <объявление> {,<объявление>}*
<список выражений>::= <выражение> {,<выражение>}*
<идентификатор>::=[a..z]?1,10
<объявление>::=<идентификатор>(<список параметров>)=<выражение>
<выражение>::= <число> |
<идентификатор> |
<идентификатор>(<список выражений>) |
-<выражение> |
(выражение) |
<выражение>[+|*|/|-]<выражение> |
if <выражение>[=|<]<выражение> then <выражение> fi
<число>::=[0..9]?1,10
Например, следующий текст является правильной программой:
INPUT a,b
FUNCTIONS div(x,y)= if x<y then 0
else div(x-y,y)+1 fi,
mod(x,y)= if x<y then x
else mod(x-y,y) fi
OUTPUT div(a,b), mod(a,b)
END
Реализовать с использованием инструментального средства ANTLR транслятор программ с описанной выше грамматикой на язык ассемблера виртуальной стековой машины (задание 2) и или на правильную последовательность данных и команд стековой машины в ее внутреннем формате (см. задание 1).