linux bison是GNU项目提供的一个语法分析器生成器,常被称为parser generator。它读取包含语法规则的声明式文件,然后输出能够识别该语法的C语言源码。在Linux环境下,bison通常与flex词法分析器配合使用,用来构建编译器、脚本解释器或自定义配置文件解析程序。

一、bison到底是什么
bison的前身是Unix系统中的yacc,意为yet another compiler compiler。通俗来讲,如果你定义了一套自己的语言或数据格式,手写解析代码会很麻烦,而bison能根据你写的语法规则自动产生解析函数。你只需要关心规则本身,不用处理状态机和移进归约的细节。
核心概念
- 语法规则文件:一般以.y为后缀,里面用BNF风格写法描述语法
- 终结符:从词法分析器传进来的基本符号,比如标识符、数字
- 非终结符:由终结符组合而成的更高层结构,比如表达式、语句
- 动作代码:匹配规则时执行的C语句,用来构造抽象语法树或计算结果
二、在linux上安装bison
大多数Linux发行版都自带或能很方便安装bison。以常见发行版为例:
# Debian或Ubuntu sudo apt update sudo apt install bison # CentOS或Rocky sudo yum install bison # 验证版本 bison --version
三、一个简单计算器的bison示例
下面演示如何用bison解析四则运算。先写语法文件calc.y:
%{
#include <stdio.h>
int yylex(void);
void yyerror(const char *s);
%}
%token NUM
%left '+''-'
%left '*''/'
%%
input:
/* 空 */
| input line
;
line:
'n'
| expr 'n' { printf("结果=%dn", $1); }
;
expr:
NUM { $$ = $1; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
;
%%
void yyerror(const char *s) {
fprintf(stderr, "错误: %sn", s);
}
上面代码中,%token定义终结符NUM,%left声明运算符左结合与优先级。规则段用expr表示表达式,动作代码用$1、$3引用子节点值,$$表示当前规则返回值。
配合flex使用
bison只做语法分析,词法部分可用flex完成。简单词法文件calc.l如下:
%{
#include "y.tab.h"
%}
%%
[0-9]+ { yylval = atoi(yytext); return NUM; }
[ t] /* 忽略空白 */
n return 'n';
. return yytext[0];
%%
int yywrap(void) { return 1; }
使用下面命令生成可执行程序:
bison -d calc.y flex calc.l gcc y.tab.c lex.yy.c -o calc -ly -lfl ./calc
四、bison常见使用场景
| 场景 | 说明 |
|---|---|
| 编程语言开发 | 自研脚本语言或DSL的解析前端 |
| 配置解析 | 解析复杂文本配置,替代正则硬匹配 |
| 协议处理 | 处理自定义通信报文结构 |
五、新手学习建议
初学者可以先跑通上面计算器例子,再逐步加括号、变量、函数调用等规则。阅读bison手册中%prec和%union用法,能处理更复杂的语义类型。理解linux bison是什么,关键在于明白它把语法描述转成了可维护的C解析代码,省去手工写状态机的痛苦。
linuxbisonGNU_bison语法分析器parser_generator修改时间:2026-07-24 18:51:22