西工大编译原理实验报告Word格式.docx
《西工大编译原理实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《西工大编译原理实验报告Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
5实验总结5
5.1调试和bug修改总结5
5.2测试和结果5
5.3实验小结5
1实验情况概述
本实验的主要任务是编写一个小型类Pascal语言的编译器。
该编译器应当能够将输入的源程序文本翻译为相应的四元式,并输出符号表。
实验环境:
词法分析器采用flex;
语法分析器采用bison;
软件开发使用VisualC++6.0。
功能:
1.能够处理整型、实型两种类型的变量定义;
2.能够识别注释;
3.能够处理程序结构的定义;
4.能够识别算术、关系和逻辑表达式;
5.能够识别常量定义;
6.能够识别顺序、赋值、循环、选择、复合语句等基本的语句类型。
输出结果:
1.将输入的文本输出为四元式序列;
2.输出符号表。
2主要功能
1.基本功能:
根据词法分析处理说明文件(.l)和语法分析处理说明文件(.y)来识别输入的测试文件是否符合MiniPascal所规定的语法要求;
若测试文件符合其语法要求,则输出程序正确运行步骤的四元式表示以及程序运行过程中所用到的的符号表;
若不符合,则发生错误,程序无法运行,并提示错误信息。
四元式基本形式:
(op,arg1,arg2,result),其中op为一个二元(也可以是一元或零元)运算符;
arg1,arg2分别为它的两个运算(或操作)对象,它们可以是变量、常数或系统定义的临时变量名;
运算结果将放入result中。
2.扩展功能:
定义了如下两类四元式:
(jrop,A1,A2,p)—当关系A1ropA2成立时,转向第p四元式;
(j,0,0,p)—无条件转向第p四元式。
3.程序运行结果如下所示:
4.
3软件总体结构
3.1软件包括的程序文件:
ast.cast.h
ast_lex.cast_yacc.c
ast_lex.last_yacc.y
3.2程序模块如下图所示:
3.3各程序块之间的传递
词法分析模块与语法分析模块通过单词的内部码来传递信息;
字符数组str1存储当前正在识别的单词。
语法分析产生的四元式和符号表均存储在结构体中。
4详细设计
4.1数据结构
四元式数据结构:
structQUATERLIST{
charop[6];
chararg1[6],arg2[6],result[6];
}
QuaterList[MAXMEMBER];
符号表数据结构:
structVARLIST{
charname[20];
inttype;
/*1为real0为int*/
intaddr;
}VarList[MAXMEMBER];
表达式数据结构:
structEexpr
{
inttype,place;
union
{
intIv;
floatRv;
}Value;
};
其中type为2表示变量,1表示整数,Iv中存储该整数的值,0表示小数,Rv中存储该小数的值。
4.2主要的算法和辅助函数
voidBackPatch(intp,intt);
/*用四元式序号t回填以p为首的链,将链中每个四元式的result域改写为t的*/
intMerge(intp1,intp2);
/*将p1和p2的两条链合并为一条,并返回新链的序号*/
voidGen(charjop[],chararg1[],chararg2[],charresult[]);
/*根据所给参数产生一个新的四元式*/
intLookUp(char*Name);
/*在符号表中查找Name,若查到返回序号*/
intEnter(char*Name);
/*以Name为名字查符号表,若未查到,则调用Enter函数添加该项*/
intEntry(char*Name);
/*在符号表中添加Name新项,返回值为序号*/
intNewTemp();
/*产生临时变量,每次调用都定义一个新的临时变量,返回值为该变量的编*/
voidChangeToString(char*dest,structEexprex);
/*若所给ex为常数,则将其值变为字符串,存入dest中,若所给ex为变量,则将其变量名变为字符串,存入dest中*/
voidOutputQ(void);
/*用于输出四元式的函数*/
intyyparse();
/*主语法分析函数*/
voidOutputIList(void);
/*输出符号表函数*/
intyyerror(char*);
/*错误处理函数*/
4.3规则说明
采用语法制导翻译方法,即根据文法中每个产生式所蕴含的语义,为其后续准备若干语义子程序,对所要完成的语义处理功能进行分析描述,在语法分析过程中,当分析器使用该产生式进行语法分析时,除完成语法分析动作外,还将调用为其配备的语法分析子程序,进行相应的语义处理,完成语法翻译工作。
例如这个规则:
ISE:
IBTStatementElse
{
intq=NXQ;
Gen("
j"
"
0"
-1"
);
BackPatch($1,NXQ);
$$=Merge($2,q);
}
;
此时,编译系统已明确当前正在处理的是if-then-else结构,then后所跟的表达式已处理完毕,且else后所跟的表达式的第一个四元式位置已可确定。
在准备翻译else后所跟的表达式之前,首先应紧接then后所跟表达式的四元式序列之后产生一个无条件转四元式,并将此四元式与then后所跟表达式的出口链合二为一,作为整个if-then-else结构的出口,这一信息将作为ISE的综合属性Chain传递上去;
另外,IBT的综合属性此时即可回填。
5实验总结
5.1测试和结果
5.1.1测试程序:
Programa;
Vari,j:
integer;
k:
real;
Begin
whilej>
=2do
ifi<
5then
ifi>
=6then
k:
=7.1
elsek:
=8+4
=9;
End.
5.1.2输出的四元式序列和符号表如下:
5.2实验小结
本次实验做得还算顺利,最终完成了实验要求的基本功能,一开始拿到题目的时候觉得非常难,因为以前没有接触过编译器的设计,而且对于实验中所用的工具,在之前的实验中都没接触过,有点难以想象。
自习研读完老师给的lex和yacc的资料以及所给示例之后,才明白实验的大致流程,一切都弄明白明白之后用代码实现也很快。
我在做实验的过程中编写代码占了一小部分时间,调bug花了大部分时间,最开始调试过程中我是在一个文件夹下利用win_flex.exe和win_bison.exe工具生成.c文件,然后将.c文件复制到VC工程里去,然后发现太麻烦了,就将win_flex.exe和win_bison.exe工具拷到了VC工程里,每次就直接在VC工程下生成.c文件,不需要再复制了。
本次实验我是根据老师给的test_ast的例子来写的,在测试布尔表达式时,我发现test_ast规则中关于布尔表达式的部分是有问题的,改成课本上的写法就好了。
这次我直接利用Bison提供的支持,有机会的话可以尝试下自己构造抽象语法树。
经过这次实验,自己对编译原理的理论与实践都有了深刻的理解。
在语法分析与词法分析的领悟中,自己的学习能力得到了提升,而且这次实验让我们理解了编译器的工作原理。
最后,感谢实验课的老师与助教以及同学对我的帮助。