⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 digui.h

📁 编译器中递归下降算法的简单实现
💻 H
字号:
#include <string.h>
#include <stdio.h>

char buff[50]; //输入串

int pointer = 0; //指示当前分析的字符

char currChar;  //当前分析的字符

int step = 0; //当前分析的步骤数

bool tagOfError = false; //出错标志

//FIRST集合
char First_E[2] = {'(','i'} , 
     First_E1[3] = {'+','-','n'},
     First_T[2] = {'(','i'}, 
	 First_T1[3] = {'*','/','n'}, 
     First_F[2] = {'(','i'}, 
	 First_A[2] = {'+','-'}, 
     First_M[2] = {'*','/'};

//FOLLOW集合
char Follow_T1[4] = {'+','-',')','#'} , 
     Follow_E1[2] = {')','#'};

//递归函数声明
void E();
void E1();
void T();
void T1();
void F();
void A();
void M();

//向前读入一个字符
void advance()
{
	currChar = buff[pointer++];
}

//判断当前字符currChar是否在First[]中
bool is_InBuff(char First[])
{
	char *pdest;
	pdest = strchr(First,currChar); //strchr:从字符串First中寻找字符currChar第一次出现的位置
	if(pdest != NULL)
		return true;
	else 
		return false;
}

//报错处理
void repError(char* ch)
{
	if (!tagOfError)	
		printf("Error occurs in step %s !\n",ch);
	tagOfError = true;		
}

//E()函数
void E()
{
	if(!tagOfError)
		printf("%5d          E          %4c          \n",step++,currChar);
	if(is_InBuff(First_T)){
		T();
		E1();
	}
	else
		repError("E");
}

//E'()函数
void E1()
{
	if(!tagOfError)
		printf("%5d          E'         %4c          \n",step++,currChar);
	if(is_InBuff(First_A)){
		A();
		T();
		E1();
	}
	else if(is_InBuff(Follow_E1))
		return;
	else
		repError("E'");
}

//T()函数
void T()
{
	if(!tagOfError)
		printf("%5d          T          %4c          \n",step++,currChar);
	if(is_InBuff(First_F))
	{
		F();
		T1();
	}
	else
		repError("T");
}

//T'()函数
void T1()
{
	if(!tagOfError)
		printf("%5d          T'         %4c          \n",step++,currChar);
	if(is_InBuff(First_M))
	{
		M();
		F();
		T1();
	}
	else if(is_InBuff(Follow_T1))
		return;
	else
		repError("T'");
}

//F()函数
void F()
{
	if(!tagOfError)
		printf("%5d          F          %4c          \n",step++,currChar);
	if(currChar == '(')
	{
		advance() ; 
		E();
		if (currChar== ')')
		{
			advance(); 
			return ;
		}
		else
			repError("F");
	}
	else if(currChar == 'i')
	{
		advance();
		return ;
	}
	else 
		repError("F") ;
}

//A()函数
void A()
{
	if(!tagOfError)
		printf("%5d          A          %4c          \n",step++,currChar);
	if(currChar == '+')
	{
		advance();
		return ;
	}
	else if(currChar == '-')
	{
		advance();
		return ;
	}
	else 
		repError("A");
}

//M()函数
void M()
{
	if(!tagOfError)
		printf("%5d          M          %4c          \n",step++,currChar);
	if(currChar == '*')
	{
		advance();
		return ;
	}
	else if(currChar == '/')
	{
		advance();
		return ;		
	}
	else
		repError("M");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -