- •Содержание
- •1. Организация таблицы идентификаторов
- •1.1. Исходные данные
- •1.2. Назначение таблиц идентификаторов
- •1.3. Метод простого рехеширования
- •1.4. Простой список
- •1.5. Результаты
- •Принципы работы лексического анализатора
- •2. Проектирование лексического анализатора
- •2.1. Исходные данные
- •Результаты
- •3. Проектирование синтаксического анализатора
- •3.1. Исходные данные
- •3.2. Построение синтаксического анализатора
- •3.3. Результаты
- •Список использованной литературы
Результаты
На основе сравнения методов организации таблиц идентификаторов, проведенного в первой части курсовой работы, выбран метод простое рехэширования. На основе таблицы идентификаторов, заполненной по методу простого рехеширования, организована таблица лексем. На рис. 5 и рис. 6 представлены таблица идентификаторов и таблица лексем, построенные при обработке следующего текстового файла:
Рис. 5. Результат работы лексического анализатора таблица лексем.
Рис. 6. Результат работы лексического анализатора таблица индефикаторов.
3. Проектирование синтаксического анализатора
3.1. Исходные данные
Для программной реализации процесса построения дерева вывода требуется написать программу, которая выполняет синтаксический разбор текста по заданной КС-грамматике с построением дерева разбора. Текст на входном языке задан в виде текстового файла. Программа должна выдавать сообщения о наличие во входном тексте ошибок.
3.2. Построение синтаксического анализатора
Исходная КС-грамматика:
G ({ prog, end., if, then, else, endif, begin, end, , white, 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
| while (B) 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, while, ( |
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, while, a |
endif, end, do, :=, -, +, ), a, c |
M |
a |
:=, -, +, ), a, c |
L |
;, if, begin, 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| while (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 |while (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
