yacc / lex или ручное кодирование?

Я работаю над новым языком программирования, но меня всегда удивляло то, что все используют yaxx / lex для разбора кода, а я нет.

Мой компилятор (который уже работает) написан вручную на C ++ / STL, и я не могу сказать, что он сложный или занял слишком много времени. Он имеет как своего рода лексер, так и парсер, но они не генерируются автоматически.

Ранее я написал компилятор C (не полную спецификацию) одинаково - он был способен скомпилировать программу за 1 проход со всеми этими разрешение ссылок & предварительная обработка - это определенно невозможно с yacc / lex.

Я просто не могу убедить себя отказаться от всего этого и начать погружаться в yaxx / lex - что может потребовать значительных усилий для реализации и может ввести некоторые грамматические ограничения.

Есть ли что-то, что я пропускаю, когда не использую yacc / lex? Я делаю зло?

8
задан Jonathan Leffler 29 August 2010 в 01:59
поделиться

4 ответа

Yacc в некоторых отношениях негибок:

  • хорошая обработка ошибок сложна (по сути, его алгоритм определен только для правильного синтаксического анализа правильной строки, в противном случае все ставки сняты; это одна из причин, по которой GCC перешел на написанный от руки парсер)
  • зависимость от контекста трудно выразить, тогда как с помощью написанного от руки парсера рекурсивного спуска вы можете просто добавить параметр к функциям

Кроме того, я заметил, что код объекта lex/yacc часто больше, чем написанный от руки анализатор рекурсивного спуска (исходный код, как правило, наоборот).

Я не использовал ANTLR, поэтому не могу сказать, лучше ли он в этих точках.

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

Это, безусловно, зависит от сложности грамматики вашего языка. Простая грамматика означает, что существует простая реализация, и вы можете просто сделать это самостоятельно.

Взгляните, может быть, на самый худший из возможных примеров: C++ :) (Кто-нибудь знает какой-либо другой язык, кроме естественных, которые труднее правильно разобрать?) Даже с такими инструментами, как Antlr, довольно сложно получить это правильно, хотя это управляемо. При этом, с другой стороны, даже несмотря на то, что это намного сложнее, кажется, что некоторые из лучших синтаксических анализаторов C++, например. GCC и LLVM также в основном написаны от руки.

Если вам не нужна слишком большая гибкость и ваш язык не слишком тривиален, вы, безусловно, сэкономите часть работы/времени, используя Antlr.

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

Другое огромное преимущество использования генераторов заключается в том, что они гарантированно обрабатывают точно и только язык, который вы указали в грамматике. Чего не скажешь ни о каком написанном от руки коде. Варианты LR/LALR также гарантированно будут O(N), чего опять же нельзя утверждать ни о каком ручном кодировании, по крайней мере, без больших усилий при построении доказательства.

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

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

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

Существуют потенциальные преимущества использования Yacc/Lex, но их использование не является обязательным. Есть и некоторые недостатки использования Yacc/Lex, но преимущества обычно перевешивают недостатки. В частности, часто легче поддерживать грамматику, управляемую Yacc, чем написанную вручную, и вы получаете выгоду от автоматизации, которую обеспечивает Yacc.

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

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

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