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

📄 4.cpp

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

//在老师文法基础上添加的文法

//在老师文法基础上添加的文法

//    F→F#C						                   
//	  F→C								  
//	  C→C@S							   
//	  C→S				    				   
//    M→(E)|i                                                             
/*消除递归之后的文法:                              
      F→CN
      N→#CN|ε
      C→MS
      S→@WS|ε
      M→(E)|i  */

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



class anal
{
public:
	anal(char * ch);
	void start();
private:

	void f();
	void x();
	void c();
	void s();
	void e();
	void p();
	void t();
	void q();
	void m();
	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();       //T→FQ
	p();     //P→+TP|ε
	
}

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→CN
{
	printf("%s\t%s\n", "F→CN", str+n);
	c();
	x();
	
}

void anal::x()      //N→#CN|ε
{
	if (sym=='#')
	{
		printf("%s\t%s\n", "N→#CN|ε", str+n);
		adva();
		c();
		x();
	}
}

void anal::c()      //C→MS
{
	printf("%s\t%s\n", "C→MS", str+n);
	m();
	s();
}

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




void anal::m()      //M→(E)|i
{
	if ((sym<='z'&&sym>='a')||(sym<='Z'&&sym>='A'))
	{
		printf("%s\t%s\n", "M→i", str+n);
		adva();
	}
	else  
	{
		if (sym=='(')
		{
			printf("%s\t%s\n", "M→(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()
{
	while(true){
		char a[80];
		cout<<"以下是待分析的字符串"<<endl<<"请输入:"<<endl;
		cout<<"注意:在这里的终结符是任意字符, 运算符包括+,*,'#',和'@':"<<endl;
		cin>>a;

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





⌨️ 快捷键说明

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