Преимущества Antlr (по сравнению с говорят, lex/yacc/bison) [закрытый]

Если вы используете Linux одинаково, просто наберите

man 2 pipe

У вас будет рабочий пример, очень похожий на ваш код. Или перейдите по этой ссылке http://man7.org/linux/man-pages/man2/pipe.2.html .

Сравнивая их, вы можете найти, где у вас возникли недоразумения.

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

134
задан Don Wakefield 17 October 2008 в 16:40
поделиться

4 ответа

Обновление/предупреждение: Этот ответ может устареть!

<час>

Одно существенное различие - то, что ANTLR генерирует LL (*) синтаксический анализатор, тогда как YACC и Бизон оба генерируют синтаксические анализаторы, которые являются LALR. Это - важное различие для многих приложений, при этом самыми очевидными являются операторы:

expr ::= expr '+' expr
       | expr '-' expr
       | '(' expr ')'
       | NUM ;

ANTLR совершенно неспособен к обработке этой грамматики как есть. Для использования ANTLR (или любой другой генератор LL-анализатора) необходимо было бы преобразовать эту грамматику во что-то, что не является леворекурсивным. Однако у Бизона нет проблемы с грамматиками этой формы. Необходимо было бы объявить '+' и '-' как ассоциируемые слева операторы, но это строго не требуется для левой рекурсии. Лучшим примером могла бы быть отправка:

expr ::= expr '.' ID '(' actuals ')' ;

actuals ::= actuals ',' expr | expr ;

Уведомление, что и expr и actuals правила являются леворекурсивными. Это производит намного более эффективный AST, когда он прибывает время для генерации кода, потому что он избегает потребности в нескольких регистрах, и ненужное проливание (отклоняющееся налево дерево может быть свернуто, тогда как склоняющееся право дерево не может).

С точки зрения персонального вкуса, я думаю, что LALR-грамматики намного легче создать и отладить. Оборотная сторона - Вы, должны иметь дело с несколько загадочными ошибками как shift-reduce, и (страшное) уменьшают - уменьшают. Это ошибки, которые Бизон фиксирует при генерации синтаксического анализатора, таким образом, он не влияет на опыт конечного пользователя, но он может сделать процесс разработки немного более интересным. ANTLR обычно считается легче использовать, чем YACC/Bison по точно этой причине.

141
ответ дан 23 November 2019 в 23:54
поделиться

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

9
ответ дан 23 November 2019 в 23:54
поделиться

Пара преимуществ для ANTLR:

  • может выводить синтаксические анализаторы на разных языках - Java не требуется для запуска сгенерированного синтаксического анализатора.
  • Великолепный графический интерфейс упрощает отладку грамматики (например, вы можете увидеть сгенерированный AST прямо в графическом интерфейсе, никаких дополнительных инструментов не требуется)
  • Сгенерированный код действительно удобочитаем (это одна из целей ANTLR), и тот факт, что он генерирует парсеры LL, безусловно, помогает в этом отношении.
  • определение терминалов также не зависит от контекста (в отличие от регулярного выражения в (f) lex) - таким образом, разрешается, например, определение терминалов , содержащее правильно закрытые круглые скобки

My. 02 $

33
ответ дан 23 November 2019 в 23:54
поделиться

Наиболее существенное различие между YACC / Bison и ANTLR - это тип грамматик, которые могут обрабатывать эти инструменты. YACC / Bison обрабатывает LALR-грамматики, ANTLR обрабатывает LL-грамматики.

Часто людям, долгое время работавшим с LALR-грамматиками, будет труднее работать с LL-грамматиками, и наоборот. Это не означает, что с грамматиками или инструментами труднее работать. Какой инструмент вам будет проще использовать, в основном сводится к знакомству с типом грамматики.

Что касается преимуществ, то есть аспекты, в которых грамматики LALR имеют преимущества перед грамматиками LL, а есть другие аспекты, в которых грамматики LL имеют преимущества перед Грамматики LALR.

YACC / Bison создают анализаторы, управляемые таблицей, что означает, что «логика обработки» содержится в данных программы синтаксического анализатора, не столько в коде парсера. Расплата заключается в том, что даже синтаксический анализатор очень сложного языка имеет относительно небольшой объем кода. Это было более важно в 1960-х и 1970-х годах, когда оборудование было очень ограниченным. Генераторы парсеров, управляемые таблицами, восходят к этой эре, и тогда основным требованием был небольшой объем кода.

ANTLR генерирует парсеры с рекурсивным спуском, что означает, что «логика обработки» содержится в коде парсера, как каждое производственное правило грамматики представлен функцией в коде парсера. Расплата в том, что легче понять, что делает парсер, прочитав его код. Кроме того, парсеры с рекурсивным спуском обычно быстрее, чем парсеры, управляемые таблицами. Однако для очень сложных языков объем кода будет больше. Это было проблемой в 1960-х и 1970-х годах. Тогда только относительно небольшие языки, такие как, например, Паскаль, были реализованы таким образом из-за аппаратных ограничений.

Парсеры, генерируемые ANTLR, обычно составляют около 10 000 строк кода и более. Рукописные синтаксические анализаторы рекурсивного спуска часто находятся на одном уровне. Компилятор Wirth Oberon, пожалуй, самый компактный, содержащий около 4000 строк кода, включая генерацию кода, но Oberon - очень компактный язык, содержащий всего около 40 производственных правил.

Как кто-то уже заметил, большим плюсом ANTLR является то, что графический инструмент IDE, называемый ANTLRworks. Это полноценная лаборатория грамматики и языкового дизайна. Он визуализирует ваши грамматические правила по мере их ввода и, если обнаружит какие-либо конфликты, графически покажет вам, что это за конфликт и что его вызывает. Он даже может автоматически выполнять рефакторинг и разрешать такие конфликты, как левая рекурсия. Если у вас есть свободная от конфликтов грамматика, вы можете позволить ANTLRworks проанализировать входной файл вашего языка и построить для вас дерево синтаксического анализа и AST и показать дерево графически в среде IDE. Это очень большое преимущество, потому что это может сэкономить вам много часов работы: вы обнаружите концептуальные ошибки в своем языковом дизайне еще до того, как начнете кодировать! Я не нашел такого инструмента для грамматик LALR, похоже, нет такого инструмента.

Даже для людей, которые не хотят создавать свои парсеры, но вручную их кодируют, ANTLRworks - отличный инструмент для языкового дизайна / прототипирования . Вполне возможно, лучший из имеющихся инструментов. К сожалению, это не поможет вам, если вы хотите создавать парсеры LALR. Возможно, стоит переключиться с LALR на LL просто для того, чтобы воспользоваться преимуществами ANTLRworks, но для некоторых людей смена типа грамматики может быть очень болезненным опытом. Другими словами: YMMV.

108
ответ дан 23 November 2019 в 23:54
поделиться
Другие вопросы по тегам:

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