Компонуемые грамматики

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

8
задан benjismith 4 June 2009 в 21:29
поделиться

5 ответов

Возможно, вы захотите послушать этот подкаст. Разбор без использования сканера был «изобретен», чтобы помочь решить проблему составления различных грамматик (проблема в том, что вы быстро обнаруживаете, что не можете написать «универсальный» токенизатор / сканер).

4
ответ дан 5 December 2019 в 17:40
поделиться

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

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

1
ответ дан 5 December 2019 в 17:40
поделиться

Я работаю именно над этой проблемой. Поделюсь своими мыслями:

Грамматики сложно отлаживать. Я отлаживал несколько в Bison и ANTLR, и это было некрасиво. Если вы хотите, чтобы пользователь вставлял DSL в ваш синтаксический анализатор в качестве грамматики, вам нужно найти способ сделать это, чтобы он не взорвался. Мой подход состоит в том, чтобы не разрешать произвольные DSL, а разрешать только те, которые следуют двум правилам:

  • Типы токенов (идентификаторы, строки, числа) одинаковы для всех DSL в файле.
  • Несбалансированные круглые скобки, фигурные скобки, или скобки не разрешены

Причина первого ограничения заключается в том, что современные синтаксические анализаторы разбивают синтаксический анализ на лексический этап, а затем применяют ваши традиционные правила грамматики. К счастью, я считаю, что одного универсального токенизатора достаточно для 90% DSL, которые вы хотите создать, даже если он не поддерживает уже созданные вами DSL, которые вы хотите встроить.

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

Другая часть решения - разрешить макросы. Например, regex ("abc * / [^.]") мне подходит. Таким образом, макрос « regex » может анализировать регулярное выражение вместо того, чтобы строить грамматор регулярных выражений в основном языке. Конечно, вы не можете использовать разные разделители для вашего регулярного выражения, но, на мой взгляд, вы получите некоторую согласованность.

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

Другая часть решения - разрешить макросы. Например, regex ("abc * / [^.]") мне подходит. Таким образом, макрос « regex » может анализировать регулярное выражение вместо того, чтобы строить грамматор регулярных выражений в основном языке. Конечно, вы не можете использовать разные разделители для вашего регулярного выражения, но, на мой взгляд, вы получите некоторую согласованность.

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

Другая часть решения - разрешить макросы. Например, regex ("abc * / [^.]") мне подходит. Таким образом, макрос « regex » может анализировать регулярное выражение вместо того, чтобы строить грамматор регулярных выражений в основном языке. Конечно, вы не можете использовать разные разделители для вашего регулярного выражения, но, на мой взгляд, вы получите некоторую согласованность.

скобки), а затем рекурсивно разбирает каждую группу. Грамматика вашего встроенного DSL не может выйти за рамки скобок, в которых она содержится.

Другая часть решения - разрешить макросы. Например, regex ("abc * / [^.]") мне подходит. Таким образом, макрос « regex » может анализировать регулярное выражение вместо того, чтобы строить грамматор регулярных выражений в основном языке. Конечно, вы не можете использовать разные разделители для вашего регулярного выражения, но, на мой взгляд, вы получите некоторую согласованность.

скобки), а затем рекурсивно разбирает каждую группу. Грамматика вашего встроенного DSL не может выйти за рамки скобок, в которых она содержится.

Другая часть решения - разрешить макросы. Например, regex ("abc * / [^.]") мне подходит. Таким образом, макрос « regex » может анализировать регулярное выражение вместо того, чтобы строить грамматор регулярных выражений в основном языке. Конечно, вы не можете использовать разные разделители для вашего регулярного выражения, но, на мой взгляд, вы получите некоторую согласованность.

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

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

3
ответ дан 5 December 2019 в 17:40
поделиться

Если задуматься, то действительно так работает синтаксический анализ рекурсивного спуска. Каждое правило и все правила, от которых оно зависит, образуют мини-грамматику. Все, что выше, не имеет значения. Вы можете, например, написать грамматику Java с помощью ANTLR и разделить все различные «мини-языки» на разные части файла.

Это не очень распространено просто по той причине, что эти «мини-языки» будут часто разделяют множество правил. Однако было бы определенно хорошо, если бы такие инструменты, как ANTLR, позволяли вам включать отдельные грамматики из разных файлов. Это позволит вам логически разделить их. Причина, по которой это, вероятно, не реализовано, вероятно, заключается в том, что это «косметическая» проблема, она связана исключительно с самими файлами грамматики, а не с самим анализом. Он также выиграл ' t сделать ваш код короче (хотя, возможно, вам будет немного легче следовать ему). Единственная техническая проблема, которую это может решить, - это конфликты имен.

0
ответ дан 5 December 2019 в 17:40
поделиться

Взгляните на SGLR , Обобщенный анализ LR без сканирования. Вот несколько ссылок и URL-адресов. Этот метод синтаксического анализа делает составление таблиц синтаксического анализа очень простым. Особенно в сочетании с SDF .

Мартин Бравенбоер и Элко Виссер. Разработка синтаксических вложений и ассимиляций для языковых библиотек. В «Модели в разработке программного обеспечения: семинары и симпозиумы» на MoDELS 2007, том 5002 LNCS, 2008.

MetaBorg и MetaBorg в действии

1
ответ дан 5 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: