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

📄 语法分析器.cpp

📁 4
💻 CPP
字号:
#include<iostream.h>
#include<fstream>
#include<string>
#define N 100//定义全局变量
typedef struct{
	char next;
	int length;
}convert;
int p,error,accept;
char input[N];
convert r[7];
void main()
{
	int i,j,h,g;
	char a[N],b[N],states,flag,c;
	char t[]="i+*()#";
	char s[]="0123456789ab";
	void stack(char ,char );
	void initation();
	void dechange(int );
	void stack(char ,char );
	i=-1;
	error=0;
	accept=0;
	initation();
	cout<<"LR分析表:\n"
	    <<"1 E->E+T\n"<<"2 E->T\n"<<"3 T->T*F\n"<<"4 T->F\n"<<"5 F->(E)\n"<<"6 F->id\n";
    cout<<"输入一串字符串以'#'结尾:\n";
	do{	
		c=cin.get();
		b[++i]=c;
	   }while(c!='#');
	h=i;
	j=-1;
	for(i=0;i<=h;i++){//转化id
		if(i!=h)
		{
			if(b[i]=='i'&&b[i+1]=='d')
			{
			   a[++j]='i';
			   i++;
			}
		    else
			   a[++j]=b[i];
		}
		else
			  a[++j]=b[i];
	}
	int temp=0;
	for(temp=0;temp<100;temp++){
	  if(isalpha(a[temp])&&a[temp]!='#')
         a[temp]='i';
	  if(a[temp]=='#')
		  break;
	}
   	g=j;
	p=0;
	j=-1;
    input[++p]='0';
	flag=a[++j];
	do{
	 states=input[p];
	 switch(states){
	  case '0':switch(flag){
	                case 'i': stack('i','5'); flag=a[++j];break;
					case '(': stack('(','4'); flag=a[++j];break;
					default: error=1;
			   }
               break;
	  case '1': switch(flag){
	              case '+': stack('+','6'); flag=a[++j];break;
				  case '#': accept=1; break;
				  default: error=1;
				}
		         break;
	  case '2': switch(flag){
	              case '+': dechange(2); break;
				  case '*': stack(t[2],s[7]); flag=a[++j];break;
				  case ')': dechange(2);  break;
				  case '#': dechange(2); break;
				  default: error=1;
				}
		        break;
	  case '3': switch(flag){
	              case '+':case '*':case ')':case'#': dechange(4); break;
		          default: error=1;
				}
		        break;
	  case '4': switch(flag){
	              case 'i': stack(t[0],s[5]); flag=a[++j];break;
	              case '(': stack(t[3],s[4]); flag=a[++j];break;
	              default: error=1;
				}
		        break;
	  case '5': switch(flag){
	              case '+':case'*':case ')': case '#': dechange(6); break;
	              default: error=1;
				}
		        break;
	  case '6': switch(flag){
	              case 'i': stack(t[0],s[5]); flag=a[++j]; break;
	              case '(': stack(t[3],s[4]); flag=a[++j]; break;
	              default: error=1;
				}
		        break;
	  case '7': switch(flag){
	              case 'i':stack(t[0],s[5]); flag=a[++j]; break;
	              case '(': stack(t[3],s[4]); flag=a[++j]; break;
	              default: error=1;
				}
		        break;
	  case '8': switch(flag){
	              case '+': stack(t[1],s[5]); flag=a[++j]; break;
	              case ')': stack(t[4],s[11]); flag=a[++j];break;
	              default: error=1;
				}
		        break;
	  case '9': switch(flag){
	              case '+':case ')':case '#': dechange(1); break;
	              case '*': stack(t[2],s[7]); break;
	              default: error=1;
				}
		        break;
	  case 'a': switch(flag){
	              case '+':case '*':case ')':case '#': dechange(3); break;
	              default:error=1;
				}
		        break;
	  case 'b': switch(flag){
	              case '+':case '*':case ')':case '#': dechange(5); break;
	              default:error=1;
				}
		        break;

	  default:error=1;
	 }
	}while(!error&&!accept&&j<=g);
	if(error)
		cout<<"字符串不能被接受!\n";
	if(accept)
	    cout<<"字符串可以被接受!\n";
	if(j>g)
		cout<<"字符串没有被接受!\n";
}
void stack(char d,char e)
{
	input[++p]=d;
	input[++p]=e;
}
void change(char a,char b)
{ 
	switch(a){
	case '0': switch(b){
	            case 'E': input[++p]='1'; break;
				case 'T': input[++p]='2'; break;
				case 'F': input[++p]='3'; break;
				default: error=1;
			  }
		       break;
	case '4': switch(b){ 
	            case 'E': input[++p]='8'; break;
				case 'T': input[++p]='2'; break;
				case 'F': input[++p]='3'; break;
				default: error=1;
			  }
		      break;
	case '6': switch(b){
	            case 'T': input[++p]='9'; break;
				case 'F': input[++p]='3'; break;
				default: error=1;
			  }
		      break;
	case '7': switch(b){
                case 'F': input[++p]='a'; break;
                default: error=1;
			  }
		       break;
	default:error=1;
	}
}
void dechange(int a)
{
	p=p-2*r[a].length;
	input[++p]=r[a].next;
    change(input[p-1],input[p]);
}
void initation()
{
	r[1].next='E'; r[1].length=3;
	r[2].next='E'; r[2].length=1;
    r[3].next='T'; r[3].length=3;
	r[4].next='T'; r[4].length=1;
	r[5].next='F'; r[5].length=3;
	r[6].next='F'; r[6].length=1;
}

⌨️ 快捷键说明

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