Что такое реальный вариант использования грамматики 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/


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

2

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.