- •1.1. Основные понятия
- •1.1.1. Трансляторы, интерпретаторы и компиляторы
- •1.1.2. Стадии работы компилятора
- •1.1.3. Построение компилятора
- •1.2. Определение формальной грамматики и языка
- •1.2.1. Первичные понятия
- •1.3.3. Грамматики типа 2
- •1.3.4. Грамматики типа 3
- •1.3.5. Вывод в КС-грамматиках и правила построения дерева вывода
- •1.3.6. Синтаксический разбор
- •1.3.7. Левый и правый выводы
- •1.3.8. Неоднозначные и эквивалентные грамматики
- •1.4. Способы задания схем грамматик
- •1.4.1. Форма Наура-Бэкуса
- •1.4.2. Итерационная форма
- •1.4.3. Синтаксические диаграммы
- •2. Контекстно-свободные грамматики и автоматы
- •2.1. Приведенные грамматики
- •2.2. Удаление непроизводящих символов
- •2.3. Определение недостижимых символов
- •2.4. Определение бесполезных символов
- •2.5. Исключение леворекурсивных правил
- •2.6. Исключение цепных правил
- •2.7. Преобразование неукорачивающих грамматик
- •2.8. Магазинные автоматы
- •2.9. Работа магазинного автомата
- •2.10. Язык, допускаемый магазинным автоматом
- •2.11. Построение магазинного автомата
- •2.12. Пример построения автомата
- •3. Нисходящие распознаватели
- •3.1. Распознаватели и LL(K) - грамматики
- •3.2. Разделенные грамматики
- •3.3. Построение детерминированного нисходящего распознавателя
- •3.4. Множество выбора
- •3.4.1. Функции ПЕРВ, СЛЕД и множество ВЫБОР
- •3.4.2. Построение функции ПЕРВ(µ)
- •3.4.3. Построение функции СЛЕД(<B>)
- •3.4.4. Построение множества ВЫБОР
- •3.5. Слаборазделенные грамматики
- •3.6. LL(1) - грамматики
- •3.7. Построение магазинного автомата
- •3.8. Преобразование грамматик к виду LL(1)
- •3.8.1. Исключение леворекурсивных правил
- •3.8.2. Выделение общих частей
- •3.9. Восходящие распознаватели
- •4. Методы трансляции
- •4.1. Основные понятия
- •4.2. Синтаксически управляемые схемы
- •4.3. Перевод, определяемый СУ - схемой
- •4.4. Простая СУ – схема
- •4.5. Построение простой СУ - схемы
- •4.6. Транслирующие грамматики
- •4.7. Входная и выходная грамматики заданной транслирующей граммагики
- •4.8. Построение транслирующей грамматики по СУ - схеме
- •4.8.1. Бесскобочные выражения
- •4.8.1.1. Префиксная польская запись (ПрПЗ)
- •4.8.1.2. Вычисление префиксных польских записей
- •4.8.1.3. Постфиксная польская запись
- •4.8.1.4. Вычисление постфиксных записей
- •4.9. Магазинные преобразователи
- •4.9.1. Определение магазинного преобразователя
- •4.9.2. Описание работы магазинного преобразователя
- •4.9.5. Пример построения преобразователя
- •4.9.6. Порядок построения детерминированного магазинного преобразователя
- •5.1. Определение AT-грамматик
- •5.2. Пример АТ-грамматики
- •5.3. Вычисление значений атрибутов с левым выводом
- •5.4. L - атрибутные транслирующие грамматики
- •5.4.1. Форма простого присваивания АТ-грамматик
- •5.4.2. Преобразование LАТ-грамматики в LАТ-грамматику в форме простого присваивания
- •5.4.3. Расширенный вывод для АТ-грамматики
2.9. Работа магазинного автомата
Определение. Конфигурацией автомата М называют тройку (s, α, γ) S x P* x H*, где s -
текущее состояние управляющего устройства, α - неиспользованная часть входной це-
почки α P*, самый левый символ этой цепочки a находится под головкой. Если a = ε,
то считается, что входная цепочка прочитана. γ - цепочка, записанная в магазине, γ H*,
самый правый символ цепочки считается вершиной магазина. Если γ = $, то магазин пуст.
Работа автомата может быть представлена как смена конфигураций. Один такт работы автомата заключается в определении новой конфигурации на основе исходной. Это записывается следующим образом:
( s, aα, γ h ) |-- ( s', α, γβ )
При этом предполагается, что автомат читает символ a, находящийся против головки, и символ h, находящийся в вершине магазина, определяет новое состояние s' и записывает цепочку β в магазин вместо символа h. Если β = $, то верхний символ оказывается удаленным из магазина.
Такая смена конфигураций возможна, если функция f( s, a, h ) определена и ей принад-
лежит значение ( s', β ). Описанный такт работы выполняется с перемещением головки. Для описания работы автомата без перемещения головки используется другой вид такта.
Если f0(s, ε, h) определена и ей принадлежит значение ( s', β ) , то он определяет смену конфигураций следующим образом:
( s, aα , γ h ) |-- ( s', aα , γβ )
Таким образом, возможны следующие случаи при работе автомата:
•f(s, a, h) определена и выполняется такт работы,
•f(s, a, h) не определена, но определена функция f0(s, ε, h) или f*(s, a, h) и выполняется пустой такт.
•Функции f(s, a, h), f*(s, a, h) и f0(s, ε, h) не определены, в этом случае дальнейшая работа автомата невозможна.
22
В общем виде действия, задаваемые функцией переходов и выполняемые автоматом, можно представить следующим образом:
f( s, <входной символ>, <магазинный символ> )=( s1, <заносимая цепочка> )
При выполнении такта вначале считывается символ в вершине магазина, а затем на его место записывается новый символ или цепочка. Отдельные значения функции переходов часто называют командами магазинного автомата.
Начальной конфигурацией называется конфигурация (sо, α , hо), где sо - начальное состояние и hо - маркер дна магазина, а заключительной - конфигурация (s, $ , $) , где s принадлежит множеству конечных состояний F.
Для обозначения последовательности сменяющих друг друга конфигураций используют обозначение |--*. Таким образом, последовательность
( s1, α1, γ1 ) |-- ( s2, α2, γ2) |-- ... |-- ( sn, αn, γn )
можно представить в сокращенном виде следующим образом:
( s1, α1, γ1 ) |--* ( sn, αn, γn ).
2.10. Язык, допускаемый магазинным автоматом
Определение. Цепочка α называется допустимой для автомата М, если существует последовательность конфигураций, в которой первая конфигурация является начальной c
цепочкой α , а последняя - заключительной (sо, α, hо) |--* (s1, $ , $), где s1 F. Определение. Множество цепочек, допускаемых автоматом М, называется языком, допускаемым или определяемым автоматом М, и обозначается L(М).
L(М)= {α ¦ ( sо, α, hо ) ¦--* ( s', $, $ ) & s' F }
Рассмотрим пример. Пусть задан магазинный автомат М1
М1: P = {a , b}; S = {s0 , s1 , s2}; H = {h0 , a}; F = {s0}; f (s0, a, h0) = (s1, h0a),
f (s1, a, a ) = (s1, aa), f (s1, b, a ) = (s2, $), f (s2, b, a ) = (s2, $), f (s2, ε, h0) = (s0, $).
23
Этот автомат является детерминированным, поскольку каждому набору аргументов соответствует единственное значение функции. Работу автомата при распознавании входной цепочки aabb можно представить в виде последовательности конфигураций:
(s0,aabb,h0) |-- (s1,abb,h0a) |-- (s1,bb,h0aa) |-- (s2,b,h0a) |-- (s2,$,h0) |-- (s0,$,$)
Можно проверить, что при задании входной цепочки aabbb автомат не сможет закончить работу. Следовательно, эта цепочка не принадлежит языку, допускаемому автоматом M1. Магазинный автомат М2, заданный следующим описанием:
М2: P = {a, b}; S = {s0, s1, s2}; H = {h0, a, b}; F = {s2};
(1)f(s0, a, h0) = (s0, h0a),
(2)f(s0, b, h0) = (s0, h0b),
(3)f(s0, a, a) = {(s0,aa) , (s1 , $)},
(4)f(s0, b, a) = (s0,ab),
(5)f(s0, a, b) = (s0 , ba),
(6)f(s0, b, b) = {(s0 , bb) , (s1 , $)},
(7)f(s1, a, a) = (s1, $),
(8)f(s1, b, b) = (s1, $),
(9)f0(s2, ε, h0) = (s2, $),
является недетерминированным автоматом, поскольку одному и тому же набору аргументов, например (s0, a, a), соответствуют два значения функции. Рассмотрим работу автомата для входной цепочки abba. Если использовать последовательность команд (1), (4), (6.1), (5), то получим последовательность конфигураций:
(s0,abba,h0) |-- (s0,bba,h0a), (1) |-- (s0,ba,h0ab), (4) |-- (s0,a,h0abb), (6.1) |-- (s0,$,h0abba). (5),
которая показывает, что дальнейшая работа невозможна, т.к. входная цепочка прочитана и переход (s0,$,h0abba) не определен. Если же использовать последовательность команд (1), (4), (6.2), (7), (9), то получим заключительную конфигурацию:
(s0,abba,h0) |-- (s0, bba, h0a), |
(1) |
|-- (s0, ba, h0ab), |
(4) |
|-- (s1, a, h0a), |
(6.2) |
24
|-- (s1, $, h0), |
(7) |
|-- (s2, $, $). |
(9). |
Т.о. можно сделать вывод о том, что цепочка abba допускается автоматом М2.
2.11. Построение магазинного автомата
Если Г = { VT, VA, I, R } является КС-грамматикой, то для неё можно построить магазинный автомат М, такой что L(M) = L(Г).
Для простоты и наглядности построения магазинного автомата условимся использовать магазинные автоматы с одним состоянием s0. Пусть задана грамматика Г = { VT, VA, I, R}. Определим компоненты автомата М следующим образом:
S = { s0 }, P = VT , H = VT VA { h0} , F = { s0 },
в качестве начального состояния автомата примем s0. Построим функцию переходов следующим образом:
1.Для всех <A> VA, встречающихся в левой части правил <A> → α , построим команды вида:
f0( s 0 , ε , <A> ) = ( s0 , αR ),
где αR -зеркальное отображение цепочки α.
2.Для всех a VT построим команды вида
f( s0, a, a ) = ( s0, $ )
3. Для перехода в конечное состояние построим команду f*( s0 , ε , h0 ) = ( s0 , $ )
4. Начальную конфигурацию автомата определим в виде:
( s0 , ω , h0<I> ),
где ω − заданная цепочка, записанная на входной ленте.
Построенный автомат работает следующим образом. Если в вершине магазина находится терминал, и символ, читаемый с входной ленты, совпадает с ним, то по команде типа (2) терминал удаляется из магазина, а входная головка сдвигается. Если в вершине магазина находится нетерминал, то выполняется команда типа (1), которая вместо нетерминала записывает в магазин цепочку, представляющую собой зеркальное отражение правой
25