Введение

Программа-генератор парсеров, совместимая с Yacc. Сгенерированные парсеры переносимы: они не требуют каких-либо конкретных компиляторов. Bison по умолчанию генерирует парсеры LALR(1), но также может генерировать канонические LR, IELR(1) и GLR парсеры. В режиме POSIX Bison совместим с Yacc, но также имеет ряд расширений по сравнению с этой более ранней программой, включая:

* Генерацию контрпримеров для конфликтов.
* Отслеживание местоположения (например, файл, строка, столбец).
* Подробные и интернационализированные сообщения об ошибках синтаксиса в сгенерированных парсерах.
* Настраиваемую генерацию сообщений об ошибках синтаксиса.
* Повторно входящие парсеры (Reentrant parsers).
* Парсеры с подавлением (Push parsers) с автодополнением.
* Поддержку именованных ссылок.
* Несколько типов отчетов (графические, XML) о сгенерированном парсере.
* Поддержку нескольких языков программирования (C, C++, D или Java).

Flex, автоматический анализатор лексем, часто используется с Bison для токенизации входных данных и предоставления Bison токенов. Bison был первоначально написан Робертом Корбетом в 1985 году. Позже, в 1989 году, Роберт Корбет выпустил еще один генератор парсеров под названием Berkeley Yacc. Bison был сделан совместимым с Yacc Ричардом Столлманом. Bison является свободным программным обеспечением и распространяется под лицензией GNU General Public License с исключением (описанным ниже), позволяющим использовать его сгенерированный код без соблюдения требований copyleft лицензии.

Возвращение

Повторный вызов (reentrancy) — это функция, добавленная в Bison, которой нет в Yacc. Обычно Bison генерирует нереентрантный парсер. Для обеспечения повторного входа необходимо использовать объявление %define api.pure. Более подробную информацию о повторном вызове в Bison можно найти в руководстве Bison.

Языки вывода

Bison может генерировать код для C, C++, D и Java. Для использования парсера, сгенерированного Bison, из других языков можно использовать инструмент для создания привязок к языкам программирования, например SWIG.

Лицензия и распространение генерируемого кода

Поскольку Bison генерирует исходный код, который затем включается в исходный код других программных проектов, это порождает несколько простых, но интересных вопросов, касающихся авторских прав.

Не требуется лицензия, совместимая с GPL

Код, генерируемый Bison, включает в себя значительные объемы кода из самого проекта Bison. Пакет Bison распространяется на условиях лицензии GNU General Public License (GPL), но к нему добавлено исключение, согласно которому GPL не распространяется на результат работы. В более ранних версиях Bison оговаривалось, что части его вывода также лицензируются под GPL из-за включения функции yyparse из исходного кода в этот вывод.

Распределение посылок с использованием Bison

Проекты свободного программного обеспечения, использующие Bison, могут выбирать, распространять ли исходный код, который передается в Bison, или результирующий C-код, сгенерированный Bison. Оба варианта достаточны для компиляции исходного кода проекта получателем. Однако распространение только исходного кода создает небольшое неудобство: получателям потребуется установленная совместимая версия Bison для генерации необходимого C-кода при компиляции проекта. А распространение только C-кода затрудняет модификацию парсера, поскольку этот код не предназначен для чтения или редактирования человеком – он предназначен для прямой подачи в компилятор C. Эти проблемы можно избежать, распространяя как исходные файлы, так и сгенерированный код. Большинство пользователей будут компилировать, используя сгенерированный код, как и любое другое программное обеспечение, но любой, кто захочет изменить компонент парсера, сможет сначала изменить исходные файлы и повторно сгенерировать код перед компиляцией. Проекты, распространяющие оба варианта, обычно не хранят сгенерированные файлы в системах контроля версий. Эти файлы генерируются только при создании релиза. Некоторые лицензии, такие как GPL, требуют, чтобы исходный код был предоставлен в "предпочтительной форме для внесения изменений". Поэтому проекты, использующие Bison и распространяемые под лицензией GPL, должны распространять файлы, являющиеся входными данными для Bison. Разумеется, они также могут включать сгенерированные файлы.