Причины, по которым lex / yacc и производные выглядят настолько повсеместно в наши дни, заключаются в том, что они существуют гораздо дольше, чем другие инструменты, что они имеют гораздо больший охват в литературе и что они традиционно поставляются с операционными системами Unix. Это очень мало связано с тем, как они сравниваются с другими инструментами генерации лексеров и парсеров.
Независимо от того, какой инструмент вы выберете, всегда будет существенная кривая обучения. Поэтому, если вы несколько раз использовали определенный инструмент и стали относительно удобны в его использовании, вы вряд ли захотите потратить дополнительные усилия на изучение другого инструмента. Это только естественно.
Кроме того, в конце 1960-х и начале 1970-х годов, когда были созданы lex / yacc, аппаратные ограничения представляли серьезную проблему для синтаксического анализа. Метод анализа LR на основе таблиц, используемый Yacc, был наиболее подходящим в то время, потому что его можно было реализовать с небольшим объемом памяти, используя относительно небольшую общую программную логику и сохраняя состояние в файлах на ленте или диске. Методы синтаксического анализа, основанные на коде, такие как LL, занимали больший минимальный объем памяти, потому что сам код программы синтаксического анализа представляет грамматику, и поэтому для его выполнения необходимо полностью помещаться в ОЗУ и сохранять состояние стека в ОЗУ.
Когда памяти стало больше, было проведено гораздо больше исследований, посвященных различным методам синтаксического анализа, таким как LL и PEG, и методам создания инструментов с использованием этих методов. Это означает, что многие из альтернативных инструментов, которые были созданы после семейства lex / yacc, используют разные типы грамматик. Однако переключение типов грамматики также влечет за собой значительную кривую обучения. Если вы знакомы с одним типом грамматики, например, грамматикой LR или LALR, вы с меньшей вероятностью захотите переключиться на инструмент, использующий грамматику другого типа, например грамматики LL.
В целом, семейство инструментов lex / yacc, как правило, более элементарно, чем более поздние пользователи, которые часто имеют сложные пользовательские интерфейсы для графической визуализации грамматики и грамматических конфликтов или даже разрешения конфликтов с помощью автоматического рефакторинга.
Итак, если у вас нет опыта работы с какими-либо инструментами синтаксического анализа, если вам все равно придется изучать новый инструмент, то вам, вероятно, следует обратить внимание на другие факторы, такие как графическая визуализация грамматик и конфликтов, авторефакторинг, наличие хороших инструментов. документация, языки, на которых можно выводить сгенерированные лексеры / парсеры и т. д. и т. д. Не выбирайте какой-либо инструмент просто потому, что «это то, что, кажется, используют все остальные».
Вот несколько причин, по которым я мог бы использовать lex / yacc или flex / bison:
- разработчик уже знаком с lex / yacc или flex / bison
- разработчик наиболее знаком и удобен с грамматиками LR / LALR
- у разработчика есть много книг на lex / yacc, но нет книг на других
- у разработчика есть предполагаемое предложение о работе, и ему сказали, что навыки lex / yacc повысят его шансы получить работу
- разработчик не может получить бай-ин от участников проекта / заинтересованных сторон за использование других инструментов
- в среде установлен lex / yacc, и по какой-то причине невозможно установить другие инструменты