本文主要讲解“linux bison的功能是什么”。这篇文章的内容简单明了,易于学习和理解。请按照主机频道的思路,越走越深。让我们一起研究学习“linux bison的功能是什么”!
在linux中,bison是一个生成解析器程序的工具,可以将用户提供的语法规则转换成一个解析器。Bison需要与flex(词法分析器)结合使用来处理复杂的文件解析。从产生一个给定的语法开始,bison最后会通过一个算法构造一个动作表,然后用这个动作表来分析句子。
Unix Lex/YACC在1975年由Mike Lesk和当时的at & amp;amp;Eric Schmidt(T的实习生)一起开发成Linux FLex/bison Lex(Schmidt做得更多)。它是一个词法分析器生成程序,可以单独使用,也可以与Johnson的yacc配合使用。Lex很有名,但是效率低,有bug。大约在1987年,劳伦斯伯克利实验室的Vern Paxson根据伯克利许可证用C重写了Lex,并将其命名为Flex(快速词法分析器生成器)。Flex现在是SourceForge的一个项目,仍然基于Berkeley许可证。
Bison可以将用户提供的语法规则转换成一个解析器。简单来说,bison会从产生一个给定的语法开始,最终通过算法构造一个动作表,然后用这个动作表来分析句子。具体来说,bison读取用户提供的语法产生,生成一个C语言格式的LALR(1)动作表,并将其包含到一个名为yyparse的C函数中。功能是用这个动作表解析令牌流,令牌流是用flex生成的词法分析器扫描源程序得到的。
Flex文件定义了模式(哪些是大豆,哪些是绿豆...),并通过flex处理(词法分析)将输出分割成一段段的令牌(输入的豆子被一个个挑出来),从而执行不同的动作(大豆磨豆浆(动作)绿豆做绿豆饼(动作))...Flex生成的令牌可以提供给Bison处理(越来越容易调试)。但是使用bison可以更方便的处理复杂的逻辑,编写和调试都很容易。
编码实践:字符统计学家
//在这个例子中,只用了flex和几个手写代码(在main中)就完成了字符串统计功能。
yolandas-MacBook-Pro:flex-bison刘媛媛$ cat fb1.l
/*统计输入字符串*/
%{
int chars = 0;
int words = 0;
int lines = 0;
%}
%%
用户助手程序段是C代码,会原样复制到C文件中,有些功能一般在这里定制。
3 flex-bison代码协作模式
Flex/bison编码练习:编写一个简单的计算器MAC OS下的flex/bison安装
brew安装flex
brew安装bison
在# macos下安装flex/bison简单方便,编译C语言程序也需要gcc。
brew安装gcc
2 flex词汇文件:calc.l
%option noyywrap
%{
/*
* Lex一个简单计算器的词法文件
*/
void YY error(char *);
#包含& quotcalc . tab . h & quot;
%}
%%
/* a-z是变量*/
[a-z]{
YY lval = * YY text-& # 39;一& # 39;;
返回变量;
}
/*整数*/
[0-9]+ {
yylval = atoi(YY text);
返回整数;
}
/*运算符*/
[-+()=/* \ n]{ return * YY text;}
/*空白被忽略*/
[\ t];
/*所有其他字符都是非法的*/
。YY error(& quot;无效的输入);
%%
3 bison语法文件:calc.y
%token整数变量
% left & # 39+''-'
% left & # 39*''/'
%{
# include & ltstdio.h & gt
void YY error(char *);
int YY lex(void);
int sym[26];
%}
%%
程序:
程序声明& # 39;\ n & # 39
|
;
声明:
expr { printf(& quot;% d \ n & quot, $1);}
|可变& # 39;='expr { sym[$ 1]= $ 3;}
;
expr:
整数
| VARIABLE { $ $ = sym[$ 1];}
| expr & # 39+'expr { $ $ = $ zhujipindao$ 3;}
| expr & # 39-'expr { $ $ = $ $ 3;}
| expr & # 39*'expr { $ $ = $ 1 * $ 3;}
| expr & # 39/'expr { $ $ = $ 1/$ 3;}
|'('expr & # 39)'{$$ = $2;}
;
%%
void yyerror(字符)
{
fprintf(标准错误,& quot% s \ n & quot,s);
}
int main(void)
{
printf(& quot;一个简单的计算器。\ n & quot);
YY parse();
返回0;
}
4 Makefile文件:
全部:清除计算
计算:计算长度计算长度
bison -d计算
弹性计算
cc -o $@ calc.tab.c lex.yy.c -lm
清洁:
rm -f计算\
lex.yy.c计算表c计算表h
5执行
(可以直接执行make,即执行Makefile中定义的内容,也可以单步执行。)
约兰达斯-MBP:刘媛媛卡尔辛普尔$ ls -l
共计32人
-rw-r - r - @ 1刘媛媛staff 157 8 13 09:53 Makefile
-rw-r - r - @ 1刘媛媛staff 507 8 13 10:01 calc.l
-rw-r - r - @ 1刘媛媛工作人员731 8 13 23:04计算年
约兰达斯-MBP:卡尔辛普尔刘媛媛$ make
rm -f计算\
lex.yy.c计算表c计算表h
bison -d计算
弹性计算
cc -o calc calc.tab.c lex.yy.c -lm
约兰达斯-MBP:刘媛媛卡尔辛普尔$ ls -l
共计272人
-rw-r - r - @ 1刘媛媛staff 157 8 13 09:53 Makefile
-rwxr-xr-x 1刘媛媛staff 24600 8 14 12:00 calc
-rw-r - r - @ 1刘媛媛staff 507 8 13 10:01 calc.l
-rw-r - r - 1刘媛媛staff 42011 8 14 12:00 calc.tab.c
-rw-r - r - 1刘媛媛职员2143 8 14 12:00 calc.tab.h
-rw-r - r - @ 1刘媛媛工作人员731 8 13 23:04计算年
-rw-r - r - 1刘媛媛职员44590 8 14 12:00 lex.yy.c
约兰达斯-MBP:卡尔辛普尔刘媛媛。/calc
一个简单的计算器。
zhujipindao2
三
评论前必须登录!
注册