it-swarm.com.ru

Что такое контекстно-бесплатная грамматика?

Может кто-нибудь объяснить мне, что такое контекстно-свободная грамматика? Посмотрев на статью в Википедии, а затем на статью о формальной грамматике в Википедии, я остался совершенно и совершенно ошеломлен. Будет ли кто-то так любезно объяснить, что это за вещи?

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

Я не уверен, имеют ли эти термины непосредственное отношение к программированию, или они в большей степени связаны с лингвистикой. Если это так, я прошу прощения, может быть, это может быть перенесено, если так?

94
Ell

Контекстная грамматика - это грамматика, которая удовлетворяет определенным свойствам. В информатике грамматики описывают языки; в частности, они описывают формальные языки.

Формальный язык - это просто набор (математический термин для набора объектов) строк (последовательности символов ... очень похож на использование слова "строка" в программировании). Простым примером формального языка является набор всех двоичных строк длины три {000, 001, 010, 011, 100, 101, 110, 111}.

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

S -> BBB
B -> 0
B -> 1

Чтобы понять это, нужно сказать, что S можно заменить на BBB, а B можно заменить на 0, а B можно заменить на 1. Поэтому для построения строки 010 мы можем сделать S -> BBB -> 0BB -> 01B -> 010.

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

S -> AB
AB -> 1
A -> AA
B -> 0

Не являются регулярными, поскольку они содержат правила, такие как "AB -> 1".

103
aegrisomnia

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

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

Вы должны прочитать статью о конечных автоматах: http://en.wikipedia.org/wiki/Finite_state_machine

И регулярные языки: http://en.wikipedia.org/wiki/Regular_language

Все обычные языки являются контекстно-свободными языками, но существуют контекстно-свободные языки, которые не являются регулярными. Язык без контекста - это набор всех строк, принимаемых грамматиком без контекста или автоматами Pushdown, представляющими собой конечный автомат с одним стеком: http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context -free_Languages

Существуют более сложные языки, которые требуют, чтобы машина Тьюринга (любая возможная программа, которую вы можете написать на своем компьютере) решала, есть ли строка в языке или нет.

Теория языка также очень связана с проблемой P vs. NP и ​​некоторыми другими интересными вещами.

Мое учебное пособие "Введение в компьютерные науки" на третьем курсе было довольно хорошим объяснением: "Введение в теорию вычислений" Майкл Сипсер. Но это стоило мне 160 долларов, чтобы купить его новым, и оно не очень большое. Может быть, вы можете найти использованную копию или найти ее в библиотеке или что-то, что может вам помочь.

Правка:

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

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

Если язык не является регулярным, он может быть Context Free, что означает, что он может быть описан с помощью Context Free Grammer, или это может быть даже в более высоком классе языка, вы можете доказать, что он не Context Free с помощью прокачивающей леммы для Context Free языки, аналогичные тем, которые используются для регулярных выражений.

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

Я думаю, что часть, которая вас больше всего интересует, - это конечные автоматы (как детерминированные, так и детерминированные), чтобы увидеть, какие языки может решить Регулярное выражение, и наглядная лемма для доказательства того, какие языки не являются регулярными.

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

Язык всех строк, использующих буквы a и b, которые содержат как минимум три буквы b, является обычным языком: a ba ba ба

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

Также вам не следует, чтобы все конечные языки были регулярными, например:

Язык всех строк длиной менее 50 символов, использующих буквы a и b, которые содержат больше букв b, чем a, является регулярным, поскольку мы знаем, что он может быть описан как (b | abb | bab | bba | aabbb | ababb |. ..) и т. д., пока не будут перечислены все возможные комбинации.

20
Paulpro