编译原理课设Word文件下载.docx
《编译原理课设Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理课设Word文件下载.docx(14页珍藏版)》请在冰点文库上搜索。
![编译原理课设Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/c1c24c61-b2e1-4cd7-ae61-6301bab28246/c1c24c61-b2e1-4cd7-ae61-6301bab282461.gif)
⏹能够输出符号表;
以上为实验的基本内容。
在实验过程中,可根据自己的时间和能力进行适当的扩展。
(3)考核方法
实验完成后,对实验程序进行验收,并于2009年1月8日之前提交实验报告(电子版)。
电子版文件命名要求为:
班号-姓名-学号.doc
目录
目录
1实验情况概述2
2主要功能2
2.1基本功能:
2
2.2扩展功能:
4
3软件总体结构5
4详细设计6
4.1数据结构6
4.2主要的算法和辅助函数7
5实验总结9
5.1调试和bug修改总结9
5.2测试和结果9
5.3实验小结12
1实验情况概述
目的是通过工具Flex和Bison,对一段符合自定义的类Pascal语法规范(简称为MiniPascal)的程序段进行词法分析和带语义的文法分析,最终输出该程序段的符号表和四元式序列。
遵守MiniPascal语法规则,按照LEX规定格式,手工编写词法分析说明文件(称为LEX源文件,后缀名为.l)。
然后使用Flex工具将该文件转换为C语言文件。
按照YSP(YaccSpecification)规定格式,手工编写文法处理说明文件(称为LEX源文件,后缀名为.y)。
然后使用Bison工具将该文件转化为C语言文件。
2主要功能
本实验实现了将测试程序翻译为四元式格式的功能,本实验的四元式的存储结构如下:
structQUATERLIST{
charop[OPSIZE];
chararg1[ARGSIZE],arg2[ARGSIZE];
charresult[ARGSIZE];
intresultType;
//存在变量表中还是四元式的result(临时变量)中
}QuaterList[MAXMEMBER];
相应的修改操作如下:
//生成运算符四元式
voidGEN_Expr(char*op,structexpr*arg1,structexpr*arg2,structexpr*result);
//生成跳转四元式
voidGEN_Jump(char*op,structexpr*arg1,structexpr*arg2,intt);
其中各个参数的定义详情见代码:
ast_yacc.c。
表1定义了操作符及其解释,如下:
表1操作符说明
操作符
含义
四元式举例
简略
宏
J
无条件跳转到指定四元式位置
(j,,,2)
无条件跳到第2个四元式
j
800
ASSIGN
将一个表达式的值赋给一个变量
(:
=,2,-1,i)
进行赋值i:
=2
:
=
801
JUMP_LOW
当两操作数符合“小于”关系时,跳转到指定四元式位置
(j<
,m,n,3)
当m<
n时,跳转到第3条四元式,否则顺序执行
j<
804
JUMP_HIGH
当两操作数符合“大于”关系时,跳转到指定四元式位置
(j>
当m>
j>
805
JUMP_EQUAL
当两操作数符合“等于”关系时,跳转到指定四元式位置
(j=,m,n,3)
当m=n时,跳转到第3条四元式,否则顺序执行
j=
806
JUMP_LE
当两操作数符合“小于等于”关系时,跳转到指定四元式位置
=,m,n,3)
=n时,跳转到第3条四元式,否则顺序执行
807
JUMP_GE
当两操作数符合“大于等于”关系时,跳转到指定四元式位置
808
JUMP_NE
当两操作数符合“不等于”关系时,跳转到指定四元式位置
>
809
STOP
停机指令
(STOP,-1,-1,-1)
停机
1000
表2阐述了其他可能使用到的指令以及四元式:
表2其他指令及四元式
+
加法运算
(+,a,b,c)即c:
=a+b
—
减法运算
(-,a,b,c)即c:
*
乘法运算
(*,a,b,c)即c:
/
除法运算
(/,a,b,c)即c:
变量类型的改动:
1)struct_BExpr,struct_WBD数据类型新增加了成员,用以配合新该进的算法。
2)四元式存储类型的改动,将记录参数的整型变量换为字符数组,在规约过程中直接生成四元式。
3)例子程序中的BoolExpr类型规约有误,会出现语法错误,故将原有规则BoolExpr:
BoolExprAnd|BoolExprOr修改为BoolExpr:
BoolExprAndBoolExpr|BoolExprOrBoolExpr。
但存在优先级结合的问题,故改进后的语法还有一个缺陷:
除非利用’(’、’)’,否则不能实现结合顺序的改变。
4)赋值表达式的优先级结合顺序有问题,故将原有的Expr规约规则改为:
Expr:
Expr'
+'
Term|Expr'
-'
Term
|Term
Term:
Term'
*'
Factor
|Term'
/'
|Factor
Factor:
'
('
Expr'
)'
|Variable|Const
另外,在实现四元式转换的基础上,在赋值语句中检测类型匹配的错误,并在识别语句时在相应的回写位置提出警告。
3软件总体结构
主要文件列表如表3所示:
表3主要文件列表
文件名
作用
AstCP.sln
VC++6.0项目入口文件
Bison.exe
文法分析工具Bison
FLEX.exe
词法分析工具Flex
ast_lex.l
词法分析说明文件
ast_yacc.y
文法分析说明文件
ast_lex.c
词法分析说明文件转化后的.C文件
ast_yacc.c
文法分析说明文件转化后的.C文件
test_cp.txt等
测试程序文件
文法定义.txt
文法定义文本文件
主要的程序模块为词法分析工具flex翻译.l文件,调用yylex()接口,经过Bison转换.y文件后,yyparse()提供外界调用的接口。
Yylex()与yyparse()通过extern定义的全局变量传递信息。
4详细设计
4.1数据结构
1)四元式的存储结构如下:
#defineMAXMEMBER100
}QuaterList[MAXMEMBER];
其中各个参数的定义详情见代码:
符号表结构VarList(使用VarCount标记当前符号表中行数):
structVARLIST{
charname[20];
//变量名
inttype;
//变量类型
union{intIv;
doubleRv;
}Value;
//变量值
}VarList[MAXMEMBER];
2)文法符号类型联合体:
unionYYSTYPE
{
#line81"
ast_yacc.y"
/*yacc.c:
355*/
intIv;
intCH;
intNO;
struct{intTC,FC,TQ,FQ;
}_BExpr;
//真假的跳转目的,真假的跳转语句在四元式的存储处
struct{intQUAD,CH,FQ;
}_WBD;
//判断语句的第一条,跳出到哪个四元式,(不合条件的)跳转语句的位置
//struct{inttype,place;
/*union{intIv;
floatRv;
*/}_Expr;
intival;
floatrval}_Expr;
structexpr*_Expr;
char_Rop[5];
intFirst;
charstr[20];
structnode*ast_node;
#line221"
ast_yacc.c"
};
4.2主要的算法和辅助函数
辅助函数及其主要作用如下:
1)voidprintTree(structnode*result);
向控制台输出树的内容。
2)structexpr*new_expr(intetype);
初始化structexpr类型的变量,包括分配存储空间。
3)voidAddVarList(structnode*head);
将定义的变量存到变量表内。
4)intEntry(char*name,inttype);
以name为变量名查表、填符。
5)intEnter(char*name,inttype);
以name为变量名登记新的一项,返回登记项序号。
6)intLookUp(char*name,inttype);
以name为变量名、type为类型查表,返回登记项序号:
-1:
查无此名;
-2:
变量重复定义。
7)intLookUpName(char*name);
以name为变量名查表,返回登记项序号-1:
查无此名。
8)voidtranslate_arg(structexpr*e,char*str);
将expr翻译为四元式中的参数。
9)voidGEN_Expr(char*op,structexpr*arg1,structexpr*arg2,structexpr*result);
生成运算符四元式。
10)voidGEN_Jump(char*op,structexpr*arg1,structexpr*arg2,intt);
生成跳转四元式。
11)voidBackPatch(intquaterNo,intt);
用四元式序号t回填以第quaterNo个四元式为表头的链。
12)voidExchangeInt(int*f,int*b);
交换两个int变量的值。
13)voidMerge(intno1,intno2);
no1、no2两条链合并为一条链,将no1接在no2的链尾。
14)voidOutputPara(structexpr*arg);
输出参数,供调试用。
5实验总结
5.1调试和bug修改总结
1)在调试过程中,规约规则中对应变量的值无法直接看到,此时将对应的变量值或相应生成四元式的内容输出到控制台,可以较快地查出问题所在。
2)大部分调试时间花费在了细节的修改上。
这次的课程设计使我们意识到,要养成良好的编码习惯,在正式编码前应将程序的大致框架搭建好(不管是在脑中还是在纸上),否则,常常会在编码时进行一些额外的修改,这些修改有时会影响编码思路,甚至造成不易发现的bug。
5.2测试和结果
测试用例:
Programa;
Var
i:
integer;
j:
real;
Begin
i:
=1+3+5;
j:
=2012;
whilej<
=7
Do
Begin
j:
=j-1;
i:
=i+j;
ifi>
9
theni:
=i-1
elsei:
=i+1;
End
End.
输出:
图1运行结果回写部分
图1运行结果四元式部分
代码对应的流程图:
5.3实验小结
在编码赋值语句的动作时,没有实现定义好合适、全面的数据结构,导致在编写中途返工修改数据类型的定义,废了较长时间。
以后在编码过程中应做好充足的准备工作。
这次课程设计和以往略有不同,主要体现在基础框架上。
之前很多课程设计的框架由自己搭建而成,而这次实在教学提供的代码上进行修改,花费了相当一部分时间来搞懂原有代码的含义,而这一段时间的花费也可能和工作的不连续有关。
谢谢老师的指导。