分享更有价值
被信任是一种快乐

linux bison的作用是什么

文章页正文上

这篇文章主要讲解了“linux bison的作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux bison的作用是什么”吧! 在linux中,bison是用来生成语法分析器程序的工具,它可以将用户提供的语法规则转化成一个语法分析器;bison需要和flex(词法分析器)配合使用来处理复杂的文件解析工作。通过给定语法的产生式开始,bison会通过算法,最终构造得到动作表,然后利用这个动作表去解析句子。Lex是1975年由Mike Lesk和当时尚在AT&T实习的Eric Schmidt共同完成的(Schmidt做的更多),是一个词法分析器的生成程序,可以单独使用也可以与Johnson的yacc协同工作。lex很有名气,但是无奈效率太低加上有bug。大概在1987年,Lawrence Berkeley实验室的Vern Paxson用C重新写了Lex,并命名为FLex(the Fast Lexical Analyzer Generator),基于伯克利许可证。flex现在是SourceForge的一个项目,依然基于伯克利许可,
[Flex](https://github.com/westes/flex “Flex”) 是起初unix版lex的free (but non-GNU) implementation,用于c/c ++ 的词法扫描生成器。(注意:Schmidt曾是google的CEO)bison的前身是yacc。yacc是由贝尔实验室的S.C.Johnson基于Knuth大神的LR语法分析理论,于1975~1978年写成。大约1985年,UC Berkeley 的研究生Bob Corbett使用改进的内部算法实现了伯克利yacc,来自FSF的Richard Stallman改写了伯克利yacc并将其用于GNU项目,添加了很多特性,形成了今天的GNU Bison。bison现在作为FSF的项目被维护,基于GNU公共许可证发布,[Bison](http://www.gnu.org/software/bison/manual/)是兼容yacc的free的语法生成器。早期Unix的Lex/YACC,发展为FLex/Bison,新版本的程序是向上兼容的(即兼容老版本),现chang用Flex和Bison。使用的角度,Flex和Bison是Linux下用来生成词法分析器和语法分析器两个程序的工具,可以处理结构化输入,一般结合使用来处理复杂的文件解析工作。bison可以将用户提供的语法规则转化成一个语法分析器。简单来说,通过给定语法的产生式开始,bison会通过算法,最终构造得到动作表,然后利用这个动作表去解析句子。具体来说,bison 读取用户提供的语法的产生式,生成一个 C 语言格式的 LALR(1) 动作表,并将其包含进一个名为yyparse的 C 函数,这个函数的作用就是利用这个动作表来解析 token 流 ,而这个 token 流 是由 flex 生成的词法分析器扫描源程序得到的。flex文件是定义pattern(哪是黄豆,哪是绿豆…),通过flex处理(词法分析)将输出切分成一段一段的token(将输入的豆子一个个摘出来),从而执行不同的action(黄豆就磨豆浆(action),绿豆去做绿豆糕(action))…
flex 生成的tokens可以喂给Bison处理(更简便易调试),当然也可以不喂给bison而直接自己处理就得了(如喜下例)。但是使用bison可以更方便的处理复杂的逻辑,编写简单,调试方便。编码实战:字符统计器

//本例中仅仅使用flex以及少量手写代码(main中),来完成字符串统计功能。
Yolandas-MacBook-Pro:flex-bisonliuyuanyuan$catfb1-1.l
/*统计输入字符串*/
%{
intchars=0;
intwords=0;
intlines=0;

%}

%%
[a-zA-Z]+{
		words++;
		chars+=strlen(yytext);
}

n{chars++;lines++;}

.{chars++;}

%%


intmain(intargs,char**argv)
{
	yylex();
	printf("lines=%6dwords=%6dchars=%6dn",lines,words,chars);
	return0;
}

//Linux系统上用-lfl选项编译,Mac的编译选项是-ll
Yolandas-MacBook-Pro:flex-bisonliuyuanyuan$gcc-lllex.yy.c-ofb1-1
Yolandas-MacBook-Pro:flex-bisonliuyuanyuan$./fb1-1
hello
thisisyolanda
bye.
lines=3words=5chars=28

/*P1:declarations(定义段)*/
%{

%}

%%
/*P2:translationrules(规则段)*/
%%

/*P3:auxiliaryfunctions(用户辅助程序段,c函数)*/

定义段 包括文字块、定义、内部声明等。
C语言的头文件、函数和变量的声明等一般就放在%{…%}之间,这一部分的内容会被直接复制到生成.c文件的开头部分。包含%option选项

%optionnoyywrap/*定义段中包含了option选项*/

%{
#include"cal.tab.h"
externintyylval;
%}

规则段 %%…%%之间部分,为一系列匹配模式(正则表达式)和动作(C代码)。当flex扫描程序运行时,它把输入与规则段的模式进行匹配,每次发现一个匹配(被匹配的输入称为标记(token))时就执行与那种模式相关的C代码。

pattern(正则表达式){action(c代码)}

example:
[0-9]+{yylval=atoi(yytest);returnNUMBER;}

用户辅助程序段 为C代码,会被原样复制到c文件中,一般这里定义一些辅助函数等。

intterror(chr*s)
{
printf("%sn",s);
return0;
}

/*P1:declarations定义段*/
%{

%}

%%
/*P2:grammarrules规则段(rule-action)*/

A:a1{语义动作1}
	|a2{语义动作2}
	|…
	|an{语义动作n}
	|b//没有{…},则使用缺省的语义动作
	;//产生式结束标记
//语义动作一般是在产生式右部分析完,归约动作进行前执行。
A→a1|a2|…|an|b
%%

/*P3:supportingCroutines用户辅助程序段(C函数)*/

定义段 可以分为两部分:1. %{ 和%}之间的部分,C语言编写的,包括头文件include、宏定义、全局变量定义、函数声明等;2. 对文法的终结符和非终结符做一些相关声明。常用的Bison标记声明有:%token %union %start %type %left %right %nonassoc等。规则段 由rule(语法规则)和action(包括C代码)组成。bison规则基本是BNF,做了一点简化以易于输入。规则中目标或非终端符放在左边,后跟一个冒号:然后是产生式的右边,之后是对应的动作(用{}包含)。

%%
program:programexpr'n'{printf("%dn",$2);}
;

expr:INTEGER{$$=$1;}
|expr'+'expr{$$=$1+$3;}
|expr'-'expr{$$=$1-$3}
;
%%

注意:$1表示右边的第一个标记的值,$2表示右边的第二个标记的值,依次类推。$$表示归约后的值。用户辅助程序段 为C代码,会被原样复制到c文件中,这里一般自定义一些函数。1 macOS下flex/bison安装

brewinstallflex
brewinstallbison
#macos下flex/bison安装简单方便,另需安装gcc用于编译c语言程序。
brewinstallgcc

2 flex词法文件:calc.l

%optionnoyywrap

%{
/*
*一个简单计算器的Lex词法文件
*/
	voidyyerror(char*);
	#include"calc.tab.h"
%}

%%

/*a-z为变量*/
[a-z]	{
yylval=*yytext-'a';
returnVARIABLE;
	}

/*整数*/
[0-9]+	{
yylval=atoi(yytext);
returnINTEGER;
	}

/*运算符*/
[-+()=/*n]	{return*yytext;}

/*空白被忽略*/
[t];

/*其他字符都是非法的*/
.yyerror("invalidinput");

%%

3 bison语法文件:calc.y

%tokenINTEGERVARIABLE
%left'+''-'
%left'*''/'

%{
	#include
voidyyerror(char*);
intyylex(void);
	
intsym[26];
%}

%%
program:
programstatement'n'
|
;
statement:
expr{printf("%dn免费云主机、域名",$1);}
|VARIABLE'='expr{sym[$1]=$3;}
;
expr:
INTEGER
|VARIABLE{$$=sym[$1];}
|expr'+'expr{$$=$1+$3;}
|expr'-'expr{$$=$1-$3;}
|expr'*'expr{$$=$1*$3;}
|expr'/'expr{$$=$1/$3;}
|'('expr')'{$$=$2;}
;
%%

voidyyerror(char*s)
{
fprintf(stderr,"%sn",s);
}

intmain(void)
{
printf("Asimplecalculator.n");
yyparse();
return0;
}

4 Makefile 文件:

all:cleancalc


calc:calc.lcalc.y
	bison-dcalc.y
	flexcalc.l
	cc-o$@calc.tab.clex.yy.c-lm

clean:
	rm-fcalc
	lex.yy.ccalc.tab.ccalc.tab.h

5 执行(可以直接执行make也就是执行Makefile中定义的内容,也可以单步执行)

Yolandas-MBP:calcSimpleliuyuanyuan$ls-l
total32
-rw-r--r--@1liuyuanyuanstaff15781309:53Makefile
-rw-r--r--@1liuyuanyuanstaff50781310:01calc.l
-rw-r--r--@1liuyuanyuanstaff73181323:04calc.y

Yolandas-MBP:calcSimpleliuyuanyuan$make
rm-fcalc
	lex.yy.ccalc.tab.ccalc.tab.h
bison-dcalc.y
flexcalc.l
cc-ocalccalc.tab.clex.yy.c-lm

Yolandas-MBP:calcSimpleliuyuanyuan$ls-l
total272
-rw-r--r--@1liuyuanyuanstaff15781309:53Makefile
-rwxr-xr-x1liuyuanyuanstaff2460081412:00calc
-rw-r--r--@1liuyuanyuanstaff50781310:01calc.l
-rw-r--r--1liuyuanyuanstaff4201181412:00calc.tab.c
-rw-r--r--1liuyuanyuanstaff214381412:00calc.tab.h
-rw-r--r--@1liuyuanyuanstaff73181323:04calc.y
-rw-r--r--1liuyuanyuanstaff4459081412:00lex.yy.c

Yolandas-MBP:calcSimpleliuyuanyuan$./calc
Asimplecalculator.
1+2
3

感谢各位的阅读,以上就是“linux bison的作用是什么”的内容了,经过本文的学习后,相信大家对linux bison的作用是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: ubuntu远程桌面连接怎么实现

这篇文章主免费云主机、域名要介绍“ubuntu远程桌面连接怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ubuntu远程桌面连接怎么实现”文章能帮助大家解决问题。1.打开终端,输入命令安装xrdp,命令如:su…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册