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

📄 recursivedescent.cpp

📁 编译原理课中会用到的递归下降程序分析
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#include "iostream.h"
#include "vector.h"

/******************************************递归下降分析实验********************************************/
RD::RD()
{
	RD::pass = true;
	RD::yylineno = 1;					//初始化当前行数为第一行
}

RD::~RD(){}

bool RD::isalnum(char a)			//是否为合法的标识符
{
	return ((a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z') || (a >= '0' && a <= '9'));
}

bool RD::match(int  symbol)        //比较,判断是否有与之相匹配的字符
{
	int  c;
	if(RD::ch == '+')	c = PLUS;   //是+与PLUS 相匹配,类别号就为2
	if(RD::ch == '-')	c = SUB;
	if(RD::ch == '*')	c = TIMES;
	if(RD::ch == '/')	c = DIV;
	if(RD::ch == '(')	c = LP;
	if(RD::ch == ')')	c = RP;
	if(RD::ch == '\n')					//回车
	{
		RD::ch = fgetc(fp);
		RD::yylineno ++;				//当前所在行数加一
	}
	if(RD::ch == EOF)	c = EOF;		//文件结束
	if(isalnum(RD::ch))	c = NUM_OR_ID;	//标识符或数字
	if(c == symbol)	return true;
	else	return false;
}

void RD::advance()                 //读取下一个字符 
{
	RD::ch = fgetc(fp);	
	if(ch != EOF)	printf("当前分析字符:%c\n", RD::ch);
	else printf("文件结束!\n");
}

void RD::E()			//E -> TE'
{
	RD::T();
	RD::E_P();
}

void RD::E_P()			//E' -> ATE' | &
{
	if(RD::A())
	{
		RD::T();
		RD::E_P();
	}
}

void RD::T()			//T -> FT'
{
	RD::F();
	RD::T_P();
}

void RD::T_P()			//T' -> MFT' | &
{
	if(RD::M())
	{
		RD::F();
		RD::T_P();
	}
}

bool RD::A()			//A -> + | -
{
	if(! match(EOF))			//当文件未结束时
	{
		if(match(PLUS))			//如果读入的是 " + "
		{
			RD::advance();
			return true;
		}
		if(match(SUB))			//如果读入的是 " - "
		{
			RD::advance();
			return true;
		}
	}
	return false;  //文件结束
}

void RD::F()			//F -> (E) | i
{
	if(! match(EOF))
	{
		if(match(NUM_OR_ID))	RD::advance();		//F -> i
		else if(match(LP))							//F -> (E)
		{
			RD::advance();
			RD::E();
			if(match(RP))	RD::advance();        //读取完(时应要读取),否则输入串出错
			else 
			{
				fprintf(stderr, "第 %d 行: 未找到可以匹配的括号!\n", yylineno);
				RD::pass = false;
				return;			//如果出错则跳出,程序中止
			}
		}
		else 
		{
			fprintf(stderr, "第 %d 行: 缺少数字或标识符\n", yylineno);   //既无标识符又无左括号,则出错 
			RD::pass = false;
			return;				//如果出错则跳出,程序中止
		}
	}
}

bool RD::M()			//M -> * | /
{
	if(! match(EOF))
	{
		if(match(TIMES))			//如果读入的是 " * "
		{
			RD::advance();
			return true;
		}
		if(match(DIV))				//如果读入的是 " / "
		{
			RD::advance();
			return true;
		}
	}
	return false;
}

void main()
{
	RD  rd;
	if((rd.fp = fopen("input2.txt", "r")) == NULL)    //读取input1 或input2
	{
		cout << "Error on open input.txt!" << endl;
		return;
	}
	rd.ch = fgetc(rd.fp);
	printf("当前分析字符:%c\n", rd.ch);
	rd.E();
	if(rd.pass == true)	cout << "编译通过!" << endl;
}

⌨️ 快捷键说明

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