Останнім часом я весело вивчаю розвиток мовних аналізаторів у контексті того, як вони вписуються в ієрархію Хомських.
Що таке хороший реальний (тобто не теоретичний) приклад контекстної граматики?
Останнім часом я весело вивчаю розвиток мовних аналізаторів у контексті того, як вони вписуються в ієрархію Хомських.
Що таке хороший реальний (тобто не теоретичний) приклад контекстної граматики?
Відповіді:
Хороше питання. Хоча, як зазначалося в коментарях, дуже багато мов програмування залежать від контексту, але контекстна чутливість часто не вирішується на фазі розбору, а на більш пізніх фазах - тобто, набір мови аналізується за допомогою граматики без контексту, а деякі з цих дерев розбору пізніше відфільтровують.
Однак це не означає, що ці мови не залежать від контексту , тому ось кілька прикладів:
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" -->
Наскільки я знаю, контекстно-залежні граматики використовуються лише для обробки природних мов . Перекладачі та компілятори мов програмування не намагаються розібрати без контексту граматику через складність (навіть якщо раніше була зроблена спроба).
Можливо, ви можете знайти приклад реального використання в одній із цих бібліотек:
http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits
Контекстно-чутливі граматики іноді використовуються в описах семантики мови програмування. Мабуть, найповнішим використанням контекстно-чутливих граматик було визначення мови Algol68. Він використовував дворівневий вільний грамматик контексту (див. Http://en.wikipedia.org/wiki/Two-level_grammar ) для опису як синтаксису, так і семантики програм Algol68.
Кілька моїх колег використовували граматику ван Війнгаарден, щоб керувати їх виконанням Algol68 (див. Http://en.wikipedia.org/wiki/FLACC ).