
Грамматики и языки03.ppt
- Количество слайдов: 18
Грамматики и языки
Формальная грамматика или просто грамматика в теории формальных языков — способ описания формального языка, то есть выделения некоторого подмножества из множества всех слов некоторого конечного алфавитa(множества символов). Различают порождающие и распознающие грамматики — первые задают правила, с помощью которых можно построить любое слово языка, а вторые позволяют по данному слову определить, входит оно в язык или нет.
Терминал (терминальный символ) — объект, непосредственно присутствующий в словах языка, соответствующего грамматике, и имеющий конкретное, неизменяемое значение (обобщение понятия «буквы» ). В формальных языках, используемых на компьютере, в качестве терминалов обычно берут все или часть стандартных символов ASCII — латинские буквы, цифры и спец. символы. Нетерминал (нетерминальный символ) — объект, обозначающий какую-либо сущность языка (например: формула, арифметическое выражение, команда) и не имеющий конкретного символьного значения.
Порождающие грамматики Словами языка, заданного грамматикой, являются все последовательности терминалов, выводимые (порождаемые) из начального нетерминала по правилам вывода. Чтобы задать грамматику, требуется задать алфавиты терминалов и нетерминалов, набор правил вывода, а также выделить в множестве нетерминалов начальный. Итак, грамматика определяется следующими характеристиками: Σ — набор (алфавит) терминальных символов N — набор (алфавит) нетерминальных символов P — набор правил вида: «левая часть» «правая часть» , где: «левая часть» — непустая последовательность терминалов и нетерминалов, содержащая хотя бы один нетерминал «правая часть» — любая последовательность терминалов и нетерминалов S — стартовый (начальный) символ из набора нетерминалов.
Выводом называется последовательность строк, состоящих из терминалов и нетерминалов, где первой идет строка, состоящая из одного стартового нетерминала, а каждая последующая строка получена из предыдущей путем замены некоторой подстроки по одному (любому) из правил. Конечной строкой является строка, полностью состоящая из терминалов, и следовательно являющаяся словом языка. Существование вывода для некоторого слова является критерием его принадлежности к языку, определяемому данной грамматикой.
Цепочка символов Цепочкой символов в алфавите называется любая конечная последовательность символов этого алфавита. Цепочка, которая не содержит ни одного символа, называется пустой цепочкой. Для ее обозначения будем использовать символ ε. Более формально цепочка символов в алфавите V определяется следующим образом: (1) ε - цепочка в алфавите V; (2) если α - цепочка в алфавите V и a - символ этого алфавита, то αa - цепочка в алфавите V; (3) β - цепочка в алфавите V тогда и только тогда, когда она является таковой в силу (1) и (2).
Типы грамматик По иерархии Хомского, грамматики делятся на 4 типа, каждый последующий является более ограниченным подмножеством предыдущего (но и легче поддающимся анализу): • тип 0. неограниченные грамматики — возможны любые правила • тип 1. контекстно-зависимые грамматики — левая часть может содержать один нетерминал, окруженный «контекстом» (последовательности символов, в том же виде присутствующие в правой части); сам нетерминал заменяется непустой последовательностью символов в правой части. • тип 2. контекстно-свободные грамматики — левая часть состоит из одного нетерминала. • тип 3. регулярные грамматики — более простые, эквивалентны конечным автоматам.
Неограниченные грамматики Это — все без исключения формальные грамматики. Для грамматики G(VT, VN, P, S), V=VT∪VN все правила имеют вид: где α — любая цепочка, содержащая хотя бы один нетерминальный символ, а β — любая цепочка символов из алфавита. (VT — множество (словарь) терминальных символов, VN — множество (словарь) нетерминальных символов, P — множество продукций (правил) грамматики, S — начальный символ) Практического применения в силу своей сложности такие грамматики не имеют.
Контекстно-зависимые грамматики К этому типу относятся контекстно-зависимые (КЗ) грамматики и неукорачивающие грамматики. Для грамматики G(VT, VN, P, S), V=VT∪VN все правила имеют вид: αAβ→αγβ, где α, β∈V*, γ∈V+, A∈VN - такие грамматики относят к контекстнозависимым. α→β, где α, β∈V+, |α|≤|β|- такие грамматики относят к неукорачивающим. Эти классы грамматик эквивалентны. Могут использоваться при анализе текстов на естественных языках, однако при построении компиляторов практически не используются в силу своей сложности. Для контекстно-зависимых грамматик доказано утверждение: по некоторому алгоритму за конечное число шагов можно установить, принадлежит цепочка терминальных символов данному языку или нет.
Примеры Следующая грамматика задает контекстнозависимый язык :
Примеры Так выглядит цепочка порождения aaa bbb ccc:
Контекстно-свободная грамматика КС-грамматика, бесконтекстная грамматика) — частный случай формальной грамматики, у которой левые части всех продукций являются одиночными нетерминалами. Смысл термина «контекстно-свободная» заключается в том, что возможность применить продукцию к нетерминалу, в отличие от общего случая грамматики Хомского, не зависит от контекста этого нетерминала. Язык, который может быть задан КСграмматикой, называется контекстно-свободным языком или КС-языком.
Контекстно-свободные грамматики Для грамматики G(VT, VN, P, S), V=VT∪VN все правила имеют вид: A→β, где β∈V+ (для неукорачивающих КСграмматик, β∈V* для укорачивающих), A∈VN. То есть грамматика допускает появление в левой части правила только нетерминального символа. КС-грамматики находят большое применение в информатике. Ими задаётся грамматическая структура большинства языков программирования, структурированных данных и т. д.
Регулярные грамматики определяют в точности все регулярные языки, и поэтому эквивалентны конечным автоматам и регулярным выражениям. Регулярные грамматики являются подмножеством контекстно-свободных. Задание набором правил. Регулярная грамматика может быть задана набором правил как левая или правая регулярная грамматика. Правая регулярная грамматика - все правила могут быть в одной из следующих форм: A→a A → a. B A→ε левая регулярная грамматика - все правила могут быть в одной из следующих форм: A→a A → Ba A→ε Где заглавные буквы (A, B) обозначают нетерминалы из множества N строчные буквы (a, b) обозначают терминалы из множества Σ , ε - пустая строка, т. е. строка длины 0 и S является начальным символом.
Классы правых и левых регулярных грамматик эквивалентны - каждый в отдельности достаточен для задания всех регулярных языков. Любая регулярная грамматика может быть преобразована из левой в правую, и наоборот. Пример: Правая регулярная грамматика G, заданная N = {S, A}, Σ = {a, b, c}, P состоит из следующих правил: S → a. S S → b. A A→ε A → c. A и S является начальным символом. Регулярные грамматики применяются для описания простейших конструкций: идентификаторов, строк, констант, а также языков ассемблера, командных процессоров и др.
Аналитические грамматики Порождающие грамматики — не единственный вид грамматик, однако наиболее распространенный в приложениях к программированию. В отличие от порождающих грамматик, аналитическая (распознающая) грамматика задает алгоритм, позволяющий определить, принадлежит ли данное слово языку. Например, любой регулярный язык может быть распознан при помощи грамматики, задаваемой конечным автоматом, а любая контекстно-свободная грамматика — с помощью автомата со стековой памятью. Если слово принадлежит языку, то такой автомат строит его вывод в явном виде, что позволяет анализировать семантику этого слова.
Пример — арифметические выражения Рассмотрим простой язык, определяющий ограниченное подмножество арифметических формул, состоящих из натуральных чисел, скобок и знаков арифметических действий. Стоит заметить, что здесь в каждом правиле с левой стороны от стрелки стоит только один нетерминальный символ. Такие грамматики называются контекстно-свободными. Терминальный алфавит:
Правила: Выведем формулу (12+5) с помощью перечисленных правил вывода. Для наглядности, стороны каждой замены показаны попарно, в каждой паре заменяемая часть подчеркнута.