Формальная грамматика

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Дерево составляющих
Генеративная лингвистика
п·о·р

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

Термины[править | править вики-текст]

  • Терминал (терминальный символ) — объект, непосредственно присутствующий в словах языка, соответствующего грамматике, и имеющий конкретное, неизменяемое значение (обобщение понятия «буквы»). В формальных языках, используемых на компьютере, в качестве терминалов обычно берут все или часть стандартных символов ASCII — латинские буквы, цифры и спец. символы.
  • Нетерминал (нетерминальный символ) — объект, обозначающий какую-либо сущность языка (например: формула, арифметическое выражение, команда) и не имеющий конкретного символьного значения.

Порождающие грамматики[править | править вики-текст]

Словами языка, заданного грамматикой, являются все последовательности терминалов, выводимые (порождаемые) из начального нетерминала по правилам вывода.

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

Итак, грамматика определяется следующими характеристиками:

  • \Sigma — набор (алфавит) терминальных символов
  • N — набор (алфавит) нетерминальных символов
  • P — набор правил вида: «левая часть» \rightarrow «правая часть», где:
    • «левая часть» — непустая последовательность терминалов и нетерминалов, содержащая хотя бы один нетерминал
    • «правая часть» — любая последовательность терминалов и нетерминалов
  • S — стартовый (или начальный символ) грамматики из набора нетерминалов.

Вывод[править | править вики-текст]

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

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

Типы грамматик[править | править вики-текст]

По иерархии Хомского, грамматики делятся на 4 типа, каждый последующий является более ограниченным подмножеством предыдущего (но и легче поддающимся анализу):

Кроме того, выделяют:

  • Неукорачивающиеся грамматики. Каждое правило такой грамматики имеет вид \alpha \rightarrow \beta, где |\alpha| \leqslant \beta. Длина правой части правила не меньше длины левой[1].
  • Линейные грамматики. Каждое правило такой грамматики имеет вид A \rightarrow uBv, или A \rightarrow u, то есть в правой части правила может содержаться не более одного вхождения нетерминала[2].

Применение[править | править вики-текст]

Пример — арифметические выражения[править | править вики-текст]

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

Терминальный алфавит:

\Sigma = {'0','1','2','3','4','5','6','7','8','9','+','-','*','/','(',')'}

Нетерминальный алфавит:

  { ФОРМУЛА, ЗНАК, ЧИСЛО, ЦИФРА }

Правила:

1. ФОРМУЛА \to ФОРМУЛА ЗНАК ФОРМУЛА                (формула есть две формулы, соединенные знаком)
2. ФОРМУЛА \to ЧИСЛО                               (формула есть число)
3. ФОРМУЛА \to ( ФОРМУЛА )                         (формула есть формула в скобках)
4. ЗНАК \to + | - | * | /                          (знак есть плюс или минус, или умножить, или разделить)
5. ЧИСЛО \to ЦИФРА                                 (число есть цифра)
6. ЧИСЛО \to ЧИСЛО ЦИФРА                           (число есть число и цифра)
7. ЦИФРА \to 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (цифра есть 0 или 1, или ... 9 )

Начальный нетерминал:

ФОРМУЛА

Вывод:

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

ФОРМУЛА \stackrel{3}{\to} (ФОРМУЛА)
(ФОРМУЛА) \stackrel{1}{\to} (ФОРМУЛА ЗНАК ФОРМУЛА)
(ФОРМУЛА ЗНАК ФОРМУЛА) \stackrel{4}{\to} (ФОРМУЛА + ФОРМУЛА)
(ФОРМУЛА + ФОРМУЛА) \stackrel{2}{\to} (ФОРМУЛА + ЧИСЛО)
(ФОРМУЛА + ЧИСЛО) \stackrel{5}{\to} (ФОРМУЛА + ЦИФРА)
(ФОРМУЛА + ЦИФРА) \stackrel{7}{\to} (ФОРМУЛА + 5)
(ФОРМУЛА + 5) \stackrel{2}{\to} (ЧИСЛО + 5)
(ЧИСЛО + 5) \stackrel{6}{\to} (ЧИСЛО ЦИФРА + 5)
(ЧИСЛО ЦИФРА + 5) \stackrel{5}{\to} (ЦИФРА ЦИФРА + 5)
(ЦИФРА ЦИФРА + 5) \stackrel{7}{\to} (1 ЦИФРА + 5)
(1 ЦИФРА + 5) \stackrel{7}{\to} (1 2 + 5)


Аналитические грамматики[править | править вики-текст]

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

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

Литература[править | править вики-текст]

  • Белоусов А. И., Ткачев С. Б. Дискретная математика. — М.: МГТУ, 2006. — 743 с. — ISBN 5-7038-2886-4.
  • Гладкий А. В. Формальные грамматики и языки. — М.: Наука, 1973.
  • Касьянов В. Н. Лекции по теории формальных языков, автоматов и сложности вычислений. — Новосибирск: НГУ, 1995. — 112 с.
  • Хомский Н., Миллер Дж. Введение в формальный анализ естественных языков // Кибернетический сборник / Под ред. А.А.Ляпунова и О.Б.Лупанова. — М.: Мир, 1965.
  • Гросс М., Лантен А. Теория формальных грамматик. — М.: Мир, 1971. — 296 с.