- •Теория языков программирования и методы трасляции
- •1. Цель работы
- •2. Основные понятия и термины
- •3. Описание и ввод грамматики
- •Проверка и трансляция набранной грамматики
- •Проверка синтаксиса грамматики
- •Трансляция грамматики и запуск sag
- •Разбор цепочек по созданной грамматике
- •Задания
- •Подготовка к лабораторной работе
- •Порядок выполнения работы
- •Содержание отчета
- •Защита лабораторной работы
- •Контрольные вопросы
3. Описание и ввод грамматики
В комплект программы входит текстовый редактор, с помощью которого можно вводить грамматику. Для входа в редактор перейдите в папку программы и запустите файл SAG ScilicetEditor ScilicetEditor.exe. Этот редактор настроен на автоматический запуск анализатора SAG. Так же он подсвечивает синтаксис вводимых конструкций.
Окно текстового редактора для ввода грамматики
Грамматика описывается при помощи нотации Бакуса-Наура. Терминальные символы заключаются в кавычки. Терминальные и нетерминальные символы могут состоять из нескольких литер. Внутри многолитерных символов не должны встречаться специальные символы, в том числе и пробелы. Правила грамматики записывается в виде
нетерминальный_символ = цепочка
Каждое определение нетерминального символа должно заканчиваться знаком точки с запятой (;).
Между символами =, а также между нетерминальными символами допускается любое число пробелов. Описание грамматики должно начинаться с правила, определяющего начальный символ (аксиому) грамматики. В тексте описания грамматики можно использовать комментарии. Комментарий начинается с двух слешей (//) и продолжается до конца строки.
В терминальных символах можно использовать следующие обозначения:
\r – перевод каретки (символ с кодом 10);
\n – возврат каретки (символ с кодом 13);
\t – знак табуляции;
\\ – знак обратного слеша;
\’ – одинарная кавычка;
\” – двойная кавычка.
Атрибутные правила записываются внутри фигурных скобок и разделяются точками с запятой (;). Внутри атрибутных правил обращения к атрибутам записываются в виде
нетерминальный_символ . название_атрибута
Сами атрибутные правила должны выглядеть так:
атрибут = выражение_с_атрибутами
В выражениях допустимо использовать математические операции «+», «–» , «*» , «/» и операцию объединения строк «&». Кроме того, ко всем успешно разобранным нетерминальным символам сразу после их разбора анализатор добавляет атрибут text, в который помещает ту часть исходной цепочки, которая соответствует рассматриваемому нетерминальному символу. Этот атрибут в дереве разбора скрыт (какая часть цепочки соответствуем нетерминальному символу легко узнать, выполнив щелчок левой кнопкой мыши по узлу дерева).
К названиям нетерминальных символов допустимо приписывать числовой суффикс для различения этих символов в атрибутных правилах. Это требуется, если один и тот же нетерминальный символ встречается в правиле более одного раза и есть атрибутное правило, ссылающееся на него (см. листинг 1, правило 4).
Пустые цепочки следует задавать предопределённым нетерминальным символом _EMPTY. Для упрощения задания непустых буквенно-цифровых последовательностей можно применять встроенный нетерминальный символ _TEXT.
Рассмотрим пример грамматики для распознавания объявлений переменных в стиле языка Си с сохранением типов данных для каждой переменной. Пример такой грамматики показан в листинге 1.
Листинг 1. Пример грамматики.
VarBlock = VarRule VarBlock;
VarBlock = _EMPTY;
VarRule = Type { Var.type = Type.text; VarList.type = Type.text } ' ' Var VarList ';' SPACE;
VarList = { Var.type = VarList.type; VarList2.type = VarList.type } ',' SPACE Var VarList2;
VarList = _EMPTY;
Type = _TEXT;
Var = _TEXT;
Number = _TEXT;
SPACE = ' ';
SPACE = '\n';
SPACE = _EMPTY;
После того как грамматика набрана, она должна быть сохранена. Имя файла выбирается произвольно, расширение должно быть lat.