Может кто-нибудь привести простой, но не игрушечный пример контекстно-зависимой грамматики?

12

Я пытаюсь понять контекстно-зависимые грамматики.

Я понимаю, почему языки как

  1. {wwwA}
  2. {anbncnnN}

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

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

Являются ли контекстно-зависимые грамматики достаточно мощными, чтобы сделать неопределенные / необъявленные / несвязанные переменные синтаксической (а не семантической) ошибкой?

BlueBomber
источник
1
почти все настоящие языки программирования являются контекстно-зависимыми (в общем смысле, то есть объединяя грамматики chomsky type-0 и type-I в «context-context»). Например, переменные должны быть объявлены перед использованием, идентификаторы должны быть уникальными, все они требуют контекста (st упоминается как семантический контекст, но может вводить в заблуждение) cs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
Nikos M .
Что ж, «контекстно-зависимый» является стандартным термином для грамматик типа 1.
reinierpost

Ответы:

8

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

{a,b,;,(,)}

{w1;w2;;wn(x1;x2;;xm)wi,xj{a,b}, each xj is equal to some wi}

xjwj

Хендрик Ян
источник
Спасибо вам за публикацию. На данный момент я менее знаком с LBA, поэтому я менее убежден в пункте (2). Что касается пункта (1), я пытаюсь понять, как создать правила, которые будут генерировать, где имя переменной ожидается в качестве выражения, только одну из переменных в текущей области. Мне не нужно видеть всю формальную CSG, но просто неофициальное объяснение сработало бы. Я не могу себе представить, как это сделать с именами переменных из нескольких символов, что представляет собой другое использование контекста, чем, например, использование одного нетерминального контекста для прямого согласования числа субъект-глагол при выводе английского предложения.
{www}
{ww|w...}
3
{ww}LRLwRwLaMawMabbMaRMaRRa
13

[n]

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

В CSL также есть довольно естественные языки, которые еще сложнее.

Однако я не знаю ни одного способа выразить произвольную CSL как контекстно-зависимую грамматику (CSG), кроме как использовать конструкцию Ландвебера в теореме 3 его статьи. В этой конструкции CSG описывает обратную операцию линейно ограниченного автомата, который распознает CSL. Продукция CSG описывает, как конкретное состояние машины является результатом одного возможного движения. Такая CSG является простым переводом автомата в грамматику, поэтому она не обязательно будет соответствовать особенностям языка, таким как возможность объявления переменных, но вместо этого будет увязать в деталях автомата.

Если вы настаиваете на CSG, а не на CSL, и если ваш фактический вопрос касается именно того, хотите ли вы увидеть CSG для языка, который включает ограниченную область видимости переменных, то ответ Хендрика Яна, похоже, будет хорошим началом.

Андраш Саламон
источник
9

Да, контекстно-зависимые грамматики (CSG) достаточно мощны для проверки неопределенных / необъявленных / несвязанных переменных, но, к сожалению, мы не знаем эффективного алгоритма для анализа строк CSG.

Настоящим примером контекстно-зависимого языка является язык программирования C. Такая функция, как объявление переменных сначала, а затем их использование, делает язык C контекстно-зависимым языком (CSL). ( Я не знаю о нетипизированном лямбда-исчислении ).

И потому что мы не знаем ни одного линейного алгоритма синтаксического анализа для CSL (или CSG). По этой причине при разработке компилятора мы используем CFG (и только его алгоритм синтаксического анализа) для проверки синтаксиса, поскольку мы знаем эффективные алгоритмы для синтаксического анализа CFG (если он находится в ограниченной форме). Компиляторы сначала анализируют контекстно-свободную функцию, а затем проблематичным образом обрабатывают контекстно-зависимые функции (например, проверяет любую использованную переменную в таблице символов, если она определена. В противном случае она генерирует ошибку).

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

Я попытаюсь объяснить это глупым, но простым примером (это просто идея, вы можете уточнить это):

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

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

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

Но

             Grijesh    am       working       [wrong statement]

Причина: значение <TENSE> зависит от значения <NOUN> (например, I &lt;TENNSE> --> I am) и, следовательно, грамматика не генерирует правильные выражения на английском языке.

На самом деле мы не можем написать контекстную грамматику для полного английского!

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


СПРАВКА : Вы можете посмотреть лекции доктора Аруна Кумара . В какой-то лекции он объясняет, что именно вас интересует.

Грижеш Чаухан
источник
Спасибо за информацию, она, несомненно, будет полезна для других, интересующихся этой же темой, но она лишь частично связана с тем, что я бы спросил. Я не собираюсь разбирать строку, сгенерированную CSG, но хочу увидеть простой - даже глупый - пример формальной CSG, которая генерирует правильно сформированные абстракции (без связанных переменных в теле функции). Я могу представить себе CSG для генерации правильных «английских» строк, так как один символ может управлять соглашением субъект / глагол, но с помощью абстракций переменные обычно состоят из нескольких символов.
1
@BlueBomber: спасибо, я обязательно отвечу вам, его ночь в Индии .. С Новым годом! :)
Грижеш Чаухан
Кажется, я могу сделать это только ограниченное количество раз, и в соответствии с (этим) [ meta.scicomp.stackexchange.com/questions/156/… , я должен удалить этот вопрос и разместить его в более подходящем месте ...
@BlueBomber Я помечен для переключения, вы также можете сделать.
Grijesh Chauhan
1

(расширяя комментарии в ответ)

Не уверен, что это пример, который вы хотели бы, в любом случае.

Почти все языки реального программирования являются контекстно-зависимым (в общем смысле, то есть приравнивая как Хомский типа 0 и типа I грамматика под «контекстно-зависимой», это верно, конечно , так как свободные грамматиками являются даже более контекстно-зависимым , чем контекст -чувствительные грамматики).

Например, «переменные должны быть объявлены перед использованием», «идентификаторы должны быть уникальными», все они требуют контекста (иногда называемого семантическим контекстом, но это может вводить в заблуждение, поскольку в любом случае оно включает синтаксические функции), см., Например, https: // www .cs.purdue.edu / дома / Hosking / 502 / примечания / 04-semantics.pdf

Смысл в том, что приведенные выше примеры являются контекстно-зависимыми (в грамматическом / синтаксическом и семантическом смысле), потому что они говорят о своем контексте (что предшествует или следует за).

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

см. также Является ли JavaScript контекстно-свободным языком? на ТАК

Никос М.
источник
«Контекстно-зависимый» означает тип 1.
reinierpost