yacc / lex или ручное кодирование? - PullRequest
8 голосов
/ 29 августа 2010

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

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

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

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

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

Ответы [ 5 ]

6 голосов
/ 29 августа 2010

Основные преимущества использования любого вида генератора лексеров / парсеров в том, что он дает вам гораздо больше гибкости, если ваш язык развивается. В лексере / парсере с ручной кодировкой (особенно если вы смешали много функций за один проход!) Изменения в языке становятся довольно неприятными, тогда как с помощью генератора синтаксических анализаторов вы вносите изменения, перезапустите генератор, и двигаться дальше со своей жизнью. Конечно, нет никаких внутренних технических ограничений, чтобы всегда просто писать все от руки, но я думаю, что эволюционируемость и ремонтопригодность автоматизации удаления скучных битов того стоят!

4 голосов
/ 29 августа 2010

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

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

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

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

3 голосов
/ 29 августа 2010

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

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

1 голос
/ 29 августа 2010

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

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

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

0 голосов
/ 29 августа 2010

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

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

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

...