递归下降
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();