- •Содержание
- •1. Организация таблицы идентификаторов
- •1.1. Исходные данные
- •1.2. Назначение таблиц идентификаторов
- •1.3. Метод простого рехэширования
- •1.4. Метод цепочек
- •1.5. Результаты
- •2. Проектирование лексического анализатора
- •2.1. Исходные данные
- •3. Проектирование синтаксического анализатора
- •3.1. Исходные данные
- •3.2. Построение синтаксического анализатора
- •3.3. Результаты
- •Список использованной литературы
- •Приложение а Исходный текст программы
- •Приложение б Граф состояний лексического анализатора
3. Проектирование синтаксического анализатора
3.1. Исходные данные
Для программной реализации процесса построения дерева вывода требуется написать программу, которая выполняет синтаксический разбор текста по заданной КС-грамматике с построением дерева разбора. Текст на входном языке задан в виде текстового файла. Программа должна выдавать сообщения о наличие во входном тексте ошибок.
3.2. Построение синтаксического анализатора
Исходная КС-грамматика:
G ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, and, or, not, =, <, >, (, ),{, }, -, +, *, /, a, c, ;, :=}, {S, L, O, B, C, K, D, H, E, T, M},P, S)
P:
S → prog L end.
L → O | L ; O | L ;
O → if B then O else O endif | if B then O endif | begin L end
| for M to E do O| for M downto E do O| M
M→ a:=E
B → B or C | C
C → C and D | D
D →not D | H
H → E < E | E > E | E = E | (B)
E → E – T | E + T | E * T | E / T| T
T → (E) | a | c
Смысл нетерминальных символов грамматики:
S – вся программа,
L – последовательность операторов(может состоять из одного оператора),
O – оператор,
B, C, D – логическое выражение и его элементы,
H – операции сравнения или логические выражения в скобках,
E,T – арифметические выражения и его элементы,
a – переменная,
с – константа.
КС-языки делятся на классы в соответствии со структурой правил их грамматик. Одним из таких классов является класс грамматик предшествования. Они используются для синтаксического разбора цепочек с помощью алгоритма “сдвиг-свертка”.
Грамматикой операторного предшествования называется приведенная КС-грамматика без l-правил, в которой правые части продукций не содержат смежных нетерминальных символов. Для грамматики операторного предшествования строится матрица операторного предшествования, которая содержит только терминальные символы грамматики. Отношения =, < и > называют отношениями предшествования.
Исходная КС-грамматика, представленная выше, является грамматикой операторного предшествования.
Строятся множества крайних левых и крайних правых символов L(U), R(U) относительно всех нетерминальных символов грамматики. Результат построения приведен в табл. 2.
Таблица 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, for, M |
endif, end, O, M |
M |
a |
E |
L |
L, O |
O, ; |
S |
prog |
end. |
На основе полученных множеств строятся множества крайних левых и крайних правых терминальных символов Lt(U), Rt(U) относительно всех нетерминальных символов грамматики. Результат построения приведен в табл. 3.
Таблица 3
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, for, a |
endif, end, do, :=, -, +, ), a, c |
M |
a |
:=, -, +, ), a, c |
L |
;, if, begin, for, a |
;, endif, end, do, :=, -, +, ), a, c |
S |
prog |
end. |
На основе данных множеств и правил исходной КС-грамматики G построим матрицу операторного предшествования, которая представлена в приложении В.
Алгоритм разбора цепочек грамматики операторного предшествования игнорирует нетерминальные символы. Поэтому имеет смысл преобразовать исходную грамматику таким образом, чтобы оставить в ней только один нетерминальный символ.
Остовная грамматика, полученная на основе исходной грамматики:
G' ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, 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 | for E to E do E | for E downto E do E | E
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 → E – E | E + E | E * E| E / E | E
E → (E) | a | c
Для различия скобок, определяющих соответственно приоритет арифметических и логических операций, остовная грамматика дополняется нетерминальным символом B, который будет обозначать логические выражения.
Преобразованная остовная грамматика имеет следующий вид:
G' ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, and, or, not, =, <, >, (, ), -, +,*, /, a, c, ;, :=}, {E}, 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 | for E to E do E | for E downto E do E | E
E → a:=E
B → B or B | B
B → B and B | B
B → not B | B
B → E < E | E > E | E = E | (B)
E → E – E | E + E | E * E| E / E | E
E → (E) | a | c