logo资料库

编译原理实验四、用Flex&Bison;进行语法分析(实验4 用Yacc工具构造语法分析器).docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
《编译原理》实验报告 实验 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 才解决,折腾了两天, 心好累。
八、心得收获 如果遇到解决不了的问题还是快点跳出思维定势,换种方法写吧。
分享到:
收藏