گنو بایسون
بایسون گنو بخشی از پروژه گنو است که مسئولیت تجزیه زبان‌های مستقل از متن را بر عهده دارد. بایسون مشخصه‌های یک زبان مستقل از متن را خوانده، هر جا که با ابهام در تجزیه روبرو شود، هشداری را صادر کرده، سپس یک تجزیه‌گر واژگانی را تولید می‌کند (برای زبان‌های سی، سی++ یا جاوا) که این تجزیه‌گر، خود می‌تواند دنباله‌ای از توکن‌ها را بخواند و تصمیم بگیرد که آیا این دنباله، با ساختار دستوری که توسط گرامر اولیه مشخص شده، همخوانی دارد یا نه. بایسون به صورت پیشفرض تجزیه‌گرهای نوع LALR تولید می‌کند، اما قادر به تولید کردن تجزیه‌گرهای GLR هم است.
در حالت POSIX بایسون با Yacc سازگار است ولی می تواند با برنامه های قدیمی تر نیز کار کند. از جمله :FLEX که یک آنالیز کننده ی کلمه ای خودکار است، معمولا به همراه بایسون استفاده می شود. تا داده های ورودی را توکن بندی کند و توکن ها را در اختیار بایسون قرار دهد.
بایسون ابتدا در سال 1985 توسط رابرت کوربت نوشته شد. بعدها در سال 1989 او یک تولید کننده ی پارسر دیگر به نام Berkeley Yacc ایجاد کرد. بایسون و Yacc توسط ریچارد استالمن با یکدیگر سازگار شدند.
بایسون یک نرم افزار رایگان است و تحت GNU General Public License قرار دارد. با یک استثنا ( که در زیر مورد بحث قرار گرفته است) که به کد تولیدی اجازه می دهد بدون عبور از حقوق کپی رایت مورد استفاده قرار بگیرد.
یک نمونه ی پارسر بازورود کامل ----مثال زیر چگونگی استفاده از بایسون و فلکس در راستای ایجاد یک برنامه ی ماشین حساب ساده را نشان می دهد (فقط جمع و ضرب) و یک برنامه نیز برای ایجاد یک Abstract syntax tree نشان می دهد. دو فایل بعدی تعریف و پیاده سازی کارکرد های درخت را نشان می دهد :  * @brief The operation type typedef enum tagEOperationType } EOperationType; typedef struct tagSExpression
} SExpression; SExpression *createNumber(int value); SExpression *createOperation(EOperationType type, SExpression *left, SExpression *right); void deleteExpression(SExpression *b);
* Expression.c * @brief Allocates space for expression static SExpression *allocateExpression()
SExpression *createNumber(int value)
SExpression *createOperation(EOperationType type, SExpression *left, SExpression *right)
void deleteExpression(SExpression *b)
توکن های مورد نیاز پارسر بایسون توسط flex تولید خواهند شد : %option outfile="Lexer.c" header-file="Lexer.h" %option warn nodefault
%option reentrant noyywrap never-interactive nounistd %option bison-bridge
int yyerror(const char *msg) { نام توکن ها معمولا خنثی است : "TOKEN_PLUS" و "TOKEN_STAR" و نه TOKEN_ADD و یا "TOKEN_MULTIPLY" . برای مثال اگر می خواستیم از سینتکس "+" پشتیبانی کنیم (مثلا "1+") درست نیست که نام توکن را "TOKEN_ADD" قرار دهیم. در زبانی مثل C عبارت "int *ptr" نشان دهنده ی یک اشاره گر است و نه یک محصول و بنابرین اشتباه است که نام "*" را "TOKEN_MULTIPLY" بگذاریم.
از آنجایی که توکن ها توسط فلکس در اختیار قرار می گیرند باید راهی برای ایجاد ارتباط بین Parser و Lexer ایجاد کنیم. نوع داده ی استفاده شده برای ارتباط، YYSTYPE است.
از آنجا که در این مثال از مدل بازورود فلکس و yacc استفاده می شود باید پارامتر هایی برای تابع yylex در زمانی که از yyparse فراخوانی می شود تعریف کنیم. این کار با تعریف های lex-param% , parse-param% انجام می شود.int yyerror(SExpression **expression, yyscan_t scanner, const char *msg) {
%code requires {
%output "Parser.c" %defines "Parser.h"
%define api.pure
%union {
%token TOKEN_LPAREN "(" %token TOKEN_RPAREN ")" %token TOKEN_PLUS "+" %token TOKEN_STAR "*" %token  TOKEN_NUMBER "number"
%type  expr
/* Precedence (increasing) and associativity: %left "+" %left "*"
input
expr
کد مورد نیاز برای بدست آوردن درخت سینتکس که از پارسر تولید شده توسط بایسون و اسکنر تولید شده توسط فلکس بدست می آید بصورت زیر است : int yyparse(SExpression **expression, yyscan_t scanner);
SExpression *getAST(const char *expr)
int evaluate(SExpression *e)
int main(void) یک makefile ساده برای تولید پروژه ی بالا بصورت زیر است :
FILES = Lexer.c Parser.c Expression.c main.c CC = g++ CFLAGS = -g -ansi
test: $(FILES)
Lexer.c: Lexer.l
Parser.c: Parser.y Lexer.c
clean: بازورود ----بازورود یک ویژگی جدید است که در بایسون وجود دارد ولی در Yacc وجود ندارد.
به‌طور معمول، بایسون پارسری تولید می کند که بازورود نیست. برای حصول این ویژگی باید از تعریف define api.pure% استفاده کرد. ویژگی های بیشتر درمورد بازورود بایسون را می توان در راهنمای بایسون یافت.
استفاده از بایسون با زبان های دیگر ----بایسون فقط می تواند در زبان های C , ++C , جاوا کد تولید نماید. برای استفاده از بایسون در زبان های دیگر باید از ابزار های Language binding مانند SWIG استفاده شود.
مجوز و توزیع کد تولیدی ----به علت آنکه بایسون کدی تولید می کند که به کد منبع پروژه های دیگر اضافه می شود مسائلی از جهت کپی رایت ایجاد می کند.
یک مجوز GPL-compatible لازم نیست
کد تولید شده توسط بایسون شامل مقادیر زیادی از کد حاصل از خود پروژه ی بایسون است. بسته ی بایسون تحت مجوز (GNU General Public License (GPL قرار دارد ولی یک استثنا در آن قرار داده شده است تا GPL به خروجی اعمال نشود.
توزیع بسته ها با بایسون
پروژه های نرم افزاری رایگان که از بایسون استفاده می کنند می توانند انتخاب کنند که کد پروژه شان به بایسون ارجاع کند و یا توسط بایسون خروجی بدهد. هر دو روش برای کامپایل کد پروژه کافیست. البته توزیع صرفا ورودی دارای این مساله است که دریافت کنندگان باید یک نمونه ی سازگار بایسون داشته باشند تا بتوانند کد C لازم را هنگام کامپایل پروژه تولید کنند. و توزیع صرفا خروجی این مشکل را دارد که ویرایش پارسر مشکل می شود زیرا کد آن نه توسط انسان نوشته شده است و نه برای انسان ها- هدف آن صرفا دخول به کامپایلر C است.
این مسائل را می توان با توزیع هر دو فایل ورودی و خروجی در کد تولیدی حل کرد. اکثر افراد با کد تولیدی کامپایل خواهند کرد ولی هر کس بخواهد بخش پارسر را ویرایش کند می تواند ابتدا ورودی ها را ویرایش کرده و قبل از کامپایل آنها را بازتولید کند.
پروژه های دارای هردو توزیع معمولا در سیستم های Revision Control کد های تولیدی را ندارند. و فایل ها فقط موقع تولید خروجی تولید می شوند.
برخی مجوز ها از جمله GPL نیازمند این هستند که کد مرجع در حالت ترجیح داده شده ی کاری برای ویرایش قرار داشته باشند. بنابرین پروژه های GPL استفاده کننده از بایسون باید فایل های ورودی بایسون را توزیع کنند.
استفاده ----به علت آنکه بایسون به عنوان یک جایگزین برای yacc نوشته شده است و تا حد زیادی سازگار است، کد های پروژه های زیادی را می توان به yacc داد. این کار تشخیص اینکه پروژه از کد صرفا-بایسون استفاده می کند یا نه را دشوار می کند. در موارد زیادی، "استفاده" از بایسون می تواند با yacc و یا مشتقات آن جایگزین شود.
بایسون دارای ویژگی هایی است که در yacc یافت نمی شود. بنابرین برخی پروژه ها حقیقتا از بایسون استفاده می کنند. زیرا yacc کافی نخواهد بود.
لیست زیر از پروژه هایی است که از بایسون استفاده می کنند. یعنی نرم افزار های توسعه ای هستند که به قصد ورود به بایسون و یا یک بسته ی سازگار با بایسون ساخته شده اند :