- •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.1.5. Пример использования ат-грамматики
Чтобы показать, как используются наследуемые атрибуты и как АТ-грамматики можно применять при конструировании компиляторов, рассмотрим процесс обработки описаний переменных в некотором гипотетическом языке программирования. Допустим, что описание переменных имеет вид:
int X,Y,Z
и условимся, что после обработки пакета описания на входном языке лексический анализатор строит таблицу символьного представления идентификаторов (ТС) и таблицу переменных (ТП). Каждый элемент таблицы переменных состоит из двух полей. В первое поле заносится указатель на строку ТС, в которой хранится идентификатор переменной, а во втором поле должен храниться указатель на строку таблицы значений (ТЗ), в которой должно находиться значение переменной. Связи между этими таблицами показаны на следующем рисунке:
На рисунке цифрами обозначены указатели на элементы соответствующих таблиц, а пунктирными линиями показаны указатели, значения которых должны быть записаны в ТП после синтаксического анализа. В результате обработки входной строки лексический анализатор заменяет идентификаторы лексемами, каждая из которых состоит из указателя класса переменных (V) и наследуемого атрибута, представляющего собой указатель на соответствующую строку ТП, и входная строка приобретает вид:
int V/10,V/12,V/14
5.2. Cинтаксический анализ, с использованием ат-грамматики
5.2.1. Процесс синтаксического анализа
Допустим, что задачей синтаксического анализа такой цепочки является выделение каждой переменной элемента памяти в виде строки ТЗ и занесение указателя этой строки в ТП. Исходными данными для выполнения этих действий является указатель на первый свободный элемент ТЗ. После завершения обработки описаний этот указатель должен изменить значение. Новое значение должно определять первый свободный элемент ТЗ после выделения памяти для переменных.Синтаксис цепочек рассматриваемого вида может быть задан следующей грамматикой с начальным символом <D>.
<D> int V <R> <R> , V <R> <R> $
Начальному символу <D> придадим два атрибута: наследуемый атрибут /b, начальное значение которого зададим в виде указателя на первый свободный элемент ТЗ, и синтезируемый атрибут %a, значением которого должен быть указатель на новый свободный элемент ТЗ после выделения памяти для переменных.Нетерминальному символу <R>, обозначающему продолжение списка также припишем два атрибута. Один атрибут /g должен быть наследуемым. Он должен передавать значение указателя на ТЗ следующему правилу при выводе. Другой атрибут %f- синтезированный. Он должен использоваться для передачи на выход указателя на первый свободный элемент после выделения памяти переменным. Для каждой переменной в описании нужно указатель на свободный элемент ТЗ записать в соответствующее поле ТП. Допустим, что эти действия выполняет символ действия ФОРМирование Указателя (ФОРМУ), который имеет два наследуемых атрибута, первый из которых определяет положение переменной в ТП, а второй является указателем на первый свободный элемент ТЗ. В простейшем случае указатель на элемент ТЗ для следующей переменной может быть получен путем прибавления единицы к предыдущему значению. В общем случае это может быть не так, поэтому примем, что новое значение указателя ТЗ определяется специальной функцией без аргументов СЛЕДующий УКазатель (СЛЕДУК),
Учитывая сказанное выше, грамматику, задающую перевод описаний значения таблицы ТП, можно записать так:
Г 5. 1 :
D%a/b int V/c{ФОРМУ}/d/eR%f/g
!! d := C; e := b; a := f; g := СЛЕДУК;
R%h/k , V/l{ФОРМУ}/m/nR%j/p
!! m := l; n := k; h := j; p := СЛЕДУК;
R%q/r $
!! q := r;
Построим с помощью правил этой грамматики совмещенный вывод цепочкиint V/10,V/12,V/14, записывая, справа от выводимой цепочки, отложенные вычисления, а под цепочкой – получаемые значения атрибутов. В качестве начального значения наследуемого атрибута b возьмем значение 44.
Результаты вывода Отложенные вычисления
1. D%a/442. int V/10{ФОРМУ}/10/44R%f/45 d := 10; e := 44; g := 45 a = f3. int V/10,{ФОРМУ}/10/44/,V/12{ФОРМУ} /12/45R%j/46 m = 12, n = 45, p = 46; a = f; f = j;4. int V/10,{ФОРМУ}/10/44,V/12,{ФОРМУ} /12/45,V/14{ФОРМУ}/14/46R%j'/47, m' = 14, n' = 46; p' = 47 a = f; f = j; j = j'5. int V/10,{ФОРМУ}/10/44,V/12,{ФОРМУ} /12/45,V/14{ФОРМУ}/14/46 a = f; f = j; j = j'; j' = 47; a = 47
В каждой строке приведенного примера показаны результаты очередного шага вывода, которые могут содержать символы действия с найденными значениями атрибутов. Учитывая, что атрибуты правой части каждого правила являются независимыми величинами, при повторном применении второго правила грамматики для обозначения атрибутов были использованы переменные с апострофами. Приведенные примеры показывают, что результатом вывода с помощью правил атрибутной грамматики является цепочка, состоящая из символов действия и входных символов, каждому из которых приписаны значения атрибутов. Если из заданной АТ-грамматики Г удалить все атрибуты, то получим транслирующую грамматику Г', а из каждой цепочки, выведенной в грамматике Г после удаления всех атрибутов, может быть получена цепочка, выводимая в грамматике Г'. Основываясь на этом соответствии, назовем множество пар, состоящих из цепочки входных символов, снабженных атрибутами, и цепочки выходных символов, имеющих атрибуты, атрибутным переводом, определяемым заданной атрибутной грамматикой.