Я работаю над новым языком программирования, но меня всегда удивляло то, что все используют yaxx / lex для разбора кода, а я нет.
Мой компилятор (который уже работает) написан вручную на C ++ / STL, и я не могу сказать, что он сложный или занял слишком много времени. Он имеет как своего рода лексер, так и парсер, но они не генерируются автоматически.
Ранее я написал компилятор C (не полную спецификацию) одинаково - он был способен скомпилировать программу за 1 проход со всеми этими разрешение ссылок & предварительная обработка - это определенно невозможно с yacc / lex.
Я просто не могу убедить себя отказаться от всего этого и начать погружаться в yaxx / lex - что может потребовать значительных усилий для реализации и может ввести некоторые грамматические ограничения.
Есть ли что-то, что я пропускаю, когда не использую yacc / lex? Я делаю зло?
Yacc в некоторых отношениях негибок:
Кроме того, я заметил, что код объекта lex/yacc часто больше, чем написанный от руки анализатор рекурсивного спуска (исходный код, как правило, наоборот).
Я не использовал ANTLR, поэтому не могу сказать, лучше ли он в этих точках.
Это, безусловно, зависит от сложности грамматики вашего языка. Простая грамматика означает, что существует простая реализация, и вы можете просто сделать это самостоятельно.
Взгляните, может быть, на самый худший из возможных примеров: C++ :) (Кто-нибудь знает какой-либо другой язык, кроме естественных, которые труднее правильно разобрать?) Даже с такими инструментами, как Antlr, довольно сложно получить это правильно, хотя это управляемо. При этом, с другой стороны, даже несмотря на то, что это намного сложнее, кажется, что некоторые из лучших синтаксических анализаторов C++, например. GCC и LLVM также в основном написаны от руки.
Если вам не нужна слишком большая гибкость и ваш язык не слишком тривиален, вы, безусловно, сэкономите часть работы/времени, используя Antlr.
Другое огромное преимущество использования генераторов заключается в том, что они гарантированно обрабатывают точно и только язык, который вы указали в грамматике. Чего не скажешь ни о каком написанном от руки коде. Варианты LR/LALR также гарантированно будут O(N), чего опять же нельзя утверждать ни о каком ручном кодировании, по крайней мере, без больших усилий при построении доказательства.
Я написал оба и жил с обоими, и я никогда больше не буду писать код вручную. Я сделал это только потому, что в то время у меня не было yacc на платформе.
Возможно, вы упускаете ANTLR, что полезно для языков который может быть определен с помощью стратегии синтаксического анализа рекурсивного спуска.
Существуют потенциальные преимущества использования Yacc/Lex, но их использование не является обязательным. Есть и некоторые недостатки использования Yacc/Lex, но преимущества обычно перевешивают недостатки. В частности, часто легче поддерживать грамматику, управляемую Yacc, чем написанную вручную, и вы получаете выгоду от автоматизации, которую обеспечивает Yacc.
Однако написать собственный синтаксический анализатор с нуля не так уж и плохо. Это может затруднить обслуживание в будущем, но может и упростить его.