- •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. Резюме
3.13. Построение slr(1)-распознавателя
Рассмотрим еще один пример построения распознавателя для следующей грамматики, не содержащей аннулирующих правил.
Г 3. 14 : <I> t<A1> <A> <A2>, <B2> <A> <B3> <B> a <B> b
После построения функций ВПЕРВиВПОСЛЕдля данной грамматики, получаем таблицу переходов в виде:
|
Таблица 7.6 | |||||||
|
|
t |
, |
a |
b |
<I> |
<A> |
<B> |
|
h0 |
t |
|
|
|
<I0> |
|
|
|
<I0> |
|
|
|
|
|
|
|
|
<A1> |
|
|
|
|
|
|
|
|
t |
|
|
a |
b |
|
<A1><A2> |
<B3> |
|
<A2> |
|
, |
|
|
|
|
|
|
, |
|
|
a |
b |
|
|
<B2> |
|
<B2> |
|
|
|
|
|
|
|
|
<B3> |
|
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
b |
|
|
|
|
|
|
|
Это недетерминированная таблица, поэтому введем обозначение <Ax> = (<A1>, <A2>)и преобразуем ее к детерминированному виду. В результате имеем:
|
Таблица 7.7 | |||||||
|
|
t |
, |
a |
b |
<I> |
<A> |
<B> |
|
h0 |
t |
|
|
|
<I0> |
|
|
|
<I0> |
|
|
|
|
|
|
|
|
<Ax> |
|
, |
|
|
|
|
|
|
t |
|
|
a |
b |
|
<Ax> |
<B3> |
|
, |
|
|
a |
b |
|
|
<B2> |
|
<B2> |
|
|
|
|
|
|
|
|
<B3> |
|
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
b |
|
|
|
|
|
|
|
Продолжая построение в соответствии с описанной процедурой, мы столкнемся с противоречием при заполнении строк таблицы действий для строки, помеченной символом <Ax>. Поскольку<Ax>содержит грамматическое вхождение<A1>, являющееся самым правым символом правила 1, то нужно было бы записать в рассматриваемую строку таблицы действий операцию Свертка (1). Однако, в множестве<Ax>содержится также грамматическое вхождение<A2>, которое не является самым правым символом правила 2. Для такого символа данную строку таблицы действий нужно заполнить операцией Перенос. Обнаруженное противоречие показывает, что грамматикаГ 3. 14не является LR(0)-грамматикой, и что построить LR(0)-распознаватель с помощью описанной процедуры невозможно. Попробуем теперь проверить, нельзя ли построить для заданной грамматики SLR(1)-распознаватель. Построение такого распознавателя отличается от описанного выше тем, что заполнение таблицы действий выполняется не целыми строками, а каждый элемент строки строится отдельно, и при этом учитываются только те символы, которые могут следовать за рассматриваемым в выводных цепочках. В нашем примере при построении строки таблицы действий для символа<Ax>в столбец, отмеченный символом запятая запишем операцию Перенос, поскольку в таблице переходов в строке<A2>и столбце с запятой находится грамматический символ. В столбец, отмеченный символом конца строки, занесем операцию Свертка (1), поскольку за символом<A1>может следовать только символ. Последнее утверждение вытекает из того, чтоСЛЕД(<I>) = {}. Учитывая, что
СЛЕД(<B>) = { , , }
СЛЕД(<A>) = { , , }
получаем таблицу действий для искомого распознавателя в виде:
|
Таблица 7.8 | |||||
|
|
t |
, |
a |
b |
|
|
h0 |
П |
|
|
|
|
|
<I0> |
|
|
|
|
Д |
|
<Ax> |
|
П |
|
|
С(1) |
|
t |
|
|
П |
П |
|
|
, |
|
|
П |
П |
|
|
<B2> |
|
С(2) |
|
|
С(2) |
|
<B3> |
|
С(3) |
|
|
С(3) |
|
a |
|
С(4) |
|
|
С(4) |
|
b |
|
С(5) |
|
|
С(5) |
Эта таблица вместе с таблицей 7.6задает SLR(1)–распознаватель, который работает по тем же правилам, что и LR(0)–распознаватель. Незаполненные клетки таблицы соответствуют операции Отвергнуть.
Процедура построения SLR(1)–распознавателя отличается от процедуры построения LR(0)–распознавателя содержанием только одного пункта 5, который можно описать так:
Таблица действий заполняется поэлементно для каждой строки, отмеченной маркером дна или множеством грамматических вхождений Q, следующим образом:
а) Если Q содержит начальное вхождение, то в столбец, помеченный маркером входной строки, занести операцию Допустить. б) Если Q содержит грамматическое вхождение R i j, не являющиеся самым правым вхождением никакого правила, и если элемент таблицы переходов для этого символа Ri j и некоторого символа грамматики S не является пустым, то в элемент таблицы действий соответствующей паре ( Ri j, S) заносится операция Перенос. в) Если Q содержит самое правое грамматическое вхождение p цепочкиправила<A> с номеромk, то для каждого входного символаx СЛЕД(<A>)в элемент таблицы действий, соответствующий паре(p,x), заносится операция Свертка (k).
Если в результате выполнения описанного выше пункта 5 удастся построить таблицу действий, то это означает, что заданная грамматика является грамматикой SLR(1), а построенный автомат SLR(1)-распознавателем. Все описанные выше процедуры построения распознавателей применимы к неукорачивающим грамматикам. Они являются также базой для построения восходящих распознавателей для укорачивающих грамматик. Однако эти процедуры должны быть дополнены правилами построения, учитывающими наличие аннулирующих правил.
![]()
