实验二 用YACC工具生成算术表达式的语法和语义分析器(如果喜欢麻烦点个赞哦!!!)
1、实验目的:
用YACC工具生成算术表达式的语法和语义分析器
2、描述用YACC工具进行语法分析的原理
Yacc 全称 Yet Another Compiler Compiler
Yacc是一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。
Yacc的输入是巴科斯范式(BNF)表达的语法规则以及语法规约的处理代码,Yacc输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。
Yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。
3、测试 4 + 4.5 - (34/(8*3±3))的结果
运行结果:
4、根据以下要求,给出实验方案
归约输出:
显示LALR算法分析表:
运行bison的时候,需要给bison一个语法文件作为其输入。bison的输出是一个分析这个语法文件描述的语言的C源代码文件。这个文件叫做bison分析器。bison工具是一个以bison分析器作输出的程序。这个bison分析器应是你程序的一部分。bison分析器的工作是依照语法规则组合记号–例如,将标识符和操作符构建成表达式。在组合的过程中它还要执行相应的语法规定的动作。
记号是来源于称为词法分析器的函数。你必须以某种形式提供词法分析器。bison分析器每当需要一个新的记号的时候就会调用词法分析器1.bison分析器并不知道记号中的东西是什么。,但bison并不依靠这个。
使用 Bison 的流程
1. 创建语言描述文件 (.y 文件)
2. 编写词法分析器函数 yylex()
3. 编写错误报告函数 yyerror()
4. 在 main() 中调用分析器函数 yyparse()
5. 执行 bison -d,由 .y 文件 产生 .tab.c 和 .tab.h 文件
6. 执行 gcc,把 .tab.c 文件编译和链接成可执行程序
5、进行实验,对实验过程进行描述
本次实验是依次实现词法分析和语法分析的过程,词法分析的内容与第一次实验类似,对于数字和其他类型的字符进行识别,分别返回对应的数据类型,这个过程相对来说是比较简单的,由于有特定的词法分析过程的格式,代码的编写还是可以接受。语法分析的过程则是给出文法以及相应的语义动作,代码的编写相对复杂。
首先,将老师所给的文件放到自己的文件夹下,然后编写mylex.l文件和myyacc.y文件,在dos下切换到本目录下,先用flex mylex.l生成lex.yy.c文件,再用命令bison -d myyacc.y生成myyacc.tab.c文件和myyacc.tab.h文件加入到工程中,再编译并连接生成可执行文件。最后测试程序的正确性,在debug目录下创建一个测试文件test.txt将测试片段放入其中,然后在dos界面运行程序,知道产生正确的结果,实验就完成了。
6、程序代码
7、实验结论
其实这个实验并不难,不过很容易出错。在按照文法产生式编写.y文件时,只要不注意写错,或者在编译的无法生成.c文件,或者生成.c文件后在项目编译时生成一大堆的错误。在理论课上学习了yacc进行语法分析的原理,这次通过实验观察yacc的移入归约情况可以说是对课本知识的复习,收获很多。