条件语句的翻译程序设计.doc

条件语句的翻译程序设计.doc
条件语句的翻译程序设计.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收获与体会

编译原理是一门理论性很强的课程,要想设计一个好的编译器,需要掌握很多的理论知识,同时也需要有很强的动手能力。我们学的编译原理不涉及在具体及其上的实现,只具体到了中间代码,而一个程序无非就是条件语句,循环语句,赋值语句,布尔表达式,以及其他一些很具体的东西,所以,只要掌握好了每种语句的翻译方法,再将理论运用于实践中,就应该能设计出好的中间代码。

相关主题
相关文档
最新文档