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

📄 a3.cpp

📁 有关数据库课程设计
💻 CPP
字号:
//利用递归下降分析程序,解决下列满足LL(1)条件的文法
//消除递归前的文法                   消除递归后的等价文法
//    E→E+T                               E→TP
//    E→T                                 P→+TP|ε
//    T→T*F                               T→FQ
//    T→F                                 Q→*FQ|ε
//    F→(E)|i                             F→(E)|i

#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>

class anal
{
public:
	anal(char * ch);
	void start();
private:
	void e();
	void p();
	void t();
	void q();
	void f();
	void adva();
	int n;
	char * str;
	char sym;
};

anal::anal(char * ch)  //ch为待分析的字符串首地址
{
	str=ch;
	sym=*str;
	n=0;
}

void anal::start()    //开始分析
{ 
	e();
	cout<<"分析成功,输入串可以由该文法推导!"<<endl;
}

void anal::adva()    //指向输入串当前字符的指针后移
{
	n++;
	sym=*(str+n);
}

void anal::e()      //E→TP
{
	printf("%s\t%s\n", "E→TP", str+n);
	t();
	p();
	
}

void anal::p()      //P→+TP|ε
{
	if (sym=='+')
	{
		printf("%s\t%s\n", "P→+TP", str+n);
		adva();
		t();
		p();
	}
}

void anal::t()      //T→FQ
{
	printf("%s\t%s\n", "T→FQ", str+n);
	f();
	q();
}

void anal::q()     //Q→*FQ|ε
{
	if (sym=='*')
	{
		printf("%s\t%s\n", "Q→*FQ", str+n);
		adva();
		f();
		q();
	}
}

void anal::f()      //F→(E)|i
{
	if (sym=='i') 
	{
		printf("%s\t%s\n", "F→i", str+n);
		adva();
	}
	else
	{
		if (sym=='(')
		{
			printf("%s\t%s\n", "F→(E)", str+n);
			adva();
			e();
			if (sym==')') 
			{
				printf("%s\t%s\n", "	", str+n);
				adva();
			}
			else 
			{
				cout<<"输入串不能由该文法推导!"<<endl;
				exit(1);
			}
		}
		else 
		{
			cout<<"输入串不能由该文法推导!"<<endl;
			exit(1);
		}
	}
}

void main()
{
	char a[80];
	cout<<"请输入待分析的字符串:"<<endl;
	cin>>a;

	anal analyse(a);
	analyse.start ();
}


⌨️ 快捷键说明

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