
- •Цель лабораторных работ:
- •Лабораторная работа № 1 разработка грамматики заданного языка.
- •Краткие теоретические сведения
- •Формы записи грамматики
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Лабораторная работа № 2 работа с таблицей символов Проектирование лексического анализатора
- •Краткие теоретические сведения
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Лабораторная работа № 3 Синтаксический и семантический анализ. Построение простейшего дерева вывода
- •Краткие теоретические сведения
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Лабораторная работа № 4 Генерация и оптимизация объектного кода
- •Краткие теоретические сведения
- •1 Алгоритм генерации объектного кода по дереву вывода
- •Построение ассемблерного кода по дереву вывода
- •Построение списка триад по дереву вывода.
- •Оптимизация объектного кода методом свертки
- •Оптимизация объектного кода методом исключения лишних операций
- •Общий алгоритм генерации и оптимизации объектного кода
- •Порядок выполнения работы
- •Требования к оформлению отчета
- •Основные контрольные вопросы
- •Варианты заданий
- •Рекомендуемая литература
Формы записи грамматики
Форма Бэкуса-Наура
При описании синтаксиса конкретных языков программирования приходится вводить большое число нетерминальных символов, и символическая форма записи теряет свою наглядность. В этом случае применяют форму Наура-Бэкуса (ФНБ), которая предполагает использование в качестве нетерминальных символов комбинаций слов естественного языка, заключенных в угловые скобки, а в качестве разделителя - специального знака, состоящего из двух двоеточий и равенства. Например, если правила <L><L> и <L><E> записаны в символической форме, и символ <L> соответствует синтаксическому понятию "список", а символ <E> - "элемент списка", то их можно представить в форме Наура-Бэкуса так:
<список>::= <элемент списка><список>, <список>::= <элемент списка>.
Чтобы сократить описание схемы грамматики, в ФБН разрешается объединять правила c одинаковой левой частью в одно правило, правая часть которого должна включать правые части объединяемых правил, разделенные вертикальной чертой. Используя объединение правил, для рассматриваемого примера получаем:
<список>::=<элемент списка><список>|<элемент списка>.
Один из наиболее распространенных способов описания синтаксиса языка – это форма Бэкуса-Наура (Backus J.W., Naur P.)[19]. Этот способ был разработан для описания Алгола-60, однако, в дальнейшем он использован для многих других языков. При записи грамматики в форме Бэкуса-Наура используются два типа объектов:
• основные символы (или терминальные символы, в частности, ключевые слова)
• металингвистические переменные (или нетерминальные символы),
значениями которых являются цепочки основных символов описываемого языка. Металингвистические переменные изображаются словами (русскими или английскими), заключенными в угловые скобки (<...>)
металингвистические связки (::=, |)
Итерационная форма
Для получения более компактных описаний синтаксиса применяют итерационную форму описания. Такая форма предполагает введение специальной операции, которая называется итерацией и обозначается парой фигурных скобок со звездочкой. Итерация вида {a}* определяется как множество, включающее цепочки всевозможной длины, построенные с использованием символа a, и пустую цепочку.
{a}* = {$, a, aa, aaa, aaaa,...}.
Иcпользуя итерацию для описания множества цепочек, задаваемых символическими правилами, для списка получаем:
<L><E> {<E>}*.
Например, описание множества цепочек, каждая из которых должна начинаться знаком # и может состоять из произвольного числа букв x и y, может быть представлено в итерационной форме так:
<I>#{x | y}* .
В итерационных формах описания наряду с итерационными cкобками часто применяют квадратные скобки для указания того, что цепочка , заключенная в них, может быть опущена. С помощью таких скобок правила:
<A>x<A>y<B>z и <A>x<B>z
могут быть записаны так:
<A>x[<A>y]<B>z.
Форма Бэкуса-Наура не позволяет задавать контекстные условия. При использовании формы Бэкуса-Наура контекстные условия задаются в словесной форме. Аббревиатура BNF как Backus-Naur-Form (БНФ), а ранее она означала Backus-Normal-Form
Вернёмся к нашему предложению и опишем его метаязыком в БНФ
Пусть синтаксис или грамматика заданы следующими правилами
<предложение> ::= < прилагательное >< подлежащее >< сказуемое >< существительное >
Эта грамматика допускает лишь первый вариант предложения и не допускает второго варианта с другой семантикой.
Таким образом, на этом примере видно, что синтаксис может влиять на семантику, т.е. определять смысловое содержание предложения.
При определении синтаксиса языков Pascal и Modula-2 использовал расширенную форму Бэкуса-Наура (EBNF):
• Нетерминалы записываются как отдельные слова
• Терминалы записываются в кавычках, например, “BEGIN”
• Вертикальная черта ( | ), как и прежде, используется для определения альтернатив
• Круглые скобки используются для группировки
• Квадратные скобки используются для определения возможного вхождения символа или группы символов
• Фигурные скобки используются для определения возможного повторения символа или группы символов
• Символ равенства используется вместо символа
• Символ точка используется для обозначения конца правила
• Комментарии заключаются между символами (* … *)
• эквивалентно [ ]
Пример:
Целое = Знак ЦелоеБезЗнака.
ЦелоеБезЗнака = Цифра {Цифра}.
Знак = ["+"|"–"].
Цифра = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9".
В 1981 году Британский институт стандартов (British Standards Institute) опубликовал стандарт EBNF. BSI стандарт получился более наглядным, чем расширенная форма Бэкуса-Наура, предложенная Виртом.
Элементы правил разделяются запятыми
Правила заканчиваются точкой с запятой
Пробелы не являются значащими
Пример.
Константа = "CONST",
Идентификатор Константы , "=", Выражение Константы, ";",
{Идентификатор Константы, "=", Выражение Константы, ";"};
Идентификатор Константы = identifier;
Выражение Константы == Выражение;
Существуют и другие формы представления грамматик, например ван Вейнгаардена., которые использовались для описания синтаксиса ALGOL 68. Грамматику ван Вейнгаардена называют еще метаграмматикой.