编译原理实验报告 题 目 : 递 归 下 降 语 法 分 析 器 学 院 计 算 机 科 学 与 技 术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁 剑 指 导 教 师 xx 20xx 年 xx 月 xx 日 递归下降语法分析器 装 订 线 一、实验目的 了解语法分析器的内部工作原理,通过在本次实验中运用一定的编程技巧,掌握对表达式进行处理的一种方法。 二、实验原理 算术表达式的文法可以是(可以根据需要适当改变): E→E+E|E-E|E*E|E/E|(E)|i 根据递归下降分析法或预测分析法 ,对表达式进行语法分析 ,判断一个表达式是否正确 。 三、实验步骤 (1) 准备:1. 阅读课本有关章节,确定算术表达式的文法;(设计出预测分析表);2. 考虑好设计方案;3. 设计出模块结构 、测试数据,初步编制好程序。 (2) 上机调试,发现错误,分析错误,再修改完善。教师根据学生的设计方案与学生进行探讨,以修改方案和代码 。 (3)改造后的文法:E→ E+T|E-T|T T→ T*F|T/F|F F→ F^|P P→ c |id| (E) 四、实验环境 计算机 VC++软件 五、实验程序 #include #include #include #include #include void error(); void terror(); void Scanner(); char sym=' '; int i=0; char strToken[30]={""}; FILE *in; void E(); void E1(); void F(); void Retract(char str[30]){ for(int j=0;j<30;j++){ str[j]=0; } } void Scanner(){ sym=fgetc(in); if (isspace(sym)){ while(1){ if(isspace(sym)){ sym=fgetc(in); } else break; } } if(isdigit(sym)){ while(1){ if (isdigit(sym)){ strToken[i]=sym; i++; sym=fgetc(in); } else{ printf("%s",strToken); i=0; Retract(strToken); fseek(in,-2,1); sym=fgetc(in); break; } } } else{ if(sym=='+'){ printf("+"); } else if(sym=='-'){ printf("-"); } else if(sym=='*'){ printf("*"); } else if(sym=='/'){ printf("/"); } else if(sym=='^'){ printf("^"); } else if(sym=='('){ printf("("); } else if(sym==')'){ printf(")"); } } } void F(){ if(isdigit(sym)){ Scanner(); } else if (sym=='('){ Scanner(); E(); if(sym==')'){ Scanner(); } else error(); } else te...