Ответы выше дают довольно хорошее определение того, что это такое. Давайте посмотрим, смогу ли я выразить это своими словами, чтобы у вас было 23 объяснения вместо 20. Вся цель грамматики, любой грамматики, состоит в том, чтобы выяснить, является ли конкретное предложение предложением на данном языке. Однако, что мы действительно используем для грамматики и синтаксического анализа, так это для того, чтобы выяснить, что означает это предложение. Это как старая схема предложения, которое вы могли или не могли сделать еще на уроке английского в школе. Предложение состоит из предметной части и предикатной части, предметная часть имеет существительное и, возможно, некоторые прилагательные, предикатная часть имеет глагол и, возможно, объектное существительное, с некоторыми прилагательными и т. Д.
Если бы существовала грамматика для английского языка (и я не думаю, что она есть, не в смысле информатики), то в ней были бы правила следующей формы, называемые продукцией.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
и т.д...
Затем вы могли бы написать программу и передать ей любое предложение, и программа могла бы использовать грамматику, чтобы выяснить, какой частью предложения является каждое слово и какое отношение они имеют друг к другу.
Если в каждом производстве есть только одна вещь с левой стороны, то это означает, что всякий раз, когда вы видите правую сторону в предложении, вам разрешается заменить на левой стороне. Например, всякий раз, когда вы видели прилагательное существительное, вы можете сказать «Это предметная часть», не обращая внимания ни на что, кроме этой фразы.
Тем не менее, английский (даже упрощенное описание английского, которое я дал выше) является контекстно-зависимым. «Прилагательное существительное» не всегда является SubjectPart, это может быть NounPhrase в PredicatePart. Это зависит от контекста. Давайте немного расширим нашу псевдоанглийскую грамматику:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
Вы можете сделать «прилагательное существительное» только в ObjectNounPhrase, если оно идет сразу после VerbPhrase.
По сути, если у вас есть производство, и вы можете применить его в любое время, независимо от того, что его окружает, оно не зависит от контекста.
Вы всегда можете легко определить, является ли грамматика контекстно-свободной. Просто проверьте, есть ли более одного символа на левой стороне стрелок.
Любой язык может быть описан несколькими грамматиками. Если некоторая грамматика для языка не зависит от контекста, язык не зависит от контекста. Для некоторых языков может быть доказано, что грамматика без контекста невозможна. Я полагаю, что для упрощенного псевдоанглийского подмножества, которое я описываю выше, может существовать контекстно-свободная грамматика.
Что касается того, почему это важно, то для анализа контекстно-свободной грамматики требуется более простая программа. Как отмечено в других ответах, для анализа контекстно-свободной грамматики не требуется полная мощность машины Тьюринга. Синтаксический анализатор LR (1) (который является своего рода автоматом для извлечения) для конкретной контекстно-свободной грамматики может анализировать любое предложение в этой грамматике во времени и пространстве, линейных по длине предложения. Если предложение на языке, синтаксический анализатор создаст структурное дерево, определяющее, что означает каждый символ в предложении (или, по крайней мере, какую роль он играет в структуре). Если предложение не в грамматике, синтаксический анализатор заметит и остановится на первом символе, который невозможно совместить с грамматикой и предшествующими символами (на первой «ошибке»).
Что еще лучше, так это то, что есть программы, в которых вы можете дать описание грамматики и список инструкций о том, что делать с каждой частью (в некотором смысле придавая «значение» каждой продукции), и программа напишет парсер для тебя. Программа проанализирует предложение, найдет структуру и выполнит ваши инструкции для каждой части структуры. Такого рода программа называется парсер-генератор или компилятор-компилятор.
Этот вид анализа языка был изобретен для автоматического анализа естественного языка (такого как английский), но оказывается, что это наиболее полезно для анализа компьютерных языков. Разработчик языка может написать грамматику, которая фиксирует его новый язык, а затем запустить ее через генератор синтаксического анализатора, чтобы получить программу, которая анализирует его язык и переводит, интерпретирует, компилирует, выполняет и т.д., если он хочет.
На самом деле, в большинстве случаев вы не можете этого сделать. Например, сбалансированные скобки являются контекстно-свободным языком, но язык, в котором требуется объявить все переменные перед их использованием, является контекстно-зависимым. Парсер является частью компилятора, но для реализации этих требований требуется дополнительная логика. Затем вам нужно написать грамматику, которая захватывает как можно больше вашего языка, выполнить ее через генератор синтаксического анализатора, а затем написать код, который обеспечивает выполнение остальных требований (обработчик таблицы символов и т. Д.).
Обычно мы не используем контекстно-зависимые грамматики, потому что они гораздо хуже поддерживаются. Я не знаю, существует ли эквивалент синтаксического анализатора LR (k) для контекстно-зависимых языков. Да, машина Тьюринга (или машина с линейной привязкой) может ее проанализировать, но я не знаю, существует ли общий алгоритм для преобразования контекстно-зависимой грамматики в программу для машины Тьюринга, в том смысле, что LR (1 ) Генератор создает таблицы разбора для машины. Я предполагаю, что таблицы, лежащие в основе парсера, будут экспоненциально больше. В любом случае, студенты CS (как и я, в свое время) обычно преподают грамматику без контекста и генераторы парсеров LR (1), такие как YACC.