http://ftp.gnu.org/gnu/bison/
安装bison需要先安装 msys下的flex
http://sourceforge.net/projects/mingw/files/MSYS/Extension/flex/
(flex-2.5.35-2-msys-1.0.13-bin.tar.lzma)
./configure --prefix=/mingw
make
make install
实际msys有现成版本
http://sourceforge.net/projects/mingw/files/MSYS/Extension/bison/bison-2.4.2-1/
(bison-2.4.2-1-msys-1.0.13-bin.tar.lzma)
-
Bison
2019-10-25 10:30:43Bison -
bison
2019-09-12 22:26:39http://ftp.gnu.org/gnu/bison/安装bison需要先安装 msys下的flexhttp://sourceforge.net/projects/mingw/files/MSYS/Extension/flex/(flex-2.5.35-2-msys-1.0.13-bin....转载于:https://my.oschina.net/rechy/blog/189705
-
BISON
2019-12-26 13:02:44文章目录工作原理.y文件结构原理编译运行语义 (语义值... bison原理例子(后缀表达式的计算): 工作原理 .y文件结构 YYSTYPE 语义值类型 %token NUM 定义终结符NUM yyerror 必须用户自己提供 int yyle...文章目录
工作原理
.y文件结构
- YYSTYPE 语义值类型
- %token NUM 定义终结符NUM
- yyerror 必须用户自己提供
- int yylex() 这个例子中使用自己编写的yylex,实际会使用flex编译的文件所提供的yylex
- 产生式右边为空表示
- 产生式后面的c语言代码称为语义动作
- $$ 表示产生式左部的语义值
- $1,$2,…分别表示右边第一,第二个符号的语义值
- yylval 是全局变量,表示当前所识别的词形的语义值。
%{ c 语言说明部分,定义语义动作中需要的全局变量,语义值类型,以及头文件等 // 逆波兰表达式的计算 #define YYSTYPE int #include <ctype.h> #include<stdio.h> void yyerror(char*); int yylex(); %} 声明部分 定义终结符, 规定非终结符语义值类型,规定运算优先级,规定文法形态等 %token NUM %% 语法规则部分,定义产生式和语义动作 input: /*empty equal to epsilon*/ | input line ; line: '\n' |exp '\n' {printf("\%.d\n",$1);} ; exp: NUM {$$ = $1;} | exp exp '+' {$$ = $1+$2;} | exp exp '-' {$$ = $1-$2;} | exp exp '*' {$$ = $1*$2;} | exp exp '/' {$$ = $1 / $2;} | exp 'n' {$$ = -$1; } ; %% // 附加c语言代码: bison直接拷贝到.tab.c文件的尾部,用户再次可定义接口函数,也可由其它文件提供再链接。 int yylex(){ int c; /*skip white space*/ while((c=getchar())==' '||c=='\t') ; /*process numbers*/ if(isdigit(c)){ ungetc(c, stdin); scanf("%d",&yylval); return NUM; } if(c==EOF) return 0; return c; } int main(void){ return yyparse(); } void yyerror(char*s){ printf("%s\n",s); }
原理
- 对输入.y文件中的形式文法构架LALR分析表,并生成基于该分析表的语法分析器C语言源程序.tab.c。
- bison 通过 int yylex() 的返回值获得单词的编码;通过全局变量
YYSTYPE yylval
获得当前单词的语义值. - 分析方法采用自顶向上的移进/规约法,完成规约时,yyparse()将执行bison源文件对应产生式的语义动作。
- 必要的语法环境:yylex(),main(), yyerror(), 其中yylex可由用户提供,也可由flex源程序提供,然后和bison源程序一起连接成可执行文件
编译运行
- bision rpcalc.y
- gcc -o rpcalc rpcalc.tab.c
- rpcalc (启动程序)
语义 (语义值类型,语义动作)
语义值类型:
- 由于在移进、规约的时候是拷贝进栈,所以当语义值的类型是指针时,所指的地址一定不能是局部变量。安全的做法是:生命周期开始时通过动态申请内存所指的值保存,生命周期结束时释放该内存(动态内存分配)
- 通过
%union
在声明部分讲YYSTYPE定义为C语言的union结构。- 对于非终结符,通过
%type \<union 分量名> 非终结符名
来规定语义动作中以何种方式访问语义值对应的类型。 - 对于非终结符,使用
%token \<union 分量名> 终结符名
,或者%type规定。 - 在语义动作中,使用
$<comp_name>m
访问
- 对于非终结符,通过
%union { double val; /* 表达式的语义值 */ SYMREC *tptr; /* 变量和函数的语义值是符号表元素指针 */ } %token<val> NUM /* 语义值的类型是双精度浮点数 */ %token<tptr> VAR FNCT /* 语义值的类型是符号表元素指针 */ %type<val> exp
语义值声明周期:
- 在语义栈中存在的时间
- 比如 NUM的生命周期从yylex()通过
scanf("%d",&yylval)
创建,然后压入语义栈中,随后规约exp:NUM {$$=$1}
, NUM的语义值从栈中退出,exp的语义值压入。
语义动作的翻译:
源文件中的
exp: exp exp '\' {$$ = $1 \ $2;}
会被翻译为:
yyvsp 是一个栈栈顶是yyvasp[0], 越往栈底走,索引依此减1,这个例子的存储数据为:
(栈顶)’\’ $2 $1,语义动作:
- 尾部语义动作
产生式尾部的语义动作在发现该产生式句柄时已经在栈顶形成,需要对该产生式进行规约时进行。语义动作包括计算综合属性(S属性)和产生副作用
每个产生式有一个默认动作 {$$=$1;}
- 产生式中间语义动作
用来解决**继承属性(L属性)**的计算
在这里插入图片描述
声明部分(终结符,编码,结合律,优先级)
bison将终结符分为两类:字符(Symbol)和单词(Token). Token需要声明,字符在产生式(语法规则)中直接用字符常量,注意加引号’ '。如
exp: exp exp +
是错的- token对终结符的编码规则
- 0或负数: 文件结束标记
- 字符单词:对应的ASCII码
- error: 256
- 非字符单词从258开始顺序编码, 在.tab.c中可以找到具体定义
在使用单独的词法分析模块的时候,需要bison需要使用 -d 选项,这样讲token的宏定义等输出到.tab.h 文件中,这样词法分析模块可以include此头文件来使用宏定义的token。
- 规定结合律
%left ‘+’ ‘-’
优先级和结合律
%left '+' '-' %left '*' '/' %left UMINUS %% exp : exp '+' exp | exp '-' exp | exp '*' exp | exp '/' exp | '-' exp %prec UMINUS ;
- 结合性:%left 左结合; %right 右结合;%nonassoc 不能结合;
- 出现在同一个%left后的单词优先级相同
- 优先级:出现在不同 “%left” 的终结符,其运算优先级别按照 “%left” 在源文件中出现 的先后次序由低到高排列, 即:UMINUS的优先级最高,乘法和除法次之,加法和 减法最低.
- 由于一元减和二元减的运算符相同,在语法中出现一元减的产生式通过%prec UNIMUS设定一元减和UMINUS具有相同的优先级.
bison 无法处理的语法
bison语法分析器可以使用两种分析方法,一种是LALR(1), 另一种是GLR(通用的自左向右)。GLR更强大但更麻烦。
LALR(1)不能处理的语法有:- 有歧义的语法
- 需要向前查看超过1个记号才能确定是否匹配的语法。
语法与内置函数
变量 说明 yylval 当前终结符语义值的全局变量 YYSTYPE 语义值数据类型 编译选项
选项 说明 -d 输出文件 .tab.h -v 输出分析表文件 name.output -t 在输出文件(.tab.c)中设置宏YYDEBUG 为1, 从而打开分析器的调试代码,使得最后生成的分析器文件能够对分析过程进行追踪。 冲突与出错处理
冲突
- 输出冲突的报警信息:打开-t选项,在LALR(1)分析表文件
.output
文件中指出冲突所在 - 如果是S/R冲突,优先S
- 如果是RR冲突,排列在前者优先。
出错处理
- 如果在 bison 输入文件中没有任何提供任何出错处理,输出分析器在工作时,如果发现语法错误 (即在当前状态下面对当前的终结符不能进行任何移进或归约 操作), yyparse()在传参 “syntax error” 调用用户提供的
void yyerror(char const *)
函数后,返回1退出yyparse(). - 通常yyerror可定义如下:
void yyerror(char const *s) { fprintf(stderr, "%s\n", s); }
- bison 通过预留的终结符 error 提供从出错状态恢复分析的机制, 如:
在产生式右边有保留终结符 error 的规则称为错误恢复规则,输出分析器在一 个含有错误恢复规则的状态出错时,首先从分析栈中弹出语法符号直到能 将 error 移进,在栈顶形成错误恢复规则中 error 前的句型为止,如上例中在 分析exp 时出错,将弹出所有的已分析的表达式成分,将 error 压栈到项目, 此时栈中符号为:{stnmts error . ‘\n’}; 然后,跳过所有的输入直到遇到错误恢 复规则规中error的后随符号为止. 如上例中将跳过所有的输入直到’\n’ 才恢 复分析. - 在错误恢复规则中可以像其他规则一样有语义动作,但是不能引用终结 符error的语义值.
- 在某一错误恢复规则起作用时,为了防止分析器频繁报错,输出分析器规定只 有在连续移进三个单词后才恢复报错,在错误恢复规则语义动作中,可以使用 bison 提供的 C 语言宏 “yyerrok;” 解消上述限定,即刻恢复报错机制.
- 在激活错误恢复规则后,当前向前查看的单词将会继续作为向前查看符号进行 分析,如果用户希望跳过该单词,可在语义动作中用 bison 提供的宏
“yyclearin;”
跳过当前单词. 但是由于该操作是在归约出错产生式时才起作用, 因此如果错误恢复规则中error 之后还有终结符,只有移进该终结符才能有语 义动作,因此 “yyclearin;” 将无任何效果. “yyclearin;” 有效当且仅当它是 在紧随error之后的动作中
跟踪分析过程
调用yyparse()前,置yydebug非零,如下的main.c
main() { extern int yydebug; yydebug = 1; yyparse(); }
flex & bison
原理
flex 输出的单词扫描程序正是int yylex(), 为了让 bison 输出的语法分析源程序能与 flex 输出的词法分析源程序协同工作,必须保证单词编码的一致,以及 语义值数据类型的一致, 这要求在 flex 源程序中:
- 1 定义部分包含 bison 输出的头文件.tab.h
- 2 根据语法规则中的单词设计匹配单词的正规表达式,及需要过滤的白字符 (white space) 和注释, 如: ‘\n’ 如果是语义规则所需的单词,就不能冒然 过滤掉
- 3 在识别单词的 C 语言动作中,如果该单词有语义值,应先计算其语义值并 赋值到全局变量yylval,如果是字符单词,return yytext[0];,否 则return 单词名;
- 4 为了保证词法分析能处理所有的字符,对语法分析不支持的字符的的动作报错并过滤
- 5 bison 使用的单词名不能与 flex 中自带的宏名有冲突. 如: BEGIN不能作为 单词名, 否则return BEGIN;将调用 flex 预置的宏BEGIN, 而不能返回期望的单 词编码, 可修改单词名为SBEGIN来避免冲突.
例子(后缀表达式的计算):
rpcacle.y:
%{ // 逆波兰表达式的计算 // #define YYSTYPE int 默认int #include<stdio.h> void yyerror(char*); int yylex(); %} %token NUM %token ADD SUB MUL DIV %token EOL %% input: /*empty equal to epsilon*/ | input line ; line: EOL | exp EOL {printf("\%d\n",$1);} ; exp: NUM {$$ = $1;} | exp exp ADD {$$ = $1+$2;} | exp exp SUB {$$ = $1-$2;} | exp exp MUL {$$ = $1*$2;} | exp exp DIV {$$ = $1 / $2;} ; %% int main(void){ int n=yyparse(); printf("%d",n); return n; } void yyerror(char*s){ printf("%s\n",s); }
rpcalc.l
%{ #include "rpcalc_fb.tab.h" %} %% "+" { return ADD; } "-" { return SUB; } "*" { return MUL; } "/" { return DIV; } [0-9]+ { yylval = atoi(yytext); return NUM; } \n { return EOL; } "//".* [ \t] { /* ignore white space */ } . { printf("Mystery character %c\n", *yytext); } %%
-
bison分析计算器
2020-12-28 12:48:03bison分析计算器 -
bison for windows
2020-05-10 20:41:43bison for windows. bison is a compiler's compiler, it is used as developing a compiler. -
Add bison
2021-01-01 17:21:44<div><p>Builds bison from source for Linux and Mac. Borrowed from conda recipes.</p><p>该提问来源于开源项目:conda-forge/staged-recipes</p></div> -
Bison 3.7
2020-11-26 04:37:19<div><p>This breaks backwards compatibility with bison versions older than 3.7 Probably not ready for merging. Still leaving it here for people who run into build issues.</p><p>该提问来源于开源项目... -
flex and bison
2018-10-18 09:21:46flex and bison . pdf -
flex & bison
2016-11-28 14:27:15flex & bison -
bison调试
2019-06-11 19:40:16当我们的文法设计的有问题的时候,就需要开启bison的调试方式来检测文法错在哪里,那么如何开启bison的调试方式呢? bison调式需要做的事情如下: 1 )在语法文件*.y定义段开启yydebug,最终如下: %{ #include ...当我们的文法设计的有问题的时候,就需要开启bison的调试方式来检测文法错在哪里,那么如何开启bison的调试方式呢?
bison调式需要做的事情如下:
1 )在语法文件*.y定义段开启yydebug,最终如下:
%{ #include <string.h> #include <stdlib.h> #include <stdio.h> int yydebug=1; %}
2)在编译语法文件*.y的时候,使用-v参数,生成output文件,这个文件中的内容可以帮助我们分析语法分析过程,使用–debug参数,生成的C代码包含调试信息。
命令如下:bison a.y -d -v --debug
-d是用来生成头文件的,与调试无关。
-v生成output文件,描述了我们创建的自动机,可以帮助我们分析调试内容。–debug使得生成的C代码包含更多的调试信息输出
3)编译目标代码,如下:gcc -o test lex.yy.c a.tab.c -lfl -ly
4)运行test
5)结合程序输出信息和output文件的内容,可以知道我们设计的语法错在哪里。 -
Remove bison binary
2020-11-28 18:32:11<div><p>This removes the bison binaries and commits the generated files, as decided in #103. - remove bison.exe (and dependent files) - leave history alone - commit the files built by bison, so most ... -
flex与bison
2018-09-04 10:32:42flex和bison是词法分析和语法分析的工具,本文档全面的描述了这两种工具。使用这写工具,除了编写编译器,对其他很多需要词法和语法开发方面的软件也很有帮助。 -
bison-3.0.4
2017-07-21 14:15:08GNU bison 是属于 GNU 项目的一个语法分析器生成器。Bison 把一个关于“向前查看 从左到右 最右”(LALR) 上下文无关文法的描述转化成可以分析该文法的 C 或 C++ 程序。它也可以为二义文法生成 “通用的 从左到右 最... -
[bison/bison_installer] Paths hardcoded as /home/conan/... in the bison executable
2020-12-09 03:14:53<ul><li>Package Name/Version: <strong>bison_installer/3.3.2/stable</strong> and <strong>bison/3.3.2/stable</strong></li><li>Operating System+version: <strong>Linux Ubuntu 16.04</strong></li><li>... -
Bison 3.5.0 released
2020-12-09 07:34:51<div><p>The upstream Bison 3.5.0 has been released. See https://lists.gnu.org/archive/html/bison-announce/2019-12/msg00001.html</p><p>该提问来源于开源项目:lexxmark/winflexbison</p></div> -
flex bison
2018-05-15 14:10:00https://www.gnu.org/software/bison/manual/bison.htmlhttps://blog.csdn.net/sirouni2003/article/details/400672 http://www.cnblogs.com/itech/archive/2012/03/04/2375746.html ...https://www.gnu.org/software/bison/manual/bison.html https://blog.csdn.net/sirouni2003/article/details/400672
http://www.cnblogs.com/itech/archive/2012/03/04/2375746.html
http://academic.udayton.edu/SaverioPerugini/courses/cps444/lecture_notes/yacc.html
http://read.pudn.com/downloads139/doc/fileformat/597500/Lex%E5%92%8CYacc%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A.pdf
https://book.douban.com/subject/6109479/ https://github.com/mbbill/flexbison/tree/master/flexbison
https://stackoverflow.com/questions/21298097/library-not-found-for-lfl
转载于:https://www.cnblogs.com/xuxm2007/p/9040697.html
-
使用Flex和Bison进行编译器构造Compiler Construction using Flex and Bison
2019-10-29 03:09:02使用诸如Flex和Bison之类的编译器编译器进行编译的指南。 使用这两种工具,您可以专注于编译器的概念,而无需从头开始构建编译器。
-
Java LeetCode 231. 2的幂
-
牛客IOI周赛21-普及组B题题解
-
python中OSError: [Errno 22] Invalid argument: ‘/\u202aC:/Users/76189/Desktop/donations.csv‘
-
游戏半条命系列人物皮肤壁纸
-
(新)备战2021软考网络工程师终极解密培训套餐
-
Java之泛型<T> T与T的用法
-
2021全网最详细【WEB前端】从零入门实战教程,全课程119节
-
Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.appxbundle
-
Machine_Learning周志华《机器学习》阅读笔记
-
c# 接口和抽象类学习总结
-
家庭管理系统、通讯录、时钟的C编程
-
微服务系列第七十一季-Spring入门
-
MPU6050陀螺仪测试程序
-
Qt Mingw32 + opencv3.4 实例程序
-
Stream流及其常用方法
-
5-2.vuex的state和mutations
-
教培行业解决方案
-
第1章 Java入门基础及环境搭建【java编程进阶】
-
国家注册信息安全工程师体系课程(CISP-PTE)
-
15-三种等待方式