- •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.3.4. Расширенный вывод для ат-грамматики
В качестве иллюстрации описанного способа обработки атрибутов рассмотрим изображение расширенного вывода в грамматике Г 5. 5. Такой вывод включает не только терминальные, нетерминальные и операционные символы, но и атрибуты, значения которых еще не определены. Для отображения связей между атрибутами, соответствующих операциям присваивания, воспользуемся линейным выводом. Такой вывод строится следующим образом:а) Переместим атрибуты с позиции индексов в строку и поместим их непосредственно за соответствующим символом грамматики.б) Каждому копирующему правилу, которое соответствует шагу отложенных вычислений, поставим в соответствие дугу, связывающую в цепочки вывода источник и приемник, и направленную от источника к приемнику.в) Множественным копирующим правилам поставим в соответствие в выводимой цепочке последовательность дуг, связывающих источник с приемниками.г) Если в процессе вывода атрибут получает значение, то это значение запишем в выводимую цепочку вместо имени атрибута, а соответствующую дугу удалим.д) При замене нетерминального символа в выводимой цепочке он удаляется, но его атрибуты должны остаться на месте.Линейный вывод цепочки с/1+с/2*с/3 в грамматике Г 5. 5 можно представить в следующем виде:
В приведенном выводе атрибут каждого заменяемого нетерминального символа сохраняется в цепочке вывода. Подстановка символа с определенным значением атрибута при выполнении шагов 6, 9, 10 приводит к исключению из цепочки вывода всех промежуточных атрибутов, определяющих пути передачи значения. Шаги 11 и 12 введены только для того, чтобы показать, как операционные символы влияют на определение значений атрибутов. В общем случае эти шаги можно совместить с шагом 10.
5.4. Атрибутные преобразователи ( ап )
Атрибутные описания, рассмотренные в предыдущем разделе, являются обобщением синтаксически-ориентированного способа описания перевода, показывающим возможность совмещения семантических вычислений с процессом синтаксического анализа, а описанные в настоящем разделе правила работы и построения атрибутного преобразователя демонстрируют возможность практического использования таких описаний при построении компиляторов для искусственных языков. Рассматриваемые АП строятся на основе нисходящих символьных преобразователей, поэтому их называют нисходящими атрибутными преобразователями. Такие преобразователи позволяют выполнять в процессе работы такие действия, как, например, выделение памяти для промежуточных результатов, заполнение полей таблиц и проверку контекстных условий. Естественно, что расширение функциональных озможностей по сравнению с символьными преобразователями достигается за счет усложнения структуры и правил работы АП. Эти усложнения, в основном, являются следствием необходимости сохранения и определения значений атрибутов в магазине в процессе работы АП.
5.4.1. Представление правил lat-грамматики в магазине.
Рассмотренное графическое изображение вывода в LАТ -грамматике является основой для программной реализации атрибутного преобразователя (АТ - преобразователя). Построение преобразователя начнем с того, что установим соответствие между графическим представлением правой части каждого правила LАТ-грамматики и его представлением в памяти, полагая, что в качестве памяти используется магазин. Базой для задания такого соответствия могут служить следующие положения: а) каждому терминальному, нетерминальному и опреационному символам выделим один элемент памяти в магазине, в который запишем соответствующий символ, б) каждому атрибуту, содержащемуся в правилах грамматики, отведем элемент памяти магазина, в который может быть записано либо значение атрибута, если оно определено, либо указатель на элемент магазина, в который следует записать значение атрибута, если оно еще не определено, в) величина указателя для атрибута с неопределенным значением определяется правилами вычисления атрибутов в форме простого присваивания и соответствует стрелкам в графическом изображении вывода, г) порядок расположения символов в магазине должен строго соответствовать их порядку следования в правиле грамматики , и символы, входящие в правила грамматики, должны располагаться так, чтобы каждый символ, стоящий слева, находился в магазине над символом, стоящим справа. В качестве иллюстрации приведенных положений представим расположение в магазине символов правой части правила
E%d E%e+T%f{сложить}/x/y%z x=e; y=f; d=z;
следующим образом:
На рисунке атрибут левой части правила d расположен непосредственно под самым правым символом правой части правила,что соответствует построению левого вывода грамматики в магазине. Действительно, если заменять нетерминальные символы в вершине магазина правой частью правила грамматики, оставляя его атрибуты в магазине, то самый правый символ заменяющего правила окажется непосредственно над атрибутами удаляемого нетерминала.