Что такое реальный вариант использования грамматики Chomsky Type-I (контекстно-зависимой)

9

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

Что является хорошим реальным (то есть не теоретическим) примером контекстно-зависимой грамматики?

Эван Плейс
источник
8
Считается ли язык программирования?
Мартин Йорк
@LokiAstari Конечно.
Эван Плейс
2
Я предполагаю, что языки программирования рассчитывают, но не являются хорошим решением, поскольку сложность контекстно-зависимой обычно заменяется на контекстно-свободную грамматику с семантическим анализом.
Франк
@ Фрэнк Я думаю, моя проблема в том, что я не могу понять, что такое контекстно-зависимые языки, не применяя их в реальных условиях.
Эван Плейс
Есть некоторые человеческие языки, которые могут не требовать рекурсивно перечислимых синтаксических анализаторов и, следовательно, попадают в набор языков типа 1 (контекстно-зависимый). cs.virginia.edu/~evans/cs3102/?p=138

Ответы:

9

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

Однако это не означает, что эти языки не зависят от контекста , поэтому вот несколько примеров:


Haskell позволяет вам определять функции, которые используются в качестве операторов, а также определять приоритет и ассоциативность этих операторов. Другими словами, вы не можете построить правильное дерево разбора для выражения оператора, такого как:

a @@ b @@ c ## d ## e

если вы уже не анализировали объявления приоритета / ассоциативности для @@и ##:

infixr 8 @@
infixr 6 ##

Вторым примером является Bencode , язык данных, который ставит контент перед префиксом:

<length>:<contents>

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


Третий пример - XML, при условии, что допускаются произвольные имена тегов: имена открывающих тегов должны иметь совпадающие закрытые теги:

<hi>
 <bye>
 the closing tag has to match bye
 </bye>
</hi> <!-- has to match "hi" -->

источник
Интересно. Я знал о XML. Я подозреваю, что причина, лежащая в основе спецификации XHTML 1.0, заключалась в том, чтобы увести HTML-интерпретаторы «в режиме причуда», которые поддерживают контекстно-зависимые исключения, в более чистый контекстно-свободный XML.
Эван Плейс,
@EvanPlaice Я смущен вашим комментарием - «чистый XML» является контекстно-зависимым, как я показал в моем примере.
4
@ MattFenwick Я думаю, что ваш пример XML не показывает истинную причину, по которой XML не является контекстно-свободным. Причина в том, что допускаются произвольные имена тегов. Если бы разрешался только определенный набор тегов, XML был бы свободен от контекста.
Хонза Брабек
@HonzaBrabec вы правы - я неявно предположил, что имена произвольных тегов разрешены. Я должен был четко сформулировать это предположение. Спасибо, что указали на это!
3

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

Возможно, вы можете найти пример реального использования в одной из этих библиотек:

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

http://opennlp.sourceforge.net/projects.html

http://nltk.org/

http://nlp.stanford.edu/nlp/javadoc/javanlp/

AlexBottoni
источник
2
А как насчет HTML «режима причуд» и препроцессоров кода, они не будут считать?
Эван Плейс,
2

Контекстно-зависимые грамматики иногда используются в описаниях семантики языка программирования. Возможно, наиболее всесторонним использованием контекстно-зависимых грамматик было определение языка Algol68. Он использовал контекстную два уровня бесплатно грамматику (см http://en.wikipedia.org/wiki/Two-level_grammar ) для описания как синтаксиса и семантики программ Algol68.

Несколько моих коллег использовали ван Вейнгаарденом грамматику , чтобы направить их реализацию Algol68 (см http://en.wikipedia.org/wiki/FLACC ).

BobDalgleish
источник