递归下降

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

南京工程学院

实验报告

课程名称编译原理

实验名称递归下降分析技术班级

学号0105

学生姓名

成绩

指导教师

20年12月

一.实验目的:

应用递归下降分析技术,关于各非终结符号构造相应子程序来识别相对于它的短语。

二.实验内容:

递归下降识别程序的例1:

对于文法G[E]:

E::=E+T|T T::=T*F|F F::=(E)|i

经消去左递归同时也就消去了回溯性后的等价文法G’[E]:

E::=TE’E’::=+TE’|εT::=FT’

T’::=*FT’|εF=(E)|i

递归下降识别程序的例2:

对于文法G[S]:

S::=S;T S::=T T::=if e then S else S

T::=if e then S T::=a

经消去左递归同时也就消去了回溯性后的等价文法G’[S]:

S::=TS’S’::=;TS’|εT::= if e then ST’|a

T’::=else S |ε+

三.流程图:

递归下降例1的流程图

递归下降例2的流程图四.实验方法:

1.用C语言写出递归下降识别程序1如下:

#include

#include

void T(); // 声明函数

void F(); // 声明函数

void E1(); // 声明函数

void T1(); // 声明函数

char sym;

char str[10]; //存放输入的字符串

int i=0;

char GetSymbol(){ //取字符

sym=str[i];

i++;

return sym;

}

void Error(){ //出错判断

cout<<"error!"<

}

void E(){ //递归下降的入口

T();

E1();

}

void E1(){

if(sym=='+'){ //判断取的字符是否为+

sym=GetSymbol();

T();

E1();

}

}

void T(){

F();

T1();

}

void T1(){

if(sym=='*'){ //判断取的字符是否为*

sym=GetSymbol();

F();

T1();

}

}

void F(){

if(sym=='i') { sym=GetSymbol();} //判断取的字符是否为i取下一个字符else {

if(sym=='('){ //判断取的字符是否为(取下一个字符

sym=GetSymbol();

E();

if(sym==')') { sym=GetSymbol();} //判断取的字符是否为)取下一个字符

else { Error(); }

}else

Error();

}

}

void main(){

for(int j=0;j<10;j++){str[j]=0;}

cin>>str;

sym=GetSymbol();

E();

if(sym!=0)

Error();

}

2.用C语言写出递归下降识别程序2如下:

#include

#include

#include

void T(); //声明函数

void S1(); //声明函数

void T1(); //声明函数

char sym;

char str[100]; //放输入的字符串char str1[5]; //存放取出的字符串int i=0;

char GetSymbol(){ //取字符

sym=str[i];

i++;

return sym;

}

void Error(){ //判断错误

cout<<"error!"<

}

void gj() //取字符串

{

for(int j=0;j<5;j++){str1[j]=0;}

str1[0]=sym;

int k=0;

sym=GetSymbol();

while(sym>='a' && sym<='z')

{ k++;

str1[k]=sym;

sym=GetSymbol();

}

}

void S(){

T();

S1();

}

void S1(){

if(sym==';'){

sym=GetSymbol();

T();

S1();

}

}

void T(){

if(sym=='a') { sym=GetSymbol();} else {

gj();

相关文档
最新文档