条件语句的翻译程序设计.doc
条件语句的翻译程序设计
(递归下降法、输出四元式)
1、系统描述(问题域描述)
1.1程序设计的功能
利用递归下降法完成条件语句IF-THEN- ELSE的语法及语义分析程序。输出的中间代码选用四元式。
1.2程序开发
1.2.1程序开发工具
Windows环境下的Visual C++
1.2.2条件控制的布尔式翻译
出现在条件语句if E then S1 else S2中的布尔表达式E,它的作用仅在于控制对S1和S2的选择。作为转移条件的布尔式E,我们可以赋予它两种“出
口”,一是“真”的出口,出向S1;一是“假”出口,出向S2。
1.3程序界面
本程序是使用Visual C++语言编辑,由于布尔表达式关系多,使程序分析过程太多,本程序只实现很简单的布尔表达式的判断,和简单的赋值语句处理。
所以用户界面简明。
2、文法及属性文法的描述
2.1、文法的描述
2.1.1终结符
终结符V T={if、<、:=、then、else、id}
2.1.2非终结符
非终结符V N={S,E}
2.1.3开始符号
开始符号S={S}
2.1.4产生式
产生式如下:
S->id=id | if E then S else S
E->id < id
2.2、属性文法的描述
2.2.1条件语句的属性文法
2.2.2条件语句的翻译
在翻译if-then-else语句S->if E then S1 else S2时,布尔表达式E的代码中有这样的转移指令:若E为真则转移到S1的第一条指令,若E为假则转
移到S2的第一条指令。继承属性S.next 给出了紧接着S的代码之后将被执行的
三地址指令的标号。在S1的代码之后有一条明显的转移指令goto S.next,但S2
之后没有。
3、语法分析方法及中间代码形式的描述
本程序采用语法制导翻译法,在语法分析的过程中输出中间代码。四元代码采用结构体存放,它是一个带有五个域的记录结构,这五个域分别称为label、op、arg1、arg2及result和阿address的联合体。域label用于存放每一个四元式前面的标号,域op包括一个代表运算符的内部码,是一个枚举类型,arg1代表第一个运算符,arg2代表第二个运算符,result或address代表输出结果。4、简要分析与概要设计
本程序对词法分析进行了简化,只能输入IF,ELSE,THEN,〉,=,a-z
且是从文件输入。作为条件语句只能是id>id,作为赋值语句只能是id=id,其中id可以是从a到z的任意小写字母。
程序可以分成两大块。
首先是词法分析(由函数cifa()完成),将输入转换成一个个单词存放在一个Token数组里面。Token结构有两个域组成,type代表单词的种别编码,是一个整数,ch代表单词的字符属性(只对id和>,=有效)。
其次是语法分析和四元式输出模块,该模块由两个递归调用的函数E()和S()组成,分别对应非终结符号E和S。函数S有两个参数,第一个参数lab代表S的第一个四元式前面的标号,第二个参数next代表S结束后的第一个四元式的标号,这两个参数都由主函数传入。函数E有3个参数,第一个参数lab代表E 的第一个四元式前面的标号,第二个参数etrue和第三个参数efalse分别代表E 的真出口和假出口的标号。
主要算法如下:
S(int lab,int next)
{
if(match(ID))
{
Char a,b
a=ch;
nexttoken()
match(‘=’)
nexttoken()
match(ID)
b=ch;
输出四元式“lab: =,b,-,a“
输出四元式“ J,-,-,next”
nexttoken();
}
else if(match(“IF”))
{
nexttoken()
int etrue=newlabel();
int efalse=newlabel();
E(lab,etrue,efalse);
if(match(THEN))
{
nexttoken()
S(etrue,next);
Match(“ELSE”)
S(efalse,next);
}
Else
ERROR();
}
else
ERROR();
}
void E(int lab,int etrue,int efalse) {
if(match(ID))
{
char a,b;
a=ch;
nexttoken()
match(“>”)
nexttoken()
match(ID)
b=cur.ch;
输出四元式”lab:j>,a,b,etrue”
输出四元式” J,-,-,efalse”
Nexttoken();
}
else
ERROR("E()");
}
主函数调用S(-,10000)即可。10000表示最后一条语句的标号,-表示没有标号5、软件的测试方法和测试结果
程序运行后提示输入待处理的文件名:
输入文件名1.txt,文件1.txt类容如下:
IF a>b THEN x=a ELSE x=b
这是一个不带有嵌套结构的简单if语句,输出结果如下:
将文件1.txt的类容换成下面的较复杂的嵌套的IF语句:
IF a>b THEN
IF c>d THEN
x=f
ELSE x=t
ELSE
IF b>y THEN
x=y
ELSE x=r
再次运行程序,输出结果如下:
6 设计评价
6.1设计的不足
此程序基本上实现了对条件语句的跳转逻辑的翻译功能,但是能力有限,只能处理if和else配套使用的情况。另外本程序的错误处理做的不是很好,有待改善。
6.2收获与体会
编译原理是一门理论性很强的课程,要想设计一个好的编译器,需要掌握很多的理论知识,同时也需要有很强的动手能力。我们学的编译原理不涉及在具体及其上的实现,只具体到了中间代码,而一个程序无非就是条件语句,循环语句,赋值语句,布尔表达式,以及其他一些很具体的东西,所以,只要掌握好了每种语句的翻译方法,再将理论运用于实践中,就应该能设计出好的中间代码。