递归下降递归下降
#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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。