Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
02.05.2014
Размер:
546.3 Кб
Скачать

2.4 Результаты

В результате своей работы лексический анализатор формирует таблицу лексем и таблицу идентификаторов (рис. 7).

Рис.7 Экранная форма результатов работы лексического анализатора

Построенный лексический анализатор позволяет выде­лять в тексте исходной программы лексемы следующих типов:

  • операторы цикла “do” и “while”;

  • идентификаторы;

  • круглые открывающиеся и закрывающиеся скобки;

  • операторы сравнения “<”, “>”, “=”;

  • знак присваивания “:=”;

  • составные операторы “begin” и “end”;

  • условные операторы “if”, “then” ,“else”, “endif”;

  • ключевые слова начала и конца программы “prog” и “end.”;

  • разделяющий знак “;”;

  • логические операторы “not”, “and” и “or”;

  • арифметические операции сложения, вычитания, умножения и деления;

  • комментарии любой длины в фигурных скобках в одной строке;

  • константы в шестнадцатеричной форме.

Если обнаружена неверная лексема лексический анализатор помещает ее в поле ошибочных лексем и продолжает дальнейшую работу, пока не будет достигнут конец файла. Если комментарии не будут закрыты, то работа лексического анализатора прекращается, и выдается сообщение об ошибке (рис. 8).

Рис. 8 Экранная форма ошибки «Не закрыт комментарий»

Также заполняется таблица идентификаторов с помощью выбранного метода – хеш-адресации с рехешированием с помощью произведения.

  1. Проектирование синтаксического анализатора

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

    1. Результаты

В результате выполнения программы построен синтаксический анализатор на основе грамматики операторного предшествования. Синтаксический анализ по­зволяет проверять соответствие структуры исходного текста заданной граммати­ке входного языка. А также синтаксический анализ позволяет обнаруживать любые син­таксические ошибки во входной программе.

После обработки входного файла лексическим анализатором и построения таблицы лексем (рисунок 3), если не возникло лексических ошибок, строится дерево вывода (рис. 9).

Рис.9 Экранная форма дерева вывода

При наличии ошибки пользо­вателю выдается сообщение (рис. 10).

Рис. 10 Экранная форма сообщения об ошибке в конструкции предложения

Заключение

В результате выполнения курсовой работы изучены и проанализированы два метода организации таблиц идентификаторов, и по результатам работы этих двух методов выбран метод хеш-адресации, так как операция поиска этим методом выполняется эффективнее, чем методом упорядоченного списка (бинарный поиск). А также для заданного входного языка написаны программы лексического и синтаксического анализатора. Результатом работы лексического анализатора является таблица лексем и и таблица идентификаторов. В случае обнаружения неверной лексемы лексический анализатор помещает ее в поле ошибочных лексем и продолжает дальнейшую работу, пока не будет достигнут конец файла. Данные, полученные в результате работы лексического анализатора, используются при синтаксическом анализе, то есть входной цепочкой символов для синтаксического анализатора будет информация взятая из таблицы лексем. Результатом работы синтаксического анализа является дерево вывода.

Соседние файлы в папке ПЗ по СПО