Скачиваний:
41
Добавлен:
02.05.2014
Размер:
188.42 Кб
Скачать

Общий алгоритм работы синтаксического анализатора

Синтаксический анализатор работает, опираясь на построенную матрицу предшествования. На его вход поступает обработанный сканером текст исходной программы. Каждый идентификатор или константа представляются для него некоторым терминальным символом (в примере он обозначен как p, в задании -a). Тогда первым шагом общего алгоритма анализа должно являться построение таблицы лексем (что уже выполнялось в предыдущей работе).

Рис. 4. Деревья вывода для цепочек из примеров 3 и 4 соответственно.

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

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

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

Пример 3.Входная цепочка-p^p&p.

--E&-E&p®-E^E&p®-E^p&p®-p^p&p

Пример 4.Входная цепочка-p&p^p.

--E&-E&E^-E&E^p®-E&p^p®-p&p^p

Деревья вывода для этих двух примеров приведены на рис. 4.

После построения дерева остается заменить терминальные символы (pилиa) грамматики на соответствующие константы и идентификаторы из таблицы лексем. Для этого достаточно просматривать таблицу от начала к концу и, обходя построенное дерево от корня сверху вниз слева направо, последовательно заменить все листья, помеченные искомым символом, на лексемы из таблицы. Это последний шаг общего алгоритма работы синтаксического анализатора.

Построенное дерево и будет деревом синтаксического разбора предложения грамматики.

Порядок выполнения работы

  1. Получить вариант задания у преподавателя.

  2. Построить матрицу предшествования для заданной грамматики.

  3. Выполнить разбор простейшего примера вручную по правилам заданной грамматики.

  4. Подготовить и защитить отчет.

  5. Написать и отладить программу на ЭВМ.

  6. Сдать работающую программу преподавателю.

Требования к оформлению отчета

Отчет должен содержать следующие разделы:

  • Задание по лабораторной работе.

  • Краткое изложение цели работы.

  • Запись заданной грамматики входного языка в форме Бэкуса-Наура.

  • Множества крайних правых и крайних левых символов с указанием шагов построения.

  • Множества крайних правых и крайних левых терминальных символов.

  • Заполненную матрицу предшествования для грамматики.

  • Пример выполнения разбора простейшего предложения (по выбору).

  • Текст программы (оформляется после выполнения программы на ЭВМ).

Основные контрольные вопросы

  1. Какую роль выполняет синтаксический анализ в процессе компиляции?

  2. Какие типы грамматик существуют? Как связаны типы грамматик и языков?

  3. Что такое КС-грамматики? Расскажите об их использовании в компиляторе.

  4. Дайте определение приведенной грамматики. Какие преобразования грамматик существуют?

  5. Поясните правила построения дерева вывода грамматики.

  6. Что такое грамматики простого предшествования?

  7. Как вычисляются отношения предшествования для грамматик простого предшествования ?

  8. Что такое грамматика операторного предшествования ?

  9. Как вычисляются отношения для грамматик операторного предшествования ?

  10. Расскажите о задаче разбора. Что такое распознаватель языка?

  11. Расскажите об общих принципах работы распознавателя языка.

  12. Что такое перенос, свертка. Для чего необходим алгоритм «перенос-свертка»?

  13. Расскажите, как работает алгоритм «перенос-свертка» в общем случае (с возвратами).

  14. Как работает алгоритм «перенос-свертка» без возвратов (объясните на своем примере)?