Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовые проекты / курса не мои / ПЗ по СПО-юджен / пояснительная записка.doc
Скачиваний:
70
Добавлен:
02.05.2014
Размер:
546 Кб
Скачать

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

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