В чем разница между Flex / Lex и Yacc / Bison?

122

В чем разница между Flex & Lex и Yacc & Bison. Я искал в Интернете и не нашел однозначного ответа.

Могу ли я установить на Ubuntu чистые Lex и Yacc, или я могу установить только flex и bison. Я смущен.

  • Lex или Yacc все еще кто-то обслуживает?
  • Все ли они бесплатны?
  • Если Lex не является бесплатным, почему он установлен в моем дистрибутиве Ubuntu?

    lex --version
    lex 2.5.35
    
Тупой вопрошающий
источник
3
Не существует lex версии 2.5.35 - вы используете flex версии 2.5.35, он просто идентифицирует себя как 'lex', если вы вызываете его как 'lex'
Крис Додд

Ответы:

81

Между Lex и Flex есть некоторые различия, но вы должны злоупотреблять Lex, чтобы столкнуться с проблемами с Flex. (У меня есть программа, которая злоупотребляет Lex и поэтому не работает с Flex.) Это в первую очередь относится к области упреждающего ввода; в Lex вы можете предоставить свой собственный код ввода и изменить поток символов; Flex не позволит вам этого сделать.

Yacc и Bison довольно хорошо совместимы, хотя у Bison есть некоторые дополнительные возможности.

Вероятно, вы не сможете найти легитимные копии (оригинальной, версии AT&T) Lex и Yacc для установки на Ubuntu. Я бы не сказал, что это невозможно, но я не знаю об этом. Flex и Bison легко доступны и эквивалентны для большинства целей. Вы также можете найти различные альтернативные и примерно эквивалентные программы из мира BSD.

Lex и Yacc поддерживаются лицензиатами Unix SVRx - такие компании, как IBM (AIX), HP (HP-UX) и Sun (Solaris), по своему усмотрению модифицировали версии Lex и Yacc. MKS также поставляет MKS Lex и MKS Yacc; однако у Yacc есть, по крайней мере, некоторые нестандартные расширения.

Flex и Bison бесплатны. (AT&T) Лекс и Якк нет.

Джонатан Леффлер
источник
4
Информация о Yacc неверна. У Беркли есть Yacc, который присутствует и доступен по лицензии BSD во всех операционных системах BSD с открытым исходным кодом. Я проголосовал против этого аккаунта, но если ответ будет исправлен достаточно быстро, я удалю голос против.
Дэниел С. Собрал,
2
@ Дэниел: AFAIK, AT&T Yacc нельзя получить в Беркли - в Беркли вы получаете Berkeley Yacc. Я уточню ответ, чтобы отразить это.
Джонатан Леффлер,
1
В flex вы, безусловно, можете безболезненно переключать входные буферы (я сделал это однажды, чтобы обработать по существу #include). В моей книге О'Рейли по lex & yacc (извините, здесь нет под рукой) сказано, что в lex это возможно только с помощью отвратительных хаков.
vonbrand
33

Bison - это реализация / расширение Yacc GNU, Flex - преемник Lex. В любом случае можно (и рекомендуется) использовать bison / flex.

Ян Юнгникель
источник
1
Кроме того, byacc, реализация yacc в Беркли, широко доступна (я вижу ее в моем списке репозиториев Debian).
Майкл Экстранд
1
Flex называется так, потому что он (был?) намного быстрее, чем lex. У него есть несколько расширений, и сгенерированные файлы не похожи друг на друга (т. Е. Уродливые хаки в lex не работают с flex и наоборот).
vonbrand
11

В большинстве (всех?) Linux-систем «Lex» фактически является символической ссылкой на flex. По сути, это просто другое название бесплатной версии.

NDR
источник
1
В моей системе (Arch Linux) два двоичных файла ведут себя иначе. Вероятно, это функция совместимости с lex.
Данило Барген
10

YACC доступен по лицензиям с открытым исходным кодом от Plan 9 и Open Solaris. Также существует Berkeley YACC, который совместим с исходным YACC, но не имеет исходного кода. Berkeley YACC можно найти в любой из операционных систем BSD с открытым исходным кодом.

Дэниел С. Собрал
источник
2

Bison в составе проекта GNU. А yacc используется как утилита в Berkeley Software Distribution (BSD). Хотя она совместима с yacc, но Lex и Yacc остались в прошлом. Флекс и бизон сегодня широко используются.

Авани Ранаде
источник