为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

递归下降

2017-10-27 6页 doc 18KB 15阅读

用户头像

is_014457

暂无简介

举报
递归下降递归下降 #include #include //用于exit的头文件 #include #include #include void expr();//E对应的递归子程序的声明 void exprrest();//E1对应的递归子程序的声明 void term();//T对应的递归子程序的声明 void termrest();//T1对应的递归子程序的声明 void factor();//F对应的递归子程序的声明 void Error();//出错处理函数的声明 void gettoken();//词法分析函数...
递归下降
递归下降 #include #include //用于exit的头文件 #include #include #include void expr();//E对应的递归子程序的声明 void exprrest();//E1对应的递归子程序的声明 void term();//T对应的递归子程序的声明 void termrest();//T1对应的递归子程序的声明 void factor();//F对应的递归子程序的声明 void Error();//出错处理函数的声明 void gettoken();//词法分析函数gettoken()的声明 char ch = ' ';//用来装当前输入对应的字符 int i=0;//数组位置变量置0 char strToken[30]={" "};//用来装数字串的数组 FILE *in=fopen( "input.txt", "r" );//建立文件指针并打开文件 //将字符串置成空串函数 void Retract(char str[30]) { for(int j=0;j<30;j++) { str[j]=0;//将数组内的数值全部重置 } } //词法分析函数 void gettoken() { ch=fgetc(in);//读入一个字符 if(isspace(ch))//判断是否为空格 { while(1) { if(isspace(ch)){ch=fgetc(in);}//如果是空格则指针一直下移 else break;//直到第一个不为空格的为止,跳出本次循环 } } if(isdigit(ch))//判断是否是数字 { while(1) { if(isdigit(ch)) { strToken[i]=ch;//将后个数字放入前一下数字之后 i++;//数组中空位置后移 ch=fgetc(in);//读入下一个字符 } else { printf("%s",strToken);//输出数字串 i=0;//将空位置重新计数 Retract(strToken);//将数组重新开始置起 fseek(in,-2,1);//将指针的位置在当前位置的基础上向前移,个字符 ch=fgetc(in);//读入当前字符 break;//跳出循环 } } } else { if(ch=='+'){printf("+");}//当前是符号+的处理 else if(ch=='-'){printf("-");}//当前是符号+的处理 else if(ch=='*'){printf("*");}//当前是符号+的处理 else if(ch=='/'){printf("/");}//当前是符号+的处理 else if(ch=='('){printf("(");}//当前是符号+的处理 else if(ch==')'){printf(")");}//当前是符号+的处理 } } // -------相应的递归子程序--------// //E对应的递归子程序 void expr() { term();//调用T对应的递归子程序 exprrest();//调用E1对应的递归子程序 } //E1对应的递归子程序 void exprrest() { if(ch=='+'||ch=='-')//判断当前是否是'+'或'-'号 { gettoken();//调用gottoken()函数 term();//调用T对应的递归子程序 exprrest();//调用E1对应的递归子程序 } } //T对应的递归子程序 void term() { factor();//调用F对应的递归子程序 termrest();//调用T1对应的递归子程序 } //T1对应的递归子程序 void termrest() { if(ch=='*'||ch=='/')//判断当前是否是'*'或'/'号 { gettoken();//调用gottoken()函数 factor();//调用F对应的递归子程序 termrest();//调用T1对应的递归子程序 } } //F对应的递归子程序 void factor() { if(isdigit(ch)){gettoken();}//判断当前是否是数字 else//当前不是数字 { if(ch=='(')//判断当前是否是'(' { gettoken();//调用gottoken()函数 expr();//调用E对应的递归子程序 if(ch==')'){gettoken();}//判断当前是否是')' else Error();//调用出错处理函数 } else Error();//调用出错处理函数 } } //出错处理函数 void Error() { printf("This is the wrong phrase!\n");//输出错误提示 exit(0);//终止程序 } //主函数 void main() { printf("本程序可以对一个输入表达式进行语法分析。\n"); printf("如果如果输入的表达式分析正确,则输出该表达式;否则,输出表达式后,给出错误 提示~\n"); printf("输入支持文件输入,请在相应目录下的“input.txt”文件中输入要分析的表达式。\n"); printf("注意:输入时如果以数字结尾,则须以空格结束。\n"); gettoken();//调用gottoken()函数 expr();//调用E对应的递归子程序 fclose(in);//关闭文件 }
/
本文档为【递归下降】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索