深入理解Linux:Bison详解(linuxbison)
Bison 是一种被广泛使用的 Unix 下的解析器生成器,主要用于自动生成识别输入字符串的编译器,解释器的定义文件,这些文件通过Bison 的语法规则编写。Bison 相继被Arc,GNU,PERL,Python,Lua等编程语言所使用,还支持C,C+ +,Java,Fortran等编程语言的源代码的生成。
Bison 的基本功能可以利用 BNF(Backus-Naur Form) 通用语言规则来描述,甚至能够使用语法规则来表达定义程序相关数据结构和生成对应结构的程序代码,Bison 可以自动生成原代码文件,然后由 C/C++ 编译器编译, 然后链接生成解析器动态库,最后使用生成的链接库初始化程序并运行;Bison 通常结合 C/C++ 语言与 Lex 做编译器开发,实现根据文法定义的编写完整的词法分析器和语法分析器的整合工具,起到整合与扩展的作用。
使用 Bison 的方法和 Lex 类似,首先要写一个Bison规则文件,其格式如下:
%{
#include
%}%token ID NUM //定义的token的类型
%%//表达式规则
expr: ID '=' NUM|ID '+' NUM{
printf("%s %s %d\n", $1, $2, $3);}
%%
main(){yyparse(); //即调用解析函数
}
该文件包括定义token和表达式规则,然后用 Bison 将其转换成编译器/解释器,即使用Bison将这种文件转换成编译器或解释器,最后由 C/C++ 编译器来生成可执行的动态库(.so文件)。
Bison 使用比较简单,但也有一些要注意的细节,Bison 的输入文件必须是 C/C++ 编译程序支持的源文件,并且必须要明确指定C/C++ 编译器。指令,可以比如: gcc *.c -o filename.out 就可以调用C/C++编译器完成编译。此外,要注意Bison 生成的代码不能立刻执行,必须要用 C/C++ 编译器编译才可以使用。
完整的 Bison 操作流程如下:
(1)定义一个 Bison 语法文件;
(2)用 Bison 将定��的语法文件转换成 C/C++ 代码;
(3)用 C/C++ 编译器编译和链接该文件生成可执行的动态库;
(4)调用动态库来完成识别操作;
通过深入理解Linux之Bison,可以让我们进一步深入学习 Unix,学会正确运用 Bison,不仅可以利于编译器/解释器开发,还可以运用在普通的编程工作中,用于对 C/C++ 代码的扩展和整理。