IF-ELSE条件语句的翻译程序设计(递归下降法、输出四元式)

武汉理工大学《编译原理》课程设计说明书

在程序语言的语法定义中有许多采用递归定义。我们在对它进行语法分析时,编制的处理程序也采取递归的方式,可使其结构简单易读。但由于频繁地调用子程序大大地降低了分析速度。

递归下降法的主要思想是:对每个非终结符按其产生式结构写出相应语法分析子程序。因为文法递归相应子程序也递归,子程序的结构与产生式结构几乎一致。所以称此种方法称为递归子程序法或递归下降法。

程序是以一个个单词的形式向后读取,读取到if之后就开始执行E的递归子程序,程序根据布尔表达式的真假,进而选择执行相应的分支,即如果布尔表达式为真,就执行then后面的赋值语句,如果布尔表达式为假,就执行else后面的赋值语句,递归子程序E分别赋予布尔表达式真和假不同的地址,并将跳转相应的信息写到处理四元式的结构体数组中去,E执行完以后,回到S中继续执行后面的,读取到then之后,就表示当条件为真的时候,执行then之后的赋值表达式,处理赋值的信息写到处理四元式的结构体数组中去,当读取到else之后,同理的执行当条件为假的时候的赋值表达式,处理完了之后赋值相应的信息也写到处理四元式的结构体数组中去,这样反复执行就实现的对语法的分析。

3.2语法分析表设计:

实验要求的是递归下降法,主要是调用不同的递归子程序,所以没有什么语法分析表,流程图在后面。

4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;

4.1if-else四元式表示的描述:

中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。 三地址代码可看成中间代码的一种抽象形式。

三地址代码通常有三种表示方法:四元式、三元式、间接三元式。我使用三元式输出实验的中间代码。四元式在三元式的基础上增加看result运算结果,四元式之间的联系是通过临时变量实现的。

5

武汉理工大学《编译原理》课程设计说明书

4.2if-else三地址四元式表示序列的就够设计:

四元式结构形式: 编号 (OP,ARG1,ARG2,RESULT) If-else变成这种形式形式如下: If a>b goto t1 goto t2 t1:x=a; goto t50 t2:x=b; goto t50 t50:

如(jump,-,-,L)写成goto L;把(jrop,B,C,L)写成if B rop C goto L。

5 编译系统的概要设计

5.1概要分析:

首先在源程序相同的目录下创建一个txt文档,并在文档中输入需要编译的程序即if-else语句,然后定义一个输入流文件,利用这个流文件中的open函数打开我需要编译的txt文件,在调用初始化各种变量的初始化函数。

接着开始进行词法分析,词法分析程序的主要任务是对构成源程序的字符串从左到右的扫描,逐个字符地读入源程序字符并按照构词规则切分成一个一个具有独立意义的单词。并确定其属性(如保留字、标识符、运算符、界限符和常量等)。再把它们转换成长度统一的标准形式—属性字。

词法分析是编译过程中的第一个阶段,在语法分析前进行 。也可以和语法分析结合在一起作为一遍,由语法分析程序调用词法分析程序来获得当前单词供语法分析使用。 单词的分类(五类):

1. 关键字:由程序语言定义的具有固定意义的标识符。也称为保留字或基本字。 2. 标识符:用来表示程序中各种名字的字符串。

3. 常 数:常数的类型一般有整型、实型、布尔型、文字型。 4. 运算符:如+、- 、*、/ 等。 5. 界限符:如逗号、分号、括号等。

但是我做的这个实验没有用到那么多东西,词法分析的有效字符串为: IF,ELSE,THEN, <,>,.<=,>=,=,和从a到z的单个标识符,但是程序还是相对来说比较简单,复杂的表达式可能不能处理,以后会改进。而词法分析的结果就是将相应的单词赋予不同的属性值,利用词法分析表将结果保存起来,为后面的语义分析做准备。词法分析完成之后就是把词法分析的结果都显示出来。

语法分析的过程在上面已经有了说明,语法分析完了之后就是打印中间代码的四元式形式,根据上面的结果,四元式的数组里面已经存储了编译的具体信息,之需要按照相应的算符,将他们输出出来,即可看到四元式表示形式。

5.2词法分析的具体实现:

6

武汉理工大学《编译原理》课程设计说明书

词法分析的具体过程如下,首先将我们需要的编译的内容读到一个数组之中,利用输入流函数的和获取符号函数配合完成,将数组的的空格、回车等无用的内容去掉,从而将处理过后的转存到该数组中,在利用的这个数组中符号书写的连贯性来进行进行词法分析。例如,then的写法是先写t,再查看下一字符串是否为HEN,那么词法分析一个个单词来进行,发现数组中存储的是t,在判断数组接下来的存储的分别是否为hen,就能够识别关键字then了,其他的是一个道理,处理完成之后就对每个单词的属性都做了出来,就实现了词法分析应该的功能。

6 详细的算法描述(流程图或伪代码)

6.1词法分析输出部分:

void print() {

for(token_index=0;token_index

if(tokentable[token_index].type==$IF)

cout<<\ \关键字\

if(tokentable[token_index].type==$ELSE)

cout<<\ \关键字\

if(tokentable[token_index].type==$THEN)

cout<<\ \关键字\

if(tokentable[token_index].type==$ID)

cout<

if(tokentable[token_index].type==$ASSIGN)

cout<<'='<<\ \运算符\

if(tokentable[token_index].type==$GREAT)

cout<<'>'<<\ \运算符\

7

武汉理工大学《编译原理》课程设计说明书

if(tokentable[token_index].type==$LESS) cout<<'<'<<\ \运算符\

}

token_index=0;

}

6.2流程图:

8

武汉理工大学《编译原理》课程设计说明书

输入txt文件名 初始化 词法分析 输出词法分析 E递归子程序 读取下一单词 语法分析:递归程序S 置结束标志 读取下一单词是IF,调用E 输出四元式 结束

7 软件的测试方法和测试结果

导入文件1.txt,其内容为: IF (ad) THEN x=f; ELSE x=t; ELSE

IF (b>y) THEN x=y; ELSE x=r;

9

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4