Формальная грамматика: различия между версиями

Содержимое удалено Содержимое добавлено
+ {{Википедия}}
Нет описания правки
Строка 2:
{{Википедия}}
 
'''Формальная грамматика''' или просто '''грамматика''' в теории [[w:формальный язык|формальных языков]]  — способ описания формального языка, то есть
выделения некоторого подмножества из множества всех слов некоторого конечного
[[w:алфавит|алфавит]]a. Различают ''порождающие'' и ''распознающие'' (или
''аналитические'') грамматики  — первые задают правила, с помощью которых можно
построить любое слово языка, а вторые позволяют по данному слову определить,
входит оно в язык или нет.
Строка 20:
числа состоят из цифр и могут объединяться с помощью знаков арифметических
действий в формулы (например, формулой будет цепочка <tt>2+3</tt>). Формулы
можно заключать в скобки, а также складывать, вычитать, умножать и делать  — то
есть объединять друг с другом (и с числами) в более сложные формулы. Например,
<tt>(2+3)*(5+7)</tt>  — это сложная формула, состоящая из двух более простых, ее
можно символически записать следующим образом: <tt>ФОРМУЛА ЗНАК ФОРМУЛА</tt>.
Заметим, что вместо слов <tt>ФОРМУЛА</tt> можно подставить любую корректную
формулу, а вместо слова <tt>ЗНАК</tt>  — знак любого арифметического действия,
и эта строка останется правильной формулой.
 
Идея теории порождающих формальных грамматик, разработанной [[w:Хомский, Аврам Ноам|Н.Хомским]], состоит в том, чтобы описывать язык через правила
подстановок, которые позволяют строить слова языка из "«кирпичиков"», описываемых
с помощью других "«кирпичиков"». Правила языка при этом можно записывать, просто
указывая, какие цепочки "«кирпичиков" » можно подставлять вместо других
"«кирпичиков"». Например, разобранное выше правило построения сложных формул из
простых можно записать следующим образом (такая запись называется ''правилом
вывода'' )
: 1. <tt>ФОРМУЛА <math>\Rightarrow\!\,</math> ФОРМУЛА ЗНАК ФОРМУЛА</tt>
 
Правило нужно читать так: «вместо слова <tt>ФОРМУЛА</tt> можно подставить
Строка 41:
<tt>ЗНАК</tt> можно подставлять один из четырех символов алфавита <math>\Sigma</math>:
(+,-,*./). Это можно записать с помощью следующих четырех правил.
: 2. <tt>ЗНАК <math>\Rightarrow\!\,</math> +</tt>
: 3. <tt>ЗНАК <math>\Rightarrow\!\,</math> -</tt>
: 4. <tt>ЗНАК <math>\Rightarrow\!\,</math> *</tt>
: 5. <tt>ЗНАК <math>\Rightarrow\!\,</math> /</tt>
 
Такая запись обычно сокращается до следующей (символ «"|»" не принадлежит
<math>\Sigma</math>).
: 6. <tt>ЗНАК <math>\Rightarrow\!\,</math> + | - | * | / </tt>
 
«Кирпичики», обозначаемые нами большими буквами (например, <tt>ЗНАК</tt>), не являются
Строка 57:
других символов (как в случае с нетерминалом <tt>ФОРМУЛА</tt>), в то время
как терминал уже ни на что заменен быть не может и является своеобразным
«пунктном назначения» наших замен (от англ. terminal  — конечный
пункт). Чтобы получить слово языка, мы должны все нетерминалы в конечном
итоге заменить на терминалы, а для этого в описание языка должны входить соответствующие
Строка 63:
 
В рассмотренном примере для определения нетерминала <tt>ЧИСЛО</tt> можно ввести такие правила
: 7. <tt>ЧИСЛО <math>\Rightarrow\!\,</math> ЦИФРА | ЧИСЛО ЦИФРА</tt>
: 8. <tt>ЦИФРА <math>\Rightarrow\!\,</math> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9</tt>
 
Иными словами, если к числу приписать справа еще одну цифру, то получится снова
число. Одно число -- — это также корректная формула, что записывается следующим
образом:
: 9. <tt>ФОРМУЛА <math>\Rightarrow\!\,</math> ЧИСЛО</tt>
 
Для полного описания грамматики нам требуется также разрешить заключать
формулы в скобки. Это делается с помощью правила
: 10. <tt>ФОРМУЛА <math>\Rightarrow\!\,</math> ( ФОРМУЛА )</tt>
 
Надо отметить, что нетерминал <tt>ФОРМУЛА</tt> в нашем случае является
выделенным  — он задает правильные формулы, то есть слова нашего языка, в то
время как, например, нетерминал <tt>ЗНАК</tt> не задает слово языка. В таком
случае говорят, что нетерминал <tt>ФОРМУЛА</tt> является ''начальным''.
Строка 87:
 
 
== Пример вывода ==
Выведем формулу <tt>(12+5)</tt> с помощью перечисленных правил вывода:
 
Строка 99:
<math>{\Rightarrow_7\!\,}</math> (ЧИСЛО ЦИФРА + 5)
<math>{\Rightarrow_7\!\,}</math> (ЦИФРА ЦИФРА + 5)
<math>{\Rightarrow_8\!\,}</math> (12+5)</tt>
 
В приведенном примере с левой стороны от стрелки <math>\Rightarrow</math> в
Строка 107:
программированию. В отличие от порождающих грамматик, пример которой был
рассмотрен выше, распознающая грамматика задает алгоритм, позволяющий
определить, принадлежит ли данное слово языку. Например, любой [[w:регулярный язык|регулярный язык]] может быть распознан при помощи грамматики, задаваемой [[w:конечный автомат|конечным автоматом]], а любая контекстно-свободная грамматика  — с
помощью [[w:автомат со стековой памятью|автомата со стековой памятью]]. Если
слово принадлежит языку, то такой автомат строит его вывод в явном виде, что
Строка 114:
== Типы грамматик ==
По [[w:иерархия Хомского|иерархии Хомского]], грамматики делятся на 4 типа, каждый последующий является более ограниченным подмножеством предыдущего (но и легче поддающимся анализу):
* тип 0. [[w:неограниченные грамматики|неограниченные грамматики]]  — возможны любые правила
* тип 1. [[w:контекстно-зависимые грамматики|контекстно-зависимые грамматики]]  — левая часть может содержать один нетерминал, окруженный «контекстом» (последовательности символов, в том же виде присутствующие в правой части); сам нетерминал заменяется непустой последовательностью символов в правой части.
* тип 2. [[w:контекстно-свободная грамматика|контекстно-свободные грамматики]]  — левая часть состоит из одного нетерминала.
* тип 3. [[w:регулярная грамматика|регулярные грамматики]]  — более простые, эквивалентны конечным автоматам.
 
== Применение ==
* [[w:контекстно-свободная грамматика|Контекстно-свободные грамматики]] широко применяются для определения грамматической структуры в [[w:грамматический анализ|грамматическом анализе]].
* [[w:регулярные грамматики|регулярные грамматики]] (в виде [[w:регулярные выражения|регулярных выражений]]) широко применяются как шаблоны для текстового поиска, разбивки и подстановки, в т.ч.том числе в [[w:лексический анализ|лексическом анализе]].
 
== См. также ==
* [[w:Грамматический анализ]]