Проект "Компилятор формул"
Задачи для самостоятельного решения
Задача 12.3. Докажите, что языки, порожденные двумя указанными грамматиками, совпадают:
a) и ;
b) и ;
c) и .
Задача 12.4. Задайте с помощью грамматики следующие языки:
a) язык всех целых десятичных чисел;
b) язык всех целых неотрицательных восьмеричных чисел;
c) язык всех целых неотрицательных шестнадцатеричных чисел;
d) язык всех римских чисел от 1 до 3999;
e) язык всех допустимых идентификаторов в Java;
f) язык всех констант типа double в Java;
g) язык над алфавитом , состоящий из всех цепочек, в которых четное количество нулей и нечетное количество единиц;
h) язык над алфавитом , состоящий из всех цепочек, в которых количество нулей и единиц совпадают;
i) язык над алфавитом , состоящий из всех цепочек, инвариантных относительно операции инвертирования;
j) язык над алфавитом , состоящий из всех цепочек, начинающихся с нуля и заканчивающихся нулем, в которых и количество нулей и количество единиц нечетны.
Задача 12.5. Модифицируйте текст эталонного проекта "Рекурсивный компилятор формул" так, чтобы:
a) все арифметические операции трактовались, как левоассоциативные;
b) приоритеты операций сложения и вычитания были выше, чем у операций умножения и деления;
c) в качестве имен переменных допускались произвольные идентификаторы языка Java;
d) для группировки в формулах можно было использовать не только круглые, но также квадратные и фигурные скобки;
e) компилировались формулы, содержащие операцию % (остаток от деления) с приоритетом, равным приоритету операций умножения и деления; в язык стекового компилятора при этом также добавляется операция % ;
f) компилировались формулы, содержащие пробелы и комментарии двух видов: /* */ и // ;
g) компилировались формулы, запись которых состоит из нескольких строк;
h) компилировались формулы, содержащие унарные арифметические операции + и - ; в язык стекового компилятора при этом также добавляются операции + и - ;
i) компилировались формулы, содержащие бинарные битовые операции | и & ; в язык стекового компилятора при этом также добавляются операции | и & ;
j) компилировались формулы, содержащие унарную битовую операцию ^ ; в язык стекового компилятора при этом также добавляется операция ^.
Задача 12.6. Модифицируйте текст эталонного проекта "Рекурсивный компилятор формул" так, чтобы:
a) формулы, содержащие только десятичные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие восьмеричные числа;
b) формулы, содержащие только десятичные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие шестнадцатеричные числа;
c) формулы, содержащие только десятичные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие римские числа;
d) формулы, содержащие только восьмеричные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие десятичные числа;
e) формулы, содержащие только восьмеричные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие римские числа;
f) формулы, содержащие только шестнадцатеричные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие десятичные числа;
g) формулы, содержащие только шестнадцатеричные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие римские числа;
h) формулы, содержащие только римские числа (до 3999), компилировались в программы для стекового калькулятора, содержащие десятичные числа;
i) формулы, содержащие только римские числа (до 3999), компилировались в программы для стекового калькулятора, содержащие восьмеричные числа;
j) формулы, содержащие только римские числа (до 3999), компилировались в программы для стекового калькулятора, содержащие шестнадцатеричные числа.
Задача 12.7. Напишите программу (компилятор формул), которая для любой правильной арифметической формулы (элемента языка ), данной ей на вход, выдает семантически эквивалентную ей программу стекового калькулятора (элемент языка ).
Задача 12.8. Модифицируйте текст эталонного проекта "Стековый компилятор формул" так, чтобы:
a) деление трактовалось, как левоассоциативная операция;
b) приоритеты операций сложения и вычитания были выше, чем у операций умножения и деления;
c) в качестве имен переменных допускались произвольные идентификаторы языка Java;
d) для группировки в формулах можно было использовать не только круглые, но также квадратные и фигурные скобки;
e) компилировались формулы, содержащие операцию % (остаток от деления) с приоритетом, равным приоритету операций умножения и деления; в язык стекового компилятора при этом также добавляется операция % ;
f) компилировались формулы, содержащие пробелы и комментарии двух видов: /* */ и // ;
g) компилировались формулы, запись которых состоит из нескольких строк;
h) компилировались формулы, содержащие унарные арифметические операции + и - ; в язык стекового компилятора при этом также добавляются операции + и - ;
i) компилировались формулы, содержащие бинарные битовые операции | и & ; в язык стекового компилятора при этом также добавляются операции | и & ;
j) компилировались формулы, содержащие унарную битовую операцию ^ ; в язык стекового компилятора при этом также добавляется операция ^.
Задача 12.9. Модифицируйте текст эталонного проекта "Стековый компилятор формул" так, чтобы:
a) формулы, содержащие только десятичные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие восьмеричные числа;
b) формулы, содержащие только десятичные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие шестнадцатеричные числа;
c) формулы, содержащие только десятичные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие римские числа;
d) формулы, содержащие только восьмеричные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие десятичные числа;
e) формулы, содержащие только восьмеричные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие римские числа;
f) формулы, содержащие только шестнадцатеричные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие десятичные числа;
g) формулы, содержащие только шестнадцатеричные числа (до 3999), компилировались в программы для стекового калькулятора, содержащие римские числа;
h) формулы, содержащие только римские числа (до 3999), компилировались в программы для стекового калькулятора, содержащие десятичные числа;
i) формулы, содержащие только римские числа (до 3999), компилировались в программы для стекового калькулятора, содержащие восьмеричные числа;
j) формулы, содержащие только римские числа (до 3999), компилировались в программы для стекового калькулятора, содержащие шестнадцатеричные числа.