1. АНАЛИЗ ТРЕБОВАНИЙ
азработка генератора кода или модуля интерпретации
Данный компонент транслятора, в основном и определяет его форму: компилятор или интерпретатор, поскольку основное различие между компилятором и интерпретатором состоит в том, что интерпретатор, в отличие от компилятора, не порождает объектную программу, которая должна выполняться при необходимости впоследствии, а непосредственно выполняет ее сам.
При разработке генератора кода целесообразно, чтобы на выходе генератора формировалась последовательность команд языка ассемблера с тем, чтобы впоследствии можно было задействовать соответствующее ассемблирование.
При разработке модуля интерпретации в качестве промежуточной формы исходной программы наиболее часто используется постфиксная форма записи, которая позволяет достаточно легко реализовывать процесс выполнения (интерпретации) транслируемой программы.
остфиксная запись
Постфиксная запись представляет собой такую запись арифметического выражения, в которой сначала записываются операнды, а затем – знак операции. Например, для выражения a + b * c постфиксная запись будет a b c * +. Здесь операндами операции * будут b и c (два ближайших операнда), а операндами операции + будут а и составной операнд b c *. Эта запись удобна тем, что она не требует скобок. Например, для выражения (a + b) * c постфиксная запись будет a b + c *. В этой записи не требуется ставить скобки для того, чтобы изменить порядок вычисления, зависящий от приоритета операций, как в исходном выражении.
Алгоритм перевода в постфиксную запись обрабатывает исходный массив лексем и строит новый массив из тех же лексем, расположенных в другом порядке. Кроме того, необходим еще стек – аналогичный массив, используемый для временного хранения операций.
Для унарного минуса в арифметическом выражении существуют несколько различных способов его записи и идентификации:
1) унарный минус записывается как бинарная операция, т.е. вместо, например -В записывается 0-В;
2) для обозначения унарного минуса используется новый знак, например @;
3) унарный минус может определяться по контексту: он может стоять либо в начале выражения, либо сразу после открывающей скобки, например -х+а(-в+с)/(-d+f).
Основные правила преобразования инфиксной записи выражения в постфиксную заключаются в следующем.
Считанные операнды добавляются к постфиксной записи, операции записываются в стек.
Если операция в вершине стека имеет больший (или равный) приоритет, чем текущая считанная операция, то операция из стека добавляется к постфиксной записи, а текущая операция заносится в стек. В противном случае (при низшем приоритете) происходит только занесение текущей операции в стек.
Считанная открывающая скобка заносится в стек.
После считывания закрывающей скобки все операции до первой открывающей скобки извлекаются из стека и добавляются к постфиксной записи, после чего и открывающая, и закрывающая скобки отбрасываются, т.е. не помещаются ни в постфиксную запись, ни в стек.
После считывания всего выражения, оставшиеся в стеке операции добавляются к постфиксной записи.
Рассмотрим пример преобразования для следующей инфиксной записи:
A+B*C
Шаг | Текущий символ (лексема) | Постфиксная запись | Стек |
1. | A | A | |
2. | + | A | + |
3. | B | AB | + |
4. | * | AB | *+ |
5. | C | ABC | *+ |
6. | ABC*+ |
Рассмотрим пример преобразования для следующей инфиксной записи:
(A+B)*C
Шаг | Текущий символ (лексема) | Постфиксная запись | Стек |
1. | ( | ( | |
2. | A | A | ( |
3. | + | A | +( |
4. | B | AB | +( |
5. | ) | AB+ | |
6. | * | AB+ | * |
7. | C | AB+C | * |
8. | AB+C* |
Рассмотрим пример преобразования для следующей инфиксной записи:
-A*((-B+C)/D-F)
Шаг | Текущий символ (лексема) | Постфиксная запись | Стек |
1. | - | - | |
2. | A | A | - |
3. | * | A- | * |
4. | ( | A- | (* |
5. | ( | A- | ((* |
6. | - | A- | -((* |
7. | B | A-B | -((* |
8. | + | A-B- | +((* |
9. | C | A-B-C | +((* |
10. | ) | A-B-C+ | (* |
11. | / | A-B-C+ | /(* |
12. | D | A-B-C+D | /(* |
13. | - | A-B-C+D/ | -(* |
14. | F | A-B-C+D/F | -(* |
15. | ) | A-B-C+D/F- | * |
16. | A-B-C+D/F-* |
Постфиксная запись выражения позволяет производить его вычисление следующим образом.
Если лексема является операндом, то она записывается в стек. Если лексема является операцией, то указанная операция выполняется над последними элементами (последним элементом), записанными в стек, и эти элементы (элемент) заменяются в стеке результатом операции.
2. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ
нализ предметной области
Разработать учебный транслятор в форме интерпретатора с языка, определенного соответствующей формальной грамматикой.
Реализовать операторы:
READ<список переменных>,
WRITE<список переменных>,
CASE <Выражение> OF <Список выбора> END_CASE,
Тип переменных – INTEGER.
нализ требований
ребования к интерфейсу пользователя
Транслятор должен обладать простым и удобным интерфейсом, который должен включать в себя:
Поле ввода текста программы
· Поле вывода значений программы
· Кнопка открытия сохраненной программы
· Кнопка сохранения текста программы
· Кнопка выполнения введенной программы