IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2 下载本文

内容发布更新时间 : 2024/11/6 9:44:40星期一 下面是文章的全部内容请认真阅读。

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

IF-ELSE条件语句的翻译程序设计

1 问题描述

要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。

2 问题分析及编译系统的概要设计

编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。

这次实验涉及到词法分析、语法分析、语义分析及表格管理和出错管理。其中,词法分析至少要能识别关键字“if”、“then”和“else”,标识符(即自定义变量),数字,和运算符等等;语法分析要分析程序结构的合法性,即是否为文法的句子;语义分析要能够语法制导翻译出中间代码(三地址)并将其输出;表格管理是指符号表;出错处理是指在语法分析时,所有非文法句子的错误类型处理.

3 文法及属性文法的定义 3.1 文法:

文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序.

IF-ELSE条件语句的文法如下所示:

0.A->EB

1.B->+EB|-EB|ε 2.E->FT 3.T->*FT|/FT|ε 4.F->i|(E) 或者能够更简洁一点:

0.S->if A THEN B ELSE C 1.A->m rop n 2.B->x=m arop n

1

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

3.C->x=n arop m 4.rop->=|<|> 5.arop->+|-|*|/

3.2 属性文法:

属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)

配备若干相关的“值”(与文法符号相关的属性)。

在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规则的形式为:b:=f(c1,c2,?,ck)其中f是一个函数,而且或者①b是A的一个综合属性并且c1,c2,?,ck是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有继属性,文法开始符号的所有继承属性作为属性计算前的初始值。

属性文法为:

if(VT[opr]=='=') //{\判断}; { }

else if(VT[opr]=='>') //{\判断}; { }

2

arr[d][1]=arr_i[opd]; arr[d][0]='='; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++;

arr[d][1]=arr_i[opd]; arr[d][0]='>'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++;

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

else if(VT[opr]=='<') //{\判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='<'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++;

}

else if(VT[opr]=='+') { arr[d][1]=arr_i[opd]; arr[d][0]='+'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++;

}

else if(VT[opr]=='-') { arr[d][1]=arr_i[opd]; arr[d][0]='-'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++;

}

else if(VT[opr]=='*') {

//{\判断}; //{\判断}; //{\判断}; 3

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

}

arr[d][1]=arr_i[opd]; arr[d][0]='*'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++;

else if(VT[opr]=='/') //{\判断}; { }

else if(opr==-2) //{其他字符判断}; {

arr[d][1]=id-1; arr[d][1]=arr_i[opd]; arr[d][0]='/'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++;

arr[d][0]=' '; } else

if(VT[opr]!='<'&&VT[opr]!='>'&&VT[opr]!='+'&&VT[opr]!='-'&&VT[opr]!='*'&&VT[opr]!='/')//{\结束符判断};

{

4

arr[d][2]=arr_i[opd]; arr[d][3]=' '; arr[d][4]=' ';

arr[d][1]=id-1;

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

d++; }

4 词法分析

首先应该创建一个枚举类型的变量来存放一些关键字:

char VN[11]={'K','L','P','S','E','G','T','R','F','Q','\\0'}; //产名生式头 char VT[16]={'i','=','<','>','+','-','*','/','(',')','f','t','e',';','\\0'}; //特征字符集

再创建一个结构体,用来存放词法分析的结果,共有两个域,一个关键字域,表明

他是什么类型,以及它自身的内容。

这个词法分析程序比较简单,因为本身的程序就局限在if-else语句,所以保留字

的类型我就只写了if、then和else三个;碰到数字开头的除了关键字就是标识符;碰到数字开头的就是数字;碰到界限符和操作符(因为引入的类型也很少),所以也很容易区别。

在词法分析结束之后,就应该把分析的结果输出来。输出的格式是【(单词,类型

编号) 类型名】

源程序文件

字符的分离

单词的判断

查找相应的表

单词的类型的判断

调用不同类型的单词处

理函数进行单词的处理

产生类型码

将中间单词和其类型码存入数组

处理完毕

5