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

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

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

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

Ответ 1

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

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

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

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

Способ интерпретировать это означает, что S можно заменить на B, а B можно заменить на 0, а B можно заменить на 1. Итак, чтобы построить строку 010, мы можем сделать S → BBB → 0BB → 01B → 010.

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

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

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

Ответ 2

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

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

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

И обычные языки: http://en.wikipedia.org/wiki/Regular_language

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

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

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

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

EDIT:

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

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

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

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

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

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

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

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

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

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