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

📄 ll1.cpp

📁 ll1文法分析。输入要分析的符号串
💻 CPP
字号:
#include"iostream.h"
#include"string.h"
#include "iomanip.h"
#include "stdlib.h"
struct stack{
	int top;
	char s[10];
}*sign;

char *M[5][6]={{"TP","$","$","TP","$","$"},
{"$","+TP","$","$","e","e"},
{"FQ","$","$","FQ","$","$"},
{"$","e","*FQ","$","e","e"},
{"i","$","$","(E)","$","$"}};
int index(char m){
	int ID;
	if((m=='E')||(m=='i'))      ID=0;
	else if((m=='P')||(m=='+')) ID=1;
	else if((m=='T')||(m=='*')) ID=2;
	else if((m=='Q')||(m=='(')) ID=3;
	else if((m=='F')||(m==')')) ID=4;
	else if(m=='#')             ID=5;
	else                        ID=100;
	
	return ID;
}

void main(){
char instr[15],x,a,*current,left,*right;int i=0,step=0,iA,ia,len,top;
bool flag=true;
cout<<"参照文法为:\n"<<"E→TE'\n"<<"E'→+TE'|ε\n"<<"T→FT'\n"\
      <<"T'→*FT'|ε\n"<<"F→(E)|i\n";
cout<<"为编成方便作改写:E'以P、T'以Q  代替."<<endl;
cout<<"请输入待分析的字符串:(以#结束)\n";
do{
	cin>>instr[i++];
}while(instr[i-1]!='#');
instr[i]='\0';
sign=new stack;
sign->s[0]='#';sign->s[1]='E';sign->s[2]='\0';sign->top=1;
current=instr;
a=*current;
cout<<"步骤"<<setw(20)<<"符号栈"<<setw(20)<<"输入串"<<setw(20)<<"所用产生式\n";
cout<<step++<<setw(20)<<sign->s<<setw(20)<<instr<<endl;
while(flag){
	cout<<step++<<setw(20);
	x=sign->s[sign->top];
    if(x=='#'){
	          if(x==a) flag=false;
	          else {
		      cout<<"此句子不符合该文法!";
			  break;
			  }
	}
	else if((x=='i')||(x=='+')||(x=='*')||(x=='(')||(x==')')){
		     if(x==a){ sign->s[sign->top]='\0';
			           sign->top--;
					   a=*(++current);
                       cout<<sign->s<<setw(13+strlen(current))<<current<<endl;
					 }
			 else{	   cout<<"此句子不符合该文法!";
			           break;
			 }
			  
	}
    else if((x=='E')||(x=='P')||(x=='T')||(x=='Q')||(x=='F')){
			  iA=index(x);ia=index(a);
			  if((iA==100)||(ia==100)){
				  cout<<"此句子不符合该文法!"<<endl;break;
				  }
              len=strlen(M[iA][ia]);left=x;right=M[iA][ia];
			  if((len==1)&&(M[iA][ia][0]=='e')){
				  sign->s[sign->top]='\0';
				  sign->top-=1;
				  right="ε";
			  }
			  else if((len==1)&&(M[iA][ia][0]=='$')){
				  cout<<"此句子不符合该文法!";
				  break;
			  }
			  else {top=sign->top;
				  for(int j=len-1;j>=0;j--)
					  sign->s[top++]=M[iA][ia][j];
				  sign->s[top]='\0';
                  sign->top=top-1; 
			 
			  }
			  cout.setf(ios::left);
              cout<<sign->s<<setw(16)<<current<<setw(16)<<left<<"→"<<right<<endl; 
          }
}
if(flag==false) cout<<"                "<<"分析成功结束!\n";

}

⌨️ 快捷键说明

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