- •Содержание
- •1. Организация таблицы идентификаторов
- •1.1 Исходные данные
- •1.2 Назначение таблиц идентификаторов
- •1.4 Упорядоченный список
- •1.5 Результаты
- •2. Проектирование лексического анализатора
- •2.1 Исходные данные
- •2.3 Схема распознавателя
- •2.2 Принципы работы лексического анализатора
- •2.4 Результаты
- •Проектирование синтаксического анализатора
- •3.1 Исходные данные
- •3.2 Построение синтаксического анализатора
- •Результаты
- •Список литературы
2.4 Результаты
В результате своей работы лексический анализатор формирует таблицу лексем и таблицу идентификаторов (рис. 7).
Рис.7 Экранная форма результатов работы лексического анализатора
Построенный лексический анализатор позволяет выделять в тексте исходной программы лексемы следующих типов:
операторы
цикла “do”
и “while”;идентификаторы;
круглые открывающиеся и закрывающиеся скобки;
операторы сравнения “<”, “>”, “=”;
знак присваивания “:=”;
составные операторы “begin” и “end”;
условные операторы “if”, “then” ,“else”, “endif”;
ключевые слова начала и конца программы “prog” и “end.”;
разделяющий знак “;”;
логические операторы “not”, “and” и “or”;
арифметические операции сложения, вычитания, умножения и деления;
комментарии любой длины в фигурных скобках в одной строке;
константы в шестнадцатеричной форме.
Если обнаружена неверная лексема лексический анализатор помещает ее в поле ошибочных лексем и продолжает дальнейшую работу, пока не будет достигнут конец файла. Если комментарии не будут закрыты, то работа лексического анализатора прекращается, и выдается сообщение об ошибке (рис. 8).
Рис. 8 Экранная форма ошибки «Не закрыт комментарий»
Также заполняется таблица идентификаторов с помощью выбранного метода – хеш-адресации с рехешированием с помощью произведения.
Проектирование синтаксического анализатора
3.1 Исходные данные
Требуется написать программу, которая выполняет синтаксический разбор цепочки символов по заданной грамматике с построением дерева разбора. На вход синтаксического анализатора поступает информация, содержащаяся в таблице лексем, заполненная на этапе лексического анализа. При наличии во входной цепочке текста, соответствующего заданному языку, программа должна строить и отображать дерево синтаксического разбора. Если же текст во входной цепочке содержит синтаксические ошибки, программа должна выдавать сообщения об ошибке.
Входной язык задан с помощью следующей КС-грамматики:
G({prog, end., if, then, else, endif, begin, end, while, do, and, or, not, =, <,>, (, ), -, +, a, ;, :=}, {S, L, O, B, C, K, D, E, T}, P,S))
с правилами Р:
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 | do O while (B) | a := E
B ® B or C | C
C® C and D | D
D ® E < E | E > E | E = E | (B) | not (B)
E ® E – F | E + F | E * F | E / F |E
F ® (E) | a
Жирным шрифтом в грамматике и в правилах выделены терминальные символы.
3.2 Построение синтаксического анализатора
Синтаксический анализатор выполняет две основные задачи: проверка правильности конструкций программы, которая представляется в виде уже выделенных слов входного языка, и преобразование её в вид, удобный для дальнейшей семантической (смысловой) обработки и генерации кода. Одним из таких способов представления является дерево синтаксического разбора.
Класс КС-языков допускает распознавание с помощью недетерминированного автомата со стековой (или магазинной) памятью – МП-автомата.
Схема МП-автомата представлена на рисунке 9:
Рис.9 Схема МП-автомата
МП-автоматом выполняется алгоритм «сдвиг-свертка» для грамматики операторного предшествования. Для моделирования его работы необходима входная цепочка символов и стек, в котором автомат может обращаться не только к самому верхнему символу, но и к некоторой цепочке символов на вершине стека. После завершения алгоритма «свиг-свертка» решение о принятии цепочки зависит от содержимого стека. Автомат принимает цепочку, если в результате завершения алгоритма он находится в состоянии, когда в стеке находятся начальный символ грамматики и символ конца строки. Выполнение алгоритма может быть прервано, если на одном из его шагов возникла ошибка.
В курсовом проекте КС-грамматика является грамматикой операторного предшествования. Для построения анализатора на основе этой грамматики, необходимо построить матрицу операторного предшествования. Для этого на первом шаге нужно получить множество крайних левых и крайних правых символов из правил грамматики G. Полученное множество представлено в табл.1.
Таблица 1
Множество крайних левых и крайних правых символов
Символы U |
L(U) |
R(U) |
F |
(, a |
) , a |
E |
E, F, (, a |
F, ) , a |
D |
(, not, E, F, a |
E, F, ) , a |
C |
C, D, (, not, E, F, a |
D, E, F, ) , a |
B |
B, C, D, (, not, E, F, a |
C, D, E, F, ) , a |
O |
if, begin, do, a |
endif, end, E, ), F, a |
L |
O, L, if, begin, do, a |
O, ;, endif, end, E, ), F, a |
S |
prog |
end. |
На втором шаге, после многократного анализа, получили множество крайних левых и крайних правых терминальных символов из правил грамматики G. Полученное множество представлено в табл.2.
Таблица 2
Множество крайних левых и крайних правых терминальных символов
Символы U |
Lt(U) |
Rt (U) |
F |
(, a |
) , a |
E |
-, +, *, /, (, a |
-, +, *, /, ) , a |
D |
<, >, =, (, not, -, +, *, /, a |
<, >, =, ), -, +, *, /, a |
C |
and, <, >, =, (, not, -, +, *, /, a |
and, <, >, =, ), -, +, *, /, a |
B |
or, and, <, >, =, (, not, -, +, *, /, a |
or, and, <, >, =, ), -, +, *, /, a |
O |
if, begin, do, a |
endif, end, ), :=, -, +, *, /, a |
L |
;, if, begin, do, a |
;, endif, end, ), :=, -, +, *, /, a |
S |
prog |
end. |
F |
(, a |
) , a |
На
основе грамматики и табл.2 строим
матрицу операторного предшествования.
Матрица операторного предшествования
представлена в приложении B.
Также, для практического использования,
матрицу предшествования дополняем
символами ^н
и ^к
(начало и конец цепочки).
Алгоритм разбора цепочек грамматики операторного предшествования игнорирует нетерминальные символы. Поэтому имеет смысл преобразовать исходную грамматику таким образом, чтобы оставить в ней только один нетерминальный символ. Построенная таким образом грамматика называется «остовной» грамматикой.
Основная грамматика, полученная на основе исходной грамматики:
G({prog, end., if, then, else, endif, begin, end, while, do, and, or, not, =, <, >, (, ), -, +, a, ;, :=}, {E}, P,S))
Р’: E ® prog E end. – правило № 1
E ® E | E ; | E;E – правила № 2 и 4
E® if B then E else E endif| if B then E endif| begin E end | do E while (B) | a := E – правила № 5–9
E ® B or B | B – правила № 10–11
E® B and B | B – правила № 12 и 13
E
®
E <
E
| E
>
E | E =
E | (E)
|
not
(B)| B
–
правила
№ 14–19
E ® E – E | E + E | E * E| E / E | E – правила № 20–24
E ® (E) | a – правила № 25–26
