
- •Введение
- •2.1.2. Основная программа анализатора
- •2.1.3. Вспомогательные процедуры
- •2.1.4. Распознающие процедуры
- •2.2. Умножение многочленов
- •2.2.1. Постановка задачи
- •2.2.2. Умножение и вывод
- •2.2.3. Транслятор многочленов
- •2.2.4. Обработка ошибок при трансляции
- •2.3. Табличный ll(1) – анализатор
- •2.4. Табличный транслятор многочленов
- •2.5. Реализация стека
- •2.6. Ll(1) – драйвер
- •3. Порядок выполнения работы
- •Варианты заданий
- •4. Контрольные вопросы
- •Список литературы
- •450000, Уфа - центр, ул. К. Маркса, 12
2.4. Табличный транслятор многочленов
Пользуясь
выработанным форматом таблицы переходов,
заполним ее для распознавателя
многочленов. Имея ввиду, что должен
выполняться не только синтаксический
анализ, но и трансляция многочлена,
предусмотрим в таблице графу «Процедура»,
в которой будем записывать номер
семантической процедуры. Эта процедура
будет вызываться при совпадении входного
символа и символа в таблице. Если указан
нулевой номер семантической процедуры,
вызов не происходит (или процедура
не выполняет никаких действий). Некоторые
состояния добавляются в таблицу лишь
для того, чтобы предусмотреть в нужные
моменты выполнение необходимых
семантический процедур (например,
состояния 1, 6, 25).
Таблица 4.
Сост. |
Символ |
Переход |
Ошибка |
Вызов |
Читать |
Проц. |
Примечание |
Многочлен |
|||||||
1 |
Л |
2 |
- |
- |
- |
3 |
Обнуление коэффициента |
2 |
+ |
5 |
- |
- |
+ |
4 |
|
3 |
- |
5 |
- |
- |
+ |
4 |
|
4 |
Л |
5 |
- |
- |
- |
5 |
Нет знака спереди |
5 |
Л |
12 |
- |
+ |
- |
0 |
На 1-е слагаемое |
6 |
Л |
7 |
- |
- |
- |
6 |
После 1-го слагаемого |
7 |
+ |
10 |
- |
- |
+ |
4 |
Начало цикла |
8 |
- |
10 |
- |
- |
+ |
4 |
|
9 |
|
0 |
+ |
- |
- |
7 |
Выход |
10 |
Л |
12 |
- |
+ |
- |
0 |
На слагаемое |
11 |
Л |
7 |
- |
- |
- |
6 |
Конец цикла |
Слагаемое |
|||||||
12 |
Ц |
15 |
- |
- |
- |
0 |
|
13 |
x |
21 |
+ |
+ |
+ |
10 |
a=1 |
14 |
Л |
0 |
- |
- |
- |
9 |
После степени |
15 |
Л |
25 |
- |
+ |
- |
0 |
На целое |
16 |
Л |
17 |
- |
- |
- |
8 |
После целого |
17 |
x |
19 |
- |
- |
+ |
0 |
|
18 |
Л |
0 |
- |
- |
- |
11 |
k=0 |
19 |
Л |
21 |
- |
+ |
- |
0 |
На степень |
20 |
Л |
0 |
- |
- |
- |
9 |
Конец слагаемого |
Окончание табл.4
Сост. |
Символ |
Пере ход |
Ошибка |
Вызов |
Читать |
Проц. |
Примечание |
Степень |
|||||||
21 |
^ |
23 |
- |
- |
+ |
0 |
|
22 |
Л |
0 |
- |
- |
- |
13 |
p=1 |
23 |
Л |
25 |
- |
+ |
- |
0 |
На целое |
24 |
Л |
0 |
- |
- |
- |
12 |
|
Целое |
|||||||
25 |
Л |
26 |
- |
- |
- |
1 |
Инициализация |
26 |
Ц |
27 |
+ |
- |
+ |
2 |
Первая цифра |
27 |
Ц |
27 |
- |
- |
+ |
2 |
Последующие цифры |
28 |
Л |
0 |
- |
- |
- |
0 |
|
Перед выполнением перехода с возвратом необходимо запомнить номер состояния, в которое автомат должен возвратиться. Недостаточно использовать для этого отдельную переменную, способную хранить номер только одного состояния. Поскольку вызовы могут быть вложенными. Это соответствует стековой дисциплине (LIFO). Для запоминания номера состояния перед выполнением перехода используется стек.