- •Глава 1. Общие сведения о системах программирования.
- •Глава 2. Основные понятия и определения формальных языков.
- •Глава 3. Регулярные грамматики и языки.
- •Метод проверки регулярности заданного языка.
- •Методика построения конечного автомата:
- •Глава 4. Контекстно-свободные грамматики и языки.
- •Построение мп-автомата.
- •Построение расширенного мп-автомата.
- •Алгоритм построения матрицы предшествования:
Глава 4. Контекстно-свободные грамматики и языки.
Параграф 1. Определение КС-языков.
Пункт 1. Задача и дерево разбора.
Процесс порождения любой строки КС-языка
можно представить в виде вывода. Вывод
строки
из строки
- это последовательность строк
таких, что
для
.
Различают левосторонний и правосторонний вывод. Левосторонний вывод получается путем применения правила грамматики каждый раз к самому левому нетерминалу сентенциальной формы. Правосторонний вывод отличается тем, что на каждом шаге замещается самый правый нетерминал сентенциальной формы.
С понятием вывода тесно связано понятие разбора строки языка.
1) разбор – это задача выяснения принадлежности заданной строки языку, порождаемому заданной грамматикой.
2) разбор – это последовательность правил грамматики, определенным образом соответствующая выводу.
Левосторонний разбор – последовательность порождающих правил, применяемых для генерирования строки языка посредством левостороннего вывода.
Правосторонний разбор является обратной последовательностью порождающих правил, используемых для генерирования строки языка посредством правостороннего вывода.
Все возможные выводы и разборы некоторой строки языка можно представить графически в виде дерева, которое называют деревом разбора.
Задача разбора сводится к нахождению разбора (левостороннего или правостороннего) и построению дерева разбора.
Грамматики называются неоднозначными, если в них для одной строки языка можно построить более одного дерева разбора.
Для выполнения разбора обычно требуется однозначная грамматика. Разбор называют также анализом или синтаксическим анализом.
Лемма о разрастании КС-языков: в достаточно длинной строке, принадлежащей некоторому КС-языку, всегда можно найти две подстроки с ненулевой суммарной длиной, одновременное повторение которых произвольное количество раз порождает новую строку того же языка.
Свойство самовложения грамматики языка:
грамматика имеет самовложение, если
для некоторого ее нетерминала
существует вывод
,
где
.
Пункт 2. Проверка существования языка.
Проверка существовании языка выполняется
перед всеми другими исследованиями и
преобразованиями КС-грамматики. Алгоритм
проверки основан на вычислении множества
нетерминалов, порождающих терминальные
строки. Если аксиома грамматики
оказывается среди этих нетерминалов,
то язык, определяемый грамматикой, не
пуст, то есть существует. Обозначим
и рассмотрим алгоритм проверки
существования языка.
Вход: КС-грамматика .
Выход: Если
,
признак
,
если
.
Положить
.Вычислить
.Если
(
изменилось), то положить
и перейти к пункту 2, иначе положить
.
4. Если
,
то
(язык существует), иначе
(язык не существует).
Существуют бесполезные символы
грамматики
.
Их общее множество
можно разделить на 3 группы:
а) нетерминалы, не порождающие терминальных
строк
;
б) недостижимые нетерминалы, порождающие
терминальные строки
;
в) недостижимые терминалы
.
Нетерминалы (достижимые и недостижимые), не порождающие терминальных строк, можно вычислить и удалить, используя в качестве основы алгоритм проверки существования языка.
АЛГОРИТМ:
Вход: КС-грамматика .
Выход: КС-грамматика
,
у которой
и для всех
существуют выводы
,
где
.
1. Положить .
Вычислить .
Если ( меняется), то положить и перейти к пункту 2, иначе положить .
Вычислить
,
где
- это множество правил, содержащих
бесполезные нетерминалы
,
то есть
.
Пункт 3. Устранение недостижимых символов.
Недостижимые терминалы (группа «в»
бесполезных символов) и недостижимые
нетерминалы, порождающие терминальные
строки (группа «б»), исключаются из
грамматики с помощью алгоритма устранения
недостижимых символов. Сначала решается
обратная задача, то есть определяется
множество
достижимых символов
:
.
Вход: КС-грамматика .
Выход: КС-грамматика
,
у которой
и для всех
существуют выводы
,
где
.
Положить
.Вычислить
.Если
,
то положить
и перейти к пункту 2; иначе положить
.Вычислить
,
где
- это множество правил, содержащих
недостижимые символы
,
то есть
.
Параграф 2. Эквивалентные преобразования КС-грамматик.
Пункт 1. Устранение
-правил.
Наличие в грамматике правил вида
часто создает проблемы ее применения.
Поэтому во многих случаях оказывается
полезным преобразование грамматики
,
содержащей
-правила,
в эквивалентную грамматику
без таких правил.
Грамматику без
-правил
называют также
-свободной
грамматикой. Если
,
то в эквивалентной грамматике
не должно быть
-правила
ни для какого нетерминала, кроме аксиомы.
При этом аксиома не должна встречаться
в правых частях правил грамматики.
Алгоритм решения рассматриваемой задачи
состоит в следующем.
Вход: КС-грамматика .
Выход: КС-грамматика
без
-правил,
для которой
.
В исходной грамматике найти -порождающие нетерминальные символы
,
такие что
:
Положить
.Вычислить
.Если
,
то положить
и перейти к пункту 1.2; иначе положить
.
Из множества
правил исходной грамматики
перенести в множество
все правила, за исключением
-правил:
.Пополнить множество правилами, которые получаются из каждого правила этого множества путем исключения одного и более -порождающих нетерминалов в правой части; полученные при этом -правила в множество не включать.
Если
,
то
,
где
;
иначе
.
Пункт 2. Устранение цепных правил.
Цепное правило – это правило вида
,
где
.
Цепные правила могут быть причиной
нежелательных свойств грамматики,
таких, например, как циклы. Алгоритм
устранения цепных правил осуществляет
замещение правой части каждого цепного
правила, используя для этого не цепные
правила.
АЛГОРИТМ:
Вход: КС-грамматика без -правил.
Выход: Эквивалентная КС-грамматика
без цепных правил.
Для каждого нетерминала
вычислить
:
Положить
.Вычислить
.Если
,
то положить
и перейти к пункту 1.2; иначе положить
.
Построить множество так: если
не является цепным правилом
,
то включать в
правило
для каждого
,
такого, что
,
то есть
.
Пункт 3. Левая факторизация правил.
Левую факторизацию можно выполнять для правил грамматики, определяющих один и тот же нетерминал и имеющих одинаковое начало (префикс) правых частей. Цель такого преобразовании – устранение одинаковых префиксов. При проведении левой факторизации выполняются действия, подобные вынесению за скобки общего левого множителя в алгебраических выражениях. Алгоритм преобразования состоит в следующем.
Вход: КС-грамматика .
Выход: Эквивалентная КС-грамматика без одинаковых префиксов в правых частях правил, определяющих нетерминал.
Записать все правила для нетерминала , имеющие одинаковые префиксы
,
в виде одного правила с альтернативами
(вариантами):
;
Вынести за скобки влево префикс
каждой строки-альтернативы:
.Обозначить новым нетерминалом
выражение, оставшееся в скобках:
.Пополнить множество нетерминалов новым нетерминалом и заменить правила, подвергшиеся факторизации, новыми правилами для и .
Повторить пункты 1 – 4 для всех нетерминалов грамматики, для которых это возможно и необходимо.
Пункт 4. Устранение прямой левой рекурсии.
Нетерминал
называют рекурсивным, когда существует
вывод
,
где
.
Если указанный вывод получается за один
шаг (имеется правило
),
то говорят о прямой рекурсии. Если
требуется более одного шага, то имеет
место косвенная рекурсия (или
рекурсивный цикл). В случае
рекурсию называют левой, а в случае
- правой. Частный случай
соответствует понятию самовложения.
Если
,
то получаем цикл
.
При устранении рекурсии один вид рекурсии заменяется на другой, например, вместо левой рекурсии появляется правая. В приложениях теории формальных грамматик значительные неудобства часто создает именно левая рекурсия. Рассмотрим алгоритм устранения прямой левой рекурсии. Отметим, что если имеется несколько рекурсивных правил для одного нетерминала , то можно свести их к одному рекурсивному правилу путем левой факторизации. Возможна и последовательная обработка каждого из рекурсивных правил для .
Вход: КС-грамматика .
Выход: Эквивалентная КС-грамматика без прямой левой рекурсии.
Вынести из грамматики все правила для рекурсивного нетерминала :
Ввести новый нетерминал так, чтобы он описывал любое окончание строки, порождаемой рекурсивным нетерминалом :
Заменить в рекурсивном правиле для правую часть, используя нетерминал и все не рекурсивные правила для , так, чтобы генерируемый язык не изменился:
Пополнить множество нетерминалов грамматики новым нетерминалом . Пополнить множество правил грамматики правилами, полученными в пункте 3.
Повторить действия пунктов 1 – 4 для всех рекурсивных нетерминалов грамматики, после чего полученные множества нетерминалов и правил принять в качестве
и
.
Замечание: если -правила не будут помехой в грамматике, то в пункте 2 алгоритма можно применить для правила
.
Тогда в пункте 3 будут получены такие правила:
.
Параграф 3. Нормальная форма КС-грамматики.
Пункт 1. Нормальная форма Хомского.
Каждая КС-грамматика эквивалентна грамматике в нормальной форме Хомского с правилами вида
1)
,
где
;
2)
,
где
;
3)
,
если
,
причем
не встречается в правых частях правил.
Дерево разбора любой строки языка в такой грамматике будет бинарным. Преобразование к нормальной форме Хомского (НФХ) полезно, когда требуется простая структура КС-языка. Оно выполняется путем сокращения количества символов правой части за счет введения новых обозначений (нетерминалов). Предварительно нужно привести исходную КС-грамматику.
Вход: Приведенная КС-грамматика .
Выход: Эквивалентная КС-грамматика в НФХ.
Включить в каждое правило вида 2, то есть
.Включить в каждое правило вида 1, то есть
.Включить в каждое правило вида 3, то есть
(если оно есть в
).Для каждого правила
,
где
,
включить в
правила:
,
где
- новый нетерминал;
Для каждого правила
,
где хотя бы один из символов
и
является терминалом, включить в
согласно обозначениям правило
.Для каждого нового нетерминала вида
,
введенного в пункте 4 или в пункте 5,
согласно обозначениям, включить в
правило вида
,
где
.Пополнить множество нетерминалов
.
При реализации алгоритма составляется таблица для обозначения терминалов и таблица для обозначения строк из двух и более символов.
Пункт 2. Нормальная форма Грейбах.
Каждая КС-грамматика эквивалентна грамматике в нормальной форме Грейбах с правилами вида
1)
;
2)
,
причем не встречается в правых частях правил.
Характерным для грамматик в нормальной форме Грейбах (НФГ) является головной терминал в правой части каждого правила (кроме, разумеется, -правила). В основу алгоритма преобразования грамматики к НФГ положена последовательная замена головного нетерминала в правой части правила. Упорядочение применения правил для замены достигается упорядочением нетерминалов грамматики. Предварительно нужно привести исходную КС-грамматику.
Вход: Приведенная КС-грамматика без левой рекурсии.
Выход: Эквивалентная КС-грамматика в НФГ.
Упорядочить нетерминалы
,
связав с каждым из них целое число так,
чтобы для правила вида
выполнялось отношение
.
Положение нетерминалов, не связанных
правилом (*), в упорядоченной
последовательности выбрать произвольно.Положить
и
,
где
- количество нетерминалов грамматики.Если
,
то перейти к пункту 5; иначе заменить в
каждое правило вида (*) правилами
- все правила для
и
.Положить
и перейти к пункту 3.Заменить
в каждом правиле вида
,
где
,
новым нетерминалом
.Для новых нетерминалов добавить в новые правила вида
и вычислить
.
При реализации алгоритма в пункте 1 полезно предусмотреть таблицу соответствия нетерминалов и их номеров, а в пункте 5 – таблицу новых нетерминалов.
Пункт 3. Устранение левой рекурсии.
Рассмотрим общий алгоритм устранения
левой рекурсии. Основная идея применяемого
для этой цели метода состоит в нумерации
нетерминалов грамматики и преобразовании
правил вида
,
где
- номер нетерминала, либо к форме
,
где
,
либо к форме
,
где
.
Правило вида
не содержит прямой левой рекурсии и не
может порождать левый рекурсивный цикл.
Правило вида (**) в случае
содержит прямую левую рекурсию, а в
случае
участвует в формировании левого
рекурсивного цикла.
Прямая левая рекурсия замещается прямой правой рекурсией. Для устранения левого рекурсивного цикла в таком правиле последовательно раскрывается нетерминал . В результате левый рекурсивный цикл сначала сводится к прямой левой рекурсии, которая затем устраняется обычным образом.
Вход: Приведенная КС-грамматика .
Выход: Эквивалентная КС-грамматика без левой рекурсии.
Пронумеровать нетерминалы , положить
.Просмотреть правила , выделить правила для нетерминала
,
имеющего прямую левую рекурсию
:
,
где
и ни одна из строк
не начинается с
.
Введя новый нетерминал
,
заменить выделенные правила, чтобы
свести прямую левую рекурсию к прямой
правой:
Теперь все правые части правил для
начинаются с терминала или
.
Если
,
положить
и закончить работу; иначе положить
.Выделить из правила вида
и заменить их правилами
,
используя все правила
.
Теперь все правые части правил для
начинаются с терминала или
.Если
,
перейти к пункту 2; иначе положить
и перейти к пункту 4.
Параграф 4. Автомат с магазинной памятью.
Пункт 1. Определение МП-автомата.
Подобно тому, как регулярные языки можно распознавать конечным автоматом, КС-языки можно распознавать с помощью автомата с магазинной памятью, или МП-автомата. Последний эквивалентен конечному автомату, который снабжен рабочей памятью магазинного типа, то есть стеком.
МП-автомат читает входной символ, замещает верхний символ стека строкой символов и переходит в новое состояние. Новое состояние определяется прочитанным символом и содержимым вершины стека. МП-автомат принимает строку, если после ее прочтения автомат находится в заключительном состоянии.
Формально МП-автомат можно
можно представить в виде семерки:
,
где
-
конечное множество состояний автомата;
- конечный входной алфавит;
- конечный магазинный алфавит;
- магазинная функция, отображение
множества
в множество всех подмножеств множества
;
-
начальное состояние автомата,
;
-
символ, который находится в магазине в
начальный момент,
;
- множество заключительных состояний
автомата,
.
Конфигурацией МП-автомата называется тройка
где
- текущее состояние автомата;
- часть входной строки, первый символ
которой находится под входной головкой;
- содержимое магазина.
Шаг работы МП-автомата представим
в виде отношения |- на конфигурациях.
Если одним из значений магазинной
функции
является
,
то можно писать
.
Это общая запись, которая подразумевает
частные случаи.
Случай
.
Автомат находится в текущем состоянии
,
читает входной символ
,
имеет в вершине стека символ
.
Он переходит в очередное состояние
,
сдвигает входную головку на ячейку
вправо и заменяет верхний символ
строкой
магазинных символов. Вариант
означает, что
удаляется из стека.Случай
.
Отличается от случая 1 тем, что входной
символ
просто не принимается во внимание, и
входная головка не сдвигается. Такой
шаг работы МП-автомата называется
-шагом,
причем
-шаг
может выполняться даже после завершения
чтения всей входной строки.
Начальной конфигурацией МП-автомата
называется конфигурация
,
а заключительной – конфигурация
,
где
.
В заключительном состоянии входная
строка полностью прочитана. Таким
образом, МП-автомат допускает входную
строку
,
если существует путь по конфигурациям
для некоторых
и
.
Значит, язык
,
распознаваемый (принимаемый) МП-автоматом
,
формально можно определить так:
.
Пункт 2. Разновидности МП-автоматов.
Иногда определяют МП-автомат, который
принимает строку, если после завершения
ее чтения стек автомата будет пуст. В
этом случае нет необходимости выделять
множество заключительных состояний
,
а описание заключительной конфигурации
имеет вид
,
где
.
Говорят, что такой МП-автомат принимает
строку языка опустошением магазина.
МП-автомат называют детерминированным
(ДМП-автоматом), если, находясь в любой
конфигурации, он может выбрать не более
одной следующей конфигурации. Это
означает, что при любых значениях
,
и
(
для расширенного автомата) магазинная
функция
имеет не более одного значения. В
противном случае МП-автомат является
недетерминированным.
Существует соответствие КС-грамматик и МП-автоматов, которое можно сформулировать так: существуют КС-языки, МП-автоматы и расширенные МП-автоматы, определяющие один и тот же КС-язык.
Пункт 3. Взаимосвязь МП-автоматов и КС-грамматик.
