编译原理课设Word文件下载.docx

上传人:b****3 文档编号:6300918 上传时间:2023-05-06 格式:DOCX 页数:14 大小:167.35KB
下载 相关 举报
编译原理课设Word文件下载.docx_第1页
第1页 / 共14页
编译原理课设Word文件下载.docx_第2页
第2页 / 共14页
编译原理课设Word文件下载.docx_第3页
第3页 / 共14页
编译原理课设Word文件下载.docx_第4页
第4页 / 共14页
编译原理课设Word文件下载.docx_第5页
第5页 / 共14页
编译原理课设Word文件下载.docx_第6页
第6页 / 共14页
编译原理课设Word文件下载.docx_第7页
第7页 / 共14页
编译原理课设Word文件下载.docx_第8页
第8页 / 共14页
编译原理课设Word文件下载.docx_第9页
第9页 / 共14页
编译原理课设Word文件下载.docx_第10页
第10页 / 共14页
编译原理课设Word文件下载.docx_第11页
第11页 / 共14页
编译原理课设Word文件下载.docx_第12页
第12页 / 共14页
编译原理课设Word文件下载.docx_第13页
第13页 / 共14页
编译原理课设Word文件下载.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理课设Word文件下载.docx

《编译原理课设Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理课设Word文件下载.docx(14页珍藏版)》请在冰点文库上搜索。

编译原理课设Word文件下载.docx

⏹能够输出符号表;

以上为实验的基本内容。

在实验过程中,可根据自己的时间和能力进行适当的扩展。

(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实验小结

在编码赋值语句的动作时,没有实现定义好合适、全面的数据结构,导致在编写中途返工修改数据类型的定义,废了较长时间。

以后在编码过程中应做好充足的准备工作。

这次课程设计和以往略有不同,主要体现在基础框架上。

之前很多课程设计的框架由自己搭建而成,而这次实在教学提供的代码上进行修改,花费了相当一部分时间来搞懂原有代码的含义,而这一段时间的花费也可能和工作的不连续有关。

谢谢老师的指导。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2