- •1. Формальные языки и грамматики
- •1.1. Введение
- •1.1.1. Трансляторы , интерпретаторы и компиляторы
- •1.1.2. Стадии работы компилятора
- •1.1.3. Построение компилятора
- •1.2.2. Примеры, иллюстрирующие первичные понятия
- •1.2.3. Пустой язык
- •1.2.4. Резюме
- •1.3. Типы формальных языков и грамматик
- •1.3.1. Грамматики типа 0
- •1.3.2. Грамматики типа 1
- •1.3.3. Грамматики типа 2
- •1.3.4. Грамматики типа 3
- •1.3.5. Вывод в кс-грамматиках и правила построения дерева вывода
- •1.3.6. Синтаксический разбор
- •1.3.7. Левый и правый выводы
- •1.3.8. Неоднозначные и эквивалентные грамматики
- •1.3.9. Резюме
- •1.4. Способы задания схем грамматик
- •1.4.1. Форма Наура-Бэкуса
- •1.4.2. Итерационная форма
- •1.4.3. Синтаксические диаграммы
- •1.4.4. Резюме
- •1.5. Построение грамматик и грамматики, описывающие основные конструкции языков программирования
- •1.5.1. Рекомендации по построению грамматик
- •1.5.2. Описание списков
- •1.5.3. Пример построения грамматик
- •1.5.4. Грамматики, описывающие целые числа без знака и идентификаторы
- •1.5.5. Грамматики для арифметических выражений
- •1.5.6. Грамматика для описаний
- •1.5.7. Грамматика, задающая последовательность операторов присваивания
- •1.5.8. Грамматики, описывающие условные операторы и операторы цикла
- •1.5.9. Резюме
- •2. Контекстно-свободные грамматики и автоматы.
- •2.1 Приведенные грамматики.
- •2.2 Определение непроизводящих символов.
- •2.3 Определения недостижимых символов.
- •2.5 Исключение леворекурсивных правил.
- •2.6 Исключение цепных правил.
- •2.7 Преобразование неукорачивающих грамматик.
- •2.8 Магазинные автоматы.
- •2.9 Работа магазинного автомата.
- •2.10. Язык, допускаемый магазинным автоматом.
- •2.11 Построение магазинного автомата.
- •2.12 Пример построения автомата.
- •2.13 Резюме.
- •3. Нисходящие распознаватели.
- •3.1 Распознаватели и ll(k) - грамматики
- •3.3 Построение детерминированного нисходящего распознавателя.
- •3.4 Множество выбора.
- •3.4.1 Функции перв, след и множество выбор.
- •3.4.4 Построение множества выбор.
- •3.5 Слаборазделенные грамматики
- •3.6 Ll(1) - грамматики.
- •3.7 Построение магазинного автомата.
- •3.8 Преобразование грамматик к виду ll(1).
- •3.8.1 Исключение леворекурсивных правил.
- •3.8.2 Выделение общих частей.
- •3.9. Резюме.
- •3.11. Восходящие распознаватели.
- •3.11.1. Расширенный магазинный автомат
- •3.11.2. Пример работы расширенного магазинный автомат
- •3.12. Lr(k)-грамматики
- •3.12.1. Построение таблиц распознавателя. Алгоритм работы распознавателя.
- •3.12.2. Пример построения lr(0)-распознавателя
- •3.13. Построение slr(1)-распознавателя
- •3.14. Восходящие распознаватели для грамматик с аннулирующими правилами
- •3.15. Резюме.
- •4.3. Магазинные Преобразователи.
- •4.3.1. Определение магазинного преобразователя.
- •4.3.2. Описание работы магазинного преобразователя.
- •4.3.3. Перевод определяемый преобразователем.
- •4.3.4. Построение преобразователя.
- •4.3.5. Пример построения преобразователя.
- •4.3.6. Порядок построения детерминированного магазинного преобразователя.
- •5. Атрибутные транслирующие грамматики
- •5.1. Атрибутные транслирующие грамматики.
- •5.1.1. Атрибутные транслирующие грамматики.
- •5.1.2. Определение ат-грамматик
- •5.1.3. Пример ат-грамматики
- •5.1.4. Демонстрация вычисления значений атрибутов с левым выводом
- •5.1.5. Пример использования ат-грамматики
- •5.2. Cинтаксический анализ, с использованием ат-грамматики
- •5.2.1. Процесс синтаксического анализа
- •5.2.2. Пример использования ат-грамматики.
- •5.3.2. Форма простого присваивания ат-грамматик
- •5.3.3. Преобразование lат-грамматики в lат-грамматику в форме простого присваивания.
- •5.3.4. Расширенный вывод для ат-грамматики
- •5.4. Атрибутные преобразователи ( ап )
- •5.4.1. Представление правил lat-грамматики в магазине.
- •5.4.2. Построение инструкций ап.
- •5.4.3. Описание работы ап
- •5.4.4. Порядок построения ап
- •5.4.5. Пример построения ап
- •5.4.6. Демонстрация работы ап
- •5.4.7. Построение восходящих атрибутных преобразователей
- •9.1 Структурный синтез синхронных автоматов .
- •9.1.1.1 Обобщенная структурная схема автомата.
- •9.1.1.3 Структурная схема на элементах импульсного типа.
- •9.1.2 Основные этапы структурного синтеза.
- •9.1.3 Типы элементов памяти.
- •9.1.4 Построение функций возбуждения.
- •9.1.5 Примеры структурного синтеза.
- •9.1.5.1 Пример 1
- •9.1.6 Кодрование состояний с использованием соседей первого и второго рода.
- •9.1.7 Кодирование с числом элементов памяти, равным числу состояний .
- •9.1.8 Структурные схемы с дешифратором.
- •9.1.10 Структурные схемы, использующие типовые блоки цифровых устройств.
- •9.1.10.1 Структурная схема с запоминанием входного слова.
- •9.1.10.2 Структурная схема на основе счетчика.
- •9.1.10.3 Структурная схема на основе регистра со сдвигом.
- •9. Асинхронные автоматы
- •9.2 Общие положения.
- •9.2.1. Описание работы асинхронного автомата
- •9.2.2. Состязание элементов памяти
- •9.2.3.1 Универсальный способ кодирования
- •9.2.3.2. Эвристический способ кодирования
- •9.2.4. Связь асинхронного автомата с внешней средой
- •9.2.5. Построение элементов памяти
- •9.2.5.1. Асинхронный триггер
- •9.2.5.2. Асинхронный s-триггер
- •9.2.5.3. Триггеры с синхронизацией
- •9.2.6. Триггеры с задержкой
- •9.2.6.2 Асинхронный триггер j-k с задержкой
- •9.2.6.3. Триггер j-k с задержкой и синхронизацией
- •9.2.6.4. Триггер d-V с задержкой и синхронизацией
- •9.2.7. Резюме
5.2.2. Пример использования ат-грамматики.
Рассмотрим еще один пример использования АТ-грамматик. Допустим, что необходимо описать процесс трансляции инфиксных выражений без скобок, построенных из идентификаторов и бинарных операций сложения и вычитания, синтаксис которых задается схемой следующей грамматики.
Г 5. 2 :<E> i<R>,
<R> +i<R>, <R> -i<R>, <R> .
В приведенных правилах символ i представляет идентификатор переменной, значением которого является указатель на элемент таблицы переменных (ТП). Результатом трансляции выражений, порождаемых этой грамматикой, должна быть последовательность операторных символов - атомов, определяющих как последовательность действий, так и операнды каждого действия. Учитывая это обстоятельство, зададим требуемый перевод в виде следующей грамматики.
Г 5. 3 : <E> i<R>,
<R> +i{СЛОЖ}<R>, <R> -i{ВЫЧИТ}<R>, <R> .
Символы действия в правилах этой грамматики расположены так, чтобы результат можно было передать на выход, как только будут построены оба операнда рассматриваемой операции. Чтобы обеспечить передачу на выход не только символов операций, но и указателей на переменные, с которыми выполняются операции, припишем символам грамматики атрибуты и построим АТ-грамматику. Каждому символу, обозначающему идентификатор, припишем атрибут, представляющий указатель на ТЗ. Каждому символу действия придадим три наследуемые атрибута, которые должны определять операнды и результат выполнения операции. При последовательном вычислении выражений образуются промежуточные результаты, которые необходимо сохранять на время подготовки следующего операнда. Условимся о том, что промежуточные результаты должны сохраняться в таблице значений (ТЗ). Для записи промежуточного результата нужно иметь указатель на очередной свободный элемент ТЗ и изменять его значение после того, как запись произведена. Для изменения этого указателя воспользуемся введенной в предыдущем примере функцией СЛЕДУК. Если рассматриваемая грамматика описывает трансляцию подвыражений, являющихся частью других конструкций языка, то после построения арифметического выражения в ТЗ могут записываться другие величины. Следовательно, после трансляции выражения кроме последовательности атомов необходимо в качестве результата получить указатель на первый свободный элемент ТЗ после выделения места в ней для записи промежуточных результатов. Чтобы получить такой указатель, припишем начальному символу грамматики <E> один синтезируемый атрибут %a и один наследуемый атрибут /b. Начальное значение наследуемого атрибута должно быть указателем на первый свободный элемент ТЗ до записи промежуточных результатов. Значение синтезируемого атрибута должно быть сформировано при завершении трансляции и быть равным указателю на первый свободный элемент ТЗ после записи промежуточных результатов. Нетерминальный символ грамматики <R> используется для передачи первого операнда каждой выполняемой операции. Чтобы осуществить передачу указателя на этот операнд, припишем <R> наследуемый атрибут /с. Учитывая, что первый операнд может быть промежуточным результатом, который был записан в ТЗ, припишем <R> еще один наследуемый атрибут /d для передачи на следующий шаг вывода указателя на очередной свободный элемент ТЗ, а для того, чтобы передать на выход значение указателя на первый свободный элемент ТЗ после завершения трансляции, припишем ему еще один синтезируемый атрибут %e. Полагая, что формирование элементов таблицы ТЗ выполняется символами действия, схему искомой АТ-грамматики можно представить в виде:
Г 5. 4 :
<E>%a/b i/x<R>%e/c/d !! c = x; a = b; a =e; <R>%e1/c1/d1 +i/x1{СЛОЖ/f1/g1/h1}<R>%e2/c2/d2 !! f1 = c1; g1 = x1; h1 = d1; c2 = d1; d2 = СЛЕДУК; e1 = e2; <R> %e3/c3/d3 -i/x2{ВЫЧИТ/f2/g2/h2}<R>%e4/c4/d4 !! f2 = c3; g2 = x2; h2 = d3; c4 = d3; d4 = СЛЕДУК; e3 = e4; <R>%e5/c5/d5 . !! e5 = d5;
Чтобы получить результат трансляции входной цепочки i-i+i для идентификаторов с указателями 22, 24, 26 и указателем первого свободного элемента ТЗ, равным 28, построим вывод в грамматике Г5.4.
Вывод Отложенные вычисления
1. <E>%a/282. i/22<R>%e/c/d !! c = 22; d = 28; a = e; 3. i/22-i/24{ВЫЧИТ/f2/g2/h2}<R>%e4/c4/d4 !! f2 = 22; g2 = 24; h2 = 28; c4:= 28; !! d4 =30; a = e; e = e4; 4. i/22-i/24{ВЫЧИТ/22/24/28}+i/26 {СЛОЖ/f1/g1/h1}<R>%e2/c2/d2 !! f1 = 28; g1 = 26; h1 = 30; c2 = 30; !! d2 = 32; a = e; e = e4; e4 = е2; 5. i/22-i/24{ВЫЧИТ/22/24/28}+i/26 {СЛОЖ/26/28/30}. !!e2 = 32; a = 32;
Приведенный вывод показывает, что значение синтезируемого атрибута нетерминала <R> определяется только на пятом шаге вывода с помощью присваивания e2 = 32, которое приводит к выполнению цепочки незавершенных вычислений. Результатом этих вычислений является определение атрибута начального символа a = 32, который является одним из результатов трансляции.
5.3. L - атрибутные транслирующие грамматики
5.3.1. L - атрибутные транслирующие грамматики
Задачей настоящего раздела является не только знакомство с атрибутными описаниями переводов, но и с нисходящими атрибутными преобразователями. Они должны обрабатывать цепочки входных символов с атрибутами и для каждой входной цепочки либо строить выходную цепочку в качестве ее перевода, либо отвергать ее, как не принадлежащую входному языку. Такие устройства должны обеспечивать вычисление атрибутов в ходе нисходящего разбора. Возможность такой обработки предоставляет не всякая АТ-грамматика, а только грамматики, отвечающие определенным требованиям, которые выражаются в виде ограничений как на характер зависимости атрибутов правил грамматики, так и на вид правил вычисления атрибутов. Вначале рассмотрим подкласс атрибутных транслирующих грамматик с ограничениями на зависимости атрибутов, обеспечивающими их вычисление при нисходящем разборе. Такие грамматики называются L - атрибутными транслирующими грамматиками (LАТ-грамматиками).
Определение. АТ-грамматика является L - атрибутной транслирующей грамматикой, если выполняются следующие три условия: 1) Каждый наследуемый атрибут символа правой части правила грамматики должен вычисляться с использованием либо наследуемых атрибутов символов левой части правила, либо с использованием произвольных атрибутов символов правой части правила, расположенных левее данного символа. 2) Каждый синтезируемый атрибут символа левой части правила грамматики должен вычисляться с использованием наследуемых атрибутов этого символа левой части правила или произвольных атрибутов символов правой части этого правила. 3) Каждый синтезируемый атрибут символа действия должен вычисляться по наследуемым атрибутам этого символа действия. |
Значение условия 1 состоит в том, что оно обеспечивает зависимость наследуемых атрибутов от величин, находящихся только слева от них в правиле грамматики (символ L в обозначении LАТ-грамматики - это сокращение от Left - левый). Это условие позволяет обрабатывать атрибуты сверху вниз, потому что каждый символ обрабатывается до того, как прочитаны символы справа от него. Условия 2 и 3 обеспечивают исключение круговых зависимостей атрибутов. Все три условия, взятые вместе, приводят к следующему порядку вычисления атрибутов для правила вида
<A> <B><C>:
1) наследуемые атрибуты <A>,2) наследуемые атрибуты <B>,3) синтезируемые атрибуты <B>,4) наследуемые атрибуты <C>,5) синтезируемые атрибуты <C>,6) синтезируемые атрибуты <A>.
Чтобы убедиться в том, что заданная АТ-грамматика обладает свойствами LАТ-грамматики, нужно проверить для каждого правила грамматики выполнение условий 1 и 2, а также для каждого символа действия - выполнение условия 3. Такая проверка заключается в анализе зависимостей атрибутов для каждого правила их вычисления. В качестве иллюстрации выполним анализ возможных зависимостей атрибутов, отвечающих описанным условиям, для следующего правила:
<A>/a1%x1%y1 <B>/b1<C>%x2<D>%y2/a2/b2<E>/a3
Анализ зависимостей этого правила должен заключаться в проверке того, что правила вычисления атрибутов b1, a2, b2, a3 должны удовлетворять условию 1, а правила вычисления атрибутов x1, y1 - условию 2. Согласно условию 1 правило вычисления атрибута b1 может использовать для вычисления только атрибут a1, поэтому такие правила могут, например, иметь вид:
b1 = f(a1) или b1 = 112 или (b1,b2) = a1.
Последнее из приведенных выражений обозначает множественное присваивание, когда двум величинам одновременно присваивается одно и то же значение.
Отметим также, что правила вычисления не могут иметь, например, следующий вид:
b1 = x1 или b1 = g(y2,b1).
Условие 1 для рассматриваемого правила позволяет использовать для вычисления атрибутов a2 и b2 в качестве аргументов величины a1, b1, x2, а при вычислении a3 аргументами могут быть a1, b1, x2, y2, a2, b2.
Согласно условию правила 2 при вычислении атрибутов x1 и y1 могут быть использованы любые атрибуты кроме самих x1, y1.
Условие 3 используется для проверки символов действия. Чтобы убедиться в его выполнении, нужно просмотреть список аргументов правил вычисления атрибутов и убедиться, что среди них нет синтезированных атрибутов.