Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методы трансляции.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.99 Mб
Скачать

Глава 2. Основные понятия и определения формальных языков.

Параграф 1. Формальные грамматики и языки.

Пункт 1. Определение языков посредством множеств.

В основе каждого языка лежит алфавит. Алфавит определяется множеством символов, применяемых для построения строк (цепочек, предложений) языка.

Пример 1. Алфавит 16-ричных цифр и алфавит двоичных цифр:

; .

Строка – это любая последовательность символов алфавита, расположенных один за другим.

Пустой называется строка, содержащая нуль символов. Такую строку будем обозначать через .

Строку из символов будем обозначать через , например и .

Строки символов можно именовать, например и др. Длину некоторой строки будем обозначать .

Запись используют для изображения множества всех строк, включая пустую, составленных из символов, входящих в алфавит . Очевидно, .

Любую строку можно представить в виде сцепления (конкатенации) строк, где и . Строку в такой записи называют префиксом (головой - head), а строку - суффиксом (хвостом - tail) строки . Если для строки нужно обозначить ее голову, содержащую символов, то пишут . Также для обозначения хвоста длины пишут .

Строку в строке , где , называют подстрокой строки .

Формальным языком в алфавите называют произвольное подмножество множества .

Поскольку формальные языки представляют собой множества, над языками можно выполнять операции объединения, сцепления и др. Особыми конкатенациями являются и

Итерация языка или замыкание Клини - сцепление произвольного числа строк некоторого формального языка : .

.

обозначает нуль или более сцеплений языка .

Позитивное замыкание содержит одно или более сцеплений языка: .

Задать формальный язык в алфавите - значит либо перечислить все строки языкового подмножества множества , либо указать правила их образования.

Например, в алфавите запись определяет язык как пустую строку и любое количество строк, каждая из которых состоит из строки нулей и последующей строки единиц такой же длины. Перебирая значения , получаем , что при любом ограниченном является подмножеством множества .

Пункт 2. Понятие о формальной грамматике.

Формальная грамматика – это математическая система, определяющая язык посредством порождающих правил. В отличие от формулы для определения множества формальная грамматика содержит ряд взаимосвязанных правил для получения (порождения, генерации) строк языка.

Пример. Даны два нумерованных правила:

1)

2)

Символы 0 и 1 принадлежат алфавиту языка, а - вспомогательный символ. Строки языка получаются путем применения этих правил в любой комбинации, причем вспомогательный символ в строке языка не должен присутствовать. Вспомогательных символов может быть любое необходимое количество.

Рассмотрим применение данных правил в последовательности 1, 1, 2:

. Это есть вывод строки 0011 из символа .

Руководствуясь правилами 1 и 2, можно вывести все строки соответствующего языка и никакие другие. Таким образом, формальная грамматика есть своеобразный алгоритм порождения всех строк языка, который эта грамматика описывает.

Пункт 3. Определение формальной грамматики.

Формальная грамматика определяется как четверка , в которой приняты следующие обозначения:

  • - алфавит языка, строки которого порождает грамматика. Элементы множества называют терминалами;

  • - вспомогательный алфавит, символы которого обозначают допустимые комбинации элементов множеств и . Элементы множества называют нетерминалами. . Объединение этих множеств называют словарем грамматики;

  • - множество порождающих правил. Каждое правило состоит из пары , где - левая часть правила, а - правая часть. Правила записываются в виде , где строка должна содержать хотя бы один нетерминал. Очевидно, справедлива запись (это прямое произведение множеств, результат – пара, один элемент которой из одного множества, а другой – из другого);

  • - начальный символ (аксиома) грамматики. С него начинается вывод, генерирующий любую строку языка.

Грамматику обычно именуют. Имя грамматики можно использовать вместо определяющей ее четверки. Обозначим грамматику, генерирующую язык , как . Тогда грамматику можно определить так:

.

Каждая строка, которую можно вывести из начального символа грамматики, называется сентенциальной формой. К сентенциальным формам также относят аксиому грамматики, поскольку вывод за нуль шагов тоже считается выводом. Сентенциальная форма может содержать любые символы словаря грамматики – как терминалы, так и нетерминалы.

Сентенциальная форма, состоящая только из терминалов, представляет собой строку языка (или предложение языка).

Обозначение применяют в случае, когда хотят показать, что вывод из происходит при однократном применении одного правила грамматики .

В случаях, когда не возникает неопределенности относительно применяемой грамматики, обозначение грамматики можно не указывать.

Запись вида применяют для обозначения вывода строки из строки за один или более шагов применения правил грамматики . Запись означает вывод из за нуль или более шагов применения правил грамматики .

Таким образом, если

и ,

то обычно пишут

или короче: .

При используется общая запись . Число шагов вывода называют степенью отношения и иногда обозначают .

Строка , для которой существует вывод , где - аксиома грамматики , есть сентенциальная форма, а строка , для которой имеется вывод , есть строка языка , порождаемого грамматикой . Формально .

Это определение языка , порождаемого грамматикой , как множества таких строк, которые образованы только из терминалов и выводятся из начального символа грамматики .

Параграф 2. Генерация, распознавание и преобразование языков.

Пункт 1. Классификация грамматик.

Будем обозначать:

и т.д. - терминал, и т.д. – нетерминал, и т.д. – строка из символов словаря грамматики.

Как правило, одну и ту же строку языка можно генерировать, используя разные грамматики. Грамматики, генерирующие один и тот же язык, называют эквивалентными.

Различные грамматики обладают различными свойствами. Одной из основополагающих характеристик свойств грамматик является вид правил грамматик. Существует классификация грамматик по виду правил, предложенная американским математиком Хомским, известная как иерархия Хомского. Рассмотрим расширенную иерархию Хомского.

В расширенной иерархии имеется 4 уровня (типа, класса) грамматик.

1. Грамматика типа 0. является наиболее общей. Называют грамматикой без ограничений. В такой грамматике порождающие правила имеют вид , а на строки и не накладывается никаких ограничений, за исключением того, что левая часть правила не должна быть пустой ( ).

Другие типы грамматик (1, 2, 3) получаются путем усиления ограничений на строки и в правилах грамматики.

2. Грамматика типа 1 имеет правила вида , где и для длин строк выполняется отношение . Грамматику типа 1 называют контекстно-зависимой грамматикой, КЗ-грамматикой, или неукорачивающей грамматикой. Расширение допускает не более одного -правила, то есть правила вида , где .

3. Грамматика типа 2 имеет правила вида , где и . Ее называют контекстно-свободной грамматикой (КС-грамматикой).

4. Грамматика типа 3 имеет правила двух видов: и , где . Грамматика типа 3 называется регулярной грамматикой. Расширение допускает единственное -правило , но в этом случае аксиома не должна появляться в правых частях правил.

Данная иерархия грамматик является включающей, то есть грамматики типа 3 являются грамматиками типа 2, грамматики типа 2 – грамматиками типа 1 и грамматики типа 1 относятся к грамматикам типа 0.

Иерархии грамматик соответствует иерархия языков с теми же наименованиями. Язык, порожденный КЗ-грамматикой – контекстно-зависимый, а не контекстно-свободный, то есть не существует КС-грамматики, генерирующей этот язык.

Пункт 2. Механизмы распознавания и преобразования.

Разработка и применение языков обычно требуют проработки по крайней мере 3 основных проблем.

  1. Должен быть создан механизм порождения языка, то есть система описания строк языка. Такой механизм называется генератором. Наиболее распространенными типами генераторов являются рассмотренные классы формальных грамматик. Генератор задает правила образования строк языка.

  2. Кроме задачи написания правильных строк возникает противоположная задача – задача проверки правильности имеющихся строк. То есть это задача проверки принадлежности заданной строки заданному языку. Для этого создается механизм распознавания – распознаватель.

Схема распознавателя:

Распознаватель можно представить схематично в виде совокупности входной ленты, управляющего устройства и вспомогательной памяти. Входную ленту рассматривают как последовательность ячеек, каждая из которых содержит один символ некоторого конечного входного алфавита.

Обычно входная головка только читает, то есть содержимое входной ленты распознаватель не меняет.

Управляющее устройство – это программа управления распознавателем. Она задает конечное множество состояний распознавателя и определяет переходы из состояния в состояние в зависимости от прочитанного символа входной ленты и содержимого вспомогательной памяти.

Вспомогательная память служит для хранения информации, которая зависит от состояния распознавателя. Память может быть организована в виде магазина (стека). Объем памяти не ограничивается. Иногда вспомогательная память может отсутствовать.

Последовательность шагов распознавателя:

  1. чтение текущего символа входной ленты

  2. анализ входного символа, содержимого памяти и текущего состояния

  3. перемещение (если нужно) входной головки

  4. изменение содержимого памяти

  5. изменение состояния распознавателя.

Для каждого класса грамматик из иерархии Хомского существует класс распознавателей, определяющих тот же класс языков. Чем шире класс грамматик, тем сложнее класс распознавателей. Распознаватели для языков класса 3 называются конечными автоматами, для языков класса 2 – автоматами с магазинной памятью, для языков класса 1 – линейными ограниченными автоматами (машина Тьюринга с конечным объемом ленты), для языков класса 0 – машинами Тьюринга. Таким образом, все классы распознавателей языков являются частными случаями машины Тьюринга.

  1. Третья проблема возникает, когда объекты вычислительных процессов имеют различные языки общения. Решение: создание механизмов преобразования строк одного языка в строки другого языка. Преобразователь можно получить из распознавателя, если снабдить его выходной головкой и выходной лентой.

Схема преобразователя:

На каждом шаге работы преобразователь пишет на выходную ленту строку выходных символов. Строка, полученная на выходной ленте, считается переводом входной строки, если входная строка переводит преобразователь из начального состояния в заключительное.