《编译原理》实验报告
实验 4 用 Yacc 工具构造语法分析器
信息科学与技术学院 计算机科学技术系
杨沁文 19720132203423
2015-11-03
一、实验目的
掌握移进-归约技术语法分析技术,利用语法分析器生成工具 Yacc/Bison 实现语法
分析器的构造。
二、实验内容
利用语法分析器生成工具 Yacc/Bison 编写一个语法分析程序,与词法分析器结合,
能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。
源语言的文法定义见教材附录 A.1,p394,要求实现完整的语言。
三、实验要求
1.个人完成,提交实验报告。
2.实验报告中给出采用测试源代码片断,及其对应的最右推导过程(形式可以自行
考虑,如依次给出推导使用的产生式)。
例如,程序片断
对应的最右推导过程为:……
四、实验指导
1.开发工具
Flex & Bison
C++编译器
2.与词法分析器的结合
一个程序通常在每次返回一个标记时都要调用 yylex() 函数。只有在文件结束或者出现错误
标记时才会终止。
一个由 Yacc 生成的解析器调用 yylex() 函数来获得标记。yylex() 可以由 Lex 来生成或完全
由自己来编写。 对于由 Lex 生成的 lexer 来说,要和 Yacc 结合使用,每当 Lex 中匹配一个模
式时都必须返回一个标记。 因此 Lex 中匹配模式时的动作一般格式为:
{pattern} { /* do smthg*/
return TOKEN_NAME; }
于是 Yacc 就会获得返回的标记。当 Yacc 编译一个带有 _d 标记的 .y文件时,会生成一个
头文件,它对每个标记都有 #define 的定义。 如果 Lex 和 Yacc 一起使用的话,头文件必须在
相应的 Lex 文件 .l中的 C 声明段中包括。
3. 参考书目
原书名: Lex & Yacc, Second Edition
原出版社: O'Reilly
作者: (美)John R.Levine,Tony Mason,Doug Brown
译者: 杨作梅 张旭东 等
出版社:机械工业出版社
四、 开发方法
参照实例 1 以及书背后的语法定义,然后搞定相应的 lex.l 就完成了基本工作,但是编译
的错误是个大问题。
五、详细代码
见附件。
六、运行结果
七、 问题
编译时出现了几个我无法检查的问题,十分困惑
1. 明明文件头无错误,却显示有无法识别的字符,将/3777777757 在谷歌查询也找不到类
似的问题。
2. 明明在 gcc 时加入了 tab.h 文件,却报错找不到文件,在 VS2012 中生成工程时也是这样。
最后将 y 文件加入上次实验被注释掉的 main 文件之间编译 tab.c 才解决,折腾了两天,
心好累。
八、心得收获
如果遇到解决不了的问题还是快点跳出思维定势,换种方法写吧。