logo资料库

递归下降子程序的编写.doc

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
实验 4 递归下降子程序的编写 一、实验目的 通过本实验,了解递归下降预测分析的原理和过程以及可能存在的回溯问 题,探讨解决方法,为预测分析表方法的学习奠定基础。分析递归下降子程序的 优缺点。 二、实验准备 1.预习自上而下语法分析小节的内容; 2.学生自己考虑使用的开发环境,如 VC++,熟悉开发环境。 三、实验内容 下列文法中选做一题: 1.针对算术表达式文法:E→TE’ E’ → +TE’|ε T→FT’ T’ →*FT’ |ε F→(E) |i 为其编写递归下降子程序,判定某个算术表达式是否正确:如 j+k*m,j*k+m 输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i 输出:分析结果:算术表达式结构正确或结构错误。 2.给定文法(PASCAL 语言标识符定义文法)(选做) type→simple|↑id|array[simple] of type Simple→integer|char|num dotdot num 其中:dotdot 表示. 编写递归下降子程序,判定一个句子结构是否正确:array [3..5]of integer 输入:其输入数据应该为词法分析器输出的单词序列:array[num dotdot num] of integer 输出:分析结果 四、实验要求 1.编写程序调试运行;考虑如果将你的程序改为识别其他的文法,你的递归下 降子程序可否通用,考虑递归下降子程序方法的优缺点。 2.撰写实验报告:实验名称、实验目的、实验内容、实验结果、结果分析 五、实验结果 1、程序: #include #include #include #include char EL[20]; int word=0; void E1(); void T(); void T1(); void F(); //编写 E 函数 //E->TE
void E() { //因为是第一步,所以直接输出 E->TE' printf("E->TE'\n"); T(); E1(); //如果为 i、则输出 F->i\n,如果为(则指针下 移、调用 E 函数、如果为)则输出 F->(E),否 则说明括号不匹配。 //F->(E)|i void F() { } //就是那个 E'函数 //E'->+TE'|ε void E1() { //如果匹配为+号的话 输出 E'->+TE if(EL[word]=='+') { printf("E'->+TE'\n"); word++; T(); E1(); } else //如果不是加号、则输出空 printf("T'->ε\n"); } //T->FT void T() { printf("T->FT'\n"); F(); T1(); } //如果匹配*则输出 T'->*FT,否则输出空 //T'->*FT|ε void T1() { if(EL[word]=='*') { printf("T'->*FT'\n"); word++; F(); T1(); } else } printf("T'->ε\n"); if(EL[word]=='i') { printf("F->i\n"); word++; } else if (EL[word]=='(') { word++; E(); if(EL[word]==')'){ printf("F->(E)\n"); word++; } else{ printf("\n 错误、括号不匹配(缺 少右括号)\n"); exit (0); } } else{ 式!\n"); } printf("错误、请输入正确的算术表达 exit(0); } //主函数 //输入算数表达式、为其编写递归下降子程序, 判定算术表达式是否正确 int main() { while(1) { printf("请输入算数表达式:"); scanf("%s",EL); E(); } return 0; }
分享到:
收藏