Bison生成文件分析
来源:互联网 发布:图纸软件下载 编辑:程序博客网 时间:2024/06/05 20:43
Bison功能很强大,可以加参数-v可以生成可阅读的.output文件,还可以生成dot转换图
本文以lex yacc 创建一个桌面计算器 为例子研究bison生成代码
所有介绍都以bison生成为准,通过-v生成*.output文件,通过设置#define YYDEBUG 1以及yydebug=1进行调制
文法
0 ACCEPT : OVER
1 OVER : E '\n'
2 E : E + T
3 E : T
4 T : T * F
5 T : F
6 F : ( E )
7 F : NUM
状态图
E->E.+T s10 s9 5E->T.
T->T.*F s11 r36T->F. r57E->E.+T
F->(E.) s10 s12 8ACC->OVER end. acc9OVER->E'\n'. r110E->E+.Ts1 s2 613 11T->T*.Fs1 s2 14 12F->(E). r613E->E+T.
T->T.*F s11 r214T->T*F. r4
3+2*5规约过程
栈符号输入动作00$3+2*5\n$shift110 1$3+2*5\n$r720 6$F+2*5\n$r530 5$T+2*5\n$read->r340 4$E+2*5\n$shift1050 4 10$E+2*5\n$shift160 4 10 1$E+2*5\n$r770 4 10 6$E+F*5\n$r580 4 10 13$E+T*5\n$shift1190 4 10 13 11$E+T*5\n$shift1100 4 10 13 11 1$E+T*5\n$r7110 4 10 13 11 14$E+T*F\n$r4120 4 10 13$E+T\n$r2130 4$E\n$shift9140 4 9$E\n$r1150 3$OVER$over源代码分析
yyprhs[] { } 产生式右端文法串在yyrhs中的开始位置
yyrhs[] { } 以-1隔开的产生式右端串
yyrline[] { 0, 8, 8, 9 } .y文件中产生式定义所在的行号,调试信息用
yyname[] { {0:$end}, {1:error}, {2:$undefined}, {3:NUM}, {4:'\n'}, {5:+}, {6:*}, {7:(}, {8:)}, {9:acc}, {10:OUT}, {11:E}, {12:T}, {13:F}, '\0' }
yytoknum[] { 0, 256, 257, 258, 10, 43, 42, 40, 41 } 功能与yytranslate相同,token转化为标示符
yy1[] {} 产生式左端符号的编号,阅读Bison生成的.output文件开头即可明白
yyr2[] { } 产生式右端长度,阅读Bison生成的.output文件开头即可明白,规约的时候从栈中弹出多少个状态用到
yydefact[] { } 对于每个状态的缺省规约表达式,对应于状态图中def这一列+1
yydefgoto[] { } 对于每个非终结符号,状态0情况下GOTO状态
yypact[] { } 如果某个状态只有默认动作,则为设置默认操作值,这儿是-6, 没有向前看token的情况下执行判断
yypgoto[] { }
yytable[] { }
yycheck[] { }
yystos[] { }
如果yypact值不为默认值,则yypact、yytoken、yytable、yycheck来确定状态转移,应该是用了某种压缩算法
规约以后状态转移根据yypgoto,判断采用yytable还是yydefgoto计算新的state
参考资源
以下是网上找到的资源,太不容易了
bison的实现中用到的表格:
- yyrhs 和yyprhs一起表示产生式右端文法串,是一个用-1隔开的索引串大数组,串的内容是文法符号的编号
- yyr1 产生式左端文法符号的编号
- yyr2 产生式右端长度
- yyrline 产生式的定义行
- yyprhs 和yyrhs一起表示产生式右端文法串,内容为右端在yyrhs中的起始位置
- yytname 文法符号的名称,必须用YYDEBUG条件编译
- yytranslate 把flex返回的token编号翻译成bison的文法编号
- yytoknum flex返回的token编号翻译成bison的token编号
- yytable DFA状态转移表
- yycheck 和yycheck等长的数组
- yypgoto 非终结符号上的goto下个状态
- yypact Index in YYTABLE of the portion describing STATE-NUM.
- yydefact 缺省动作,长度为DFA的状态个数
- yydefgoto 缺省goto,长度为非终结符号
实 际上BISON就是给我们造表,至于怎么用这个表是我们的事,这些好比是个瓤子,在这个瓤子外头套个毛衣,一个翻译程序就出来了。当然一般来说都是直接用 嵌在BISON里头的毛衣,这样就得到一个LALR(1)分析程序,BISON程序多半支持一个``-S''参数可以用来切换毛衣。
想 了想,明白为什么昨天搞的那个parse tree那么庞大了,因为那个语法是从c99手册扒出来的一点都没有改造过。c99为了严谨用的是优先级级联的无二义性的文法(所以c99里头用不着说明 什么优先级了),这个文法的毛病就是实现太不方便,太多的单一产生式(右端只有一个文法符号的产生式),所以parse tree打印出来就成了一个个很大的锯齿。反观gcc的语法文件就很不一样,引入优先级说明之后,文法变的很简单,所以分析树也得到了简化。
http://www.docin.com/p-483435351.html
介绍了gcc语法分析
yyprhs[] { 0, 0, 3, 7 } 产生式右端文法串在yyrhs中的开始位置,表示从第3、7项开始
yyrhs[] { 6, 0, -1, 6, 4, 3, -1, 3, -1 } 以-1隔开的产生式右端串
yydefact[] { 0, 3, 0, 1, 0, 2 } 对于每个状态的缺省规约表达式,0表示默认出错
yydefgoto[] { -1, 2 } 对于每个非终结符号的缺省GOTO
yypact[] { -2, -3, 0, -3, -1, -3 } -3:默认 没有向前看token的情况下执行判断
yypgoto[] { -3, -3 }
yytable[] { 3, 1, 5, 0, 4 }
yycheck[] { 0, 3, 3, -1, 4 }
yystos[] { 0, 3, 6, 0, 4, 3 }
- Bison生成文件分析
- Bison生成文件分析
- bison
- bison
- 使用 flex & bison 生成科学计算器
- Flex生成文件分析
- 分析DFM文件生成界面
- Dump 文件生成与分析
- [QT]moc生成文件分析
- [QT]moc生成文件分析
- Dump文件生成与分析
- Dump 文件生成与分析
- [QT]moc生成文件分析
- Dump文件生成与分析
- Dump 文件生成与分析
- 使用oolong生成分析文件
- bison 左右递归生成链表的小例子
- prebuilts/misc/linux-x86/bison/bison: 没有那个文件或目录
- 语法分析——Bison介绍以及Flex、Bison联合编译
- 避免表单的重复提交
- CCSequence::create 崩溃
- 顺序表基本操作(Java)
- hdu-2025-查找最大元素
- Bison生成文件分析
- sql第一章总结函数 select into from
- 发现大量的TIME_WAIT解决办法
- hdu A team
- non-local static 变量初始化顺序不确定,带来的问题
- SAE下安装wordpress
- 结构化设计程序
- RAC概念和理论知识
- 论业务流程管理的实现