- •Содержание
- •1 Задание
- •2 Таблица идентификаторов
- •2.1 Исходные данные
- •2.2 Назначение таблиц идентификаторов
- •2.3 Метод цепочек
- •2.4 Метод бинарного дерева
- •2.5 Результаты
- •3 Проектирование лексического анализатора
- •3.1 Исходные данные
- •3.2 Принципы работы лексического анализатора
- •3.3 Схема распознавателя
- •3.3 Результаты
- •4 Построение дерева вывода
- •4.1 Исходные данные
- •4.2 Синтаксический анализатор
- •4.3 Результаты
- •5 Генерация и оптимизация объектного кода
- •5.1 Исходные данные
- •5.2 Построение списка триад
- •5.3 Генерация ассемблерного кода
- •5.4 Результаты
- •6 Описание работы программы
- •6.1 Реализация таблицы идентификаторов
- •6.2 Программная реализация лексического анализатора
- •6.3 Программная реализация синтаксического анализатора
- •6.4 Реализация генерации и оптимизации объектного кода
4 Построение дерева вывода
4.1 Исходные данные
Для программной реализации построения дерева вывода требуется написать программу, которая выполняет лексический анализ входного текста в соответствии с заданием, порождает таблицу лексем и выполняет синтаксический разбор текста по заданной грамматике с построением дерева разбора. Текст на входном языке задается в виде символьного (текстового) файла. Программа должна выдавать сообщения о наличие во входном тексте ошибок.
4.2 Синтаксический анализатор
Исходная грамматика:
G ({ program, end., if, then, else, endif, begin, end, repeat, until, and, or, not, <<, >>, =, <, >, <>, (, ), -, +, a, c, ;, :=}, {S, L, O, B, C, K, D, H, E, T}, P, S)
S → program L end.
L → O | O ; O | L ;
O → if B then O else O endif | if B then O endif | begin L end | repeat O until B | a := E
B → B or C | C
C → C and D | D
D → not D | H
H → E < E | E > E | E = E | E <> E | (B) | E << E | E >> E
E → E – T | E + T | T
T → (E) | a | c
Множества крайних левых и крайних правых символов L(U), R(U) относительно всех нетерминальных символов грамматики представлены в таблице 2. В таблице 3 описаны итоговые множества крайних левых и крайних правых символов L(U), R(U) относительно всех нетерминальных символов грамматики.
Таблица 2
U |
L(U) |
R(U) |
T |
(, a, c |
), a, c |
E |
E, T |
T |
H |
(, E |
E, ) |
D |
not, H |
D, H |
C |
C, D |
D |
B |
B, C |
C |
O |
if, begin, repeat, a |
endif, E, end, B |
L |
L, O |
O, ; |
S |
program |
end. |
Таблица 3
U |
L(U) |
R(U) |
T |
(, a, c |
), a, c |
E |
E, T, (, a, c |
T, ), a, c |
H |
(, E, T, a, c |
E, ), T, a, c |
D |
not, H, (, E, T, a, c |
D, H, E, ), T, a, c |
C |
not, H, (, E, T, a, c |
D, H, E, ), T, a, c |
B |
B, C |
C, D, H, E, ), T, a, c |
O |
if, begin, repeat, a |
endif, E, end, B |
L |
L, O, if, begin, repeat, a |
O, ;, endif, E, end, B |
S |
program |
end. |
Множества крайних левых и крайних правых терминальных символов Lt(U), Rt(U) относительно всех нетерминальных символов грамматики и итоговые множества крайних левых и крайних правых терминальных символов Lt(U), Rt(U) относительно всех нетерминальных символов грамматики представлены соответственно в таблицах 4 и 5.
Таблица 4
U |
Lt(U) |
Rt(U) |
T |
(, a, c |
), a, c |
E |
-, + |
-, + |
H |
<, >, =, <>, (, << |
<, >, =, <>, ), >> |
D |
not |
not |
C |
and |
and |
B |
or |
or |
O |
if, begin, repeat, a |
endif, end, :=, until |
L |
; |
; |
S |
program |
end. |
Таблица 5
U |
Lt(U) |
Rt(U) |
T |
(, a, c |
), a, c |
E |
-, +, (,a, c |
-, +, ), a, c |
H |
<, >, =, <>, (, <<, -, +, a, c |
<, >, =, <>, ), >>, -, +, a, c |
D |
not, <, >, =, <>, (, <<, -, +, a, c |
not, <, >, =, <>, ), >>, -, +, a, c |
C |
and, not, <, >, =, <>, (, <<, -, +, a, c |
and, not, <, >, =, <>, ), >>, -, +, a, c |
B |
or, and, not, <, >, =, <>, (, <<, -, +, a, c |
or, and, not, <, >, =, <>, ), >>, -, +, a, c |
O |
if, begin, repeat, a |
endif, end, :=, until, or, and, not, <, >, =, <>, ), >>, -, +, a, c |
L |
;, if, begin, repeat, a |
;, endif, end, :=, until, or, and, not, <, >, =, <>, ), >>, -, +, a, c |
S |
program |
end. |
Остовная грамматика, полученная на основе исходной грамматики:
G' ({ program, end., if, then, else, endif, begin, end, repeat, until, and, or, not, <<, >>, =, <, >, <>, (, ), -, +, a, c, ;, :=}, {E}, P, S)
E → program E end.
E → E | E ; E | E ;
E → if E then E else E endif | if E then E endif | begin E end | repeat E until E | a := E
E → E or E | E
E → E and E | E
E → not E | E
E → E < E | E > E | E = E | E <> E | (B) | E << E | E >> E
E → E – E | E + E | E
E → (E) | a | c
Для различия скобок, определяющих соответственно приоритет арифметических и логических операций, дополним остовную грамматику дополгительным нетерминальным символом B, который будет обозначать логические выражения.
Преобразованная остовная грамматика примет следующий вид:
G' ({ program, end., if, then, else, endif, begin, end, repeat, until, and, or, not, <<, >>, =, <, >, <>, (, ), -, +, a, c, ;, :=}, {E, B}, P, S)
E → program E end.
E → E | E ; E | E ;
E → if B then E else E endif | if B then E endif | begin E end | repeat E until B | a := E
B → B or B | B
B → B and B | B
B → not B | B
B → E < E | E > E | E = E | E <> E | (B) | E << E | E >> E
E → E – E | E + E | E
E → (E) | a | c