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

📄 yujufanyi.cpp

📁 词法分析和语法分析,基于算术优先文法分析的汇编课设
💻 CPP
字号:
#include <math.h>
#include <iostream.h>
#include <string.h>
int c,k,t=0;
struct shuzu{
	char *result[8];
	char *ag1[8];
	char *op[8];
	char *ag2[8];
};
shuzu quad[20];

char prog[80],token[8];
char ch;
int syn,p,m,n,sum,kk;
char *rwtab[6]={"begin","if","then","while","do","end"};
int yucu();
int statement();
char *expression();
char *term();
char *factor();
char *newterm(void);
void emit(char*result,char*ag1,char*op,char*ag2);
int scaner()
{
	for(n=0;n<8;n++)
		token[n]=0;
	m=0;
	ch=prog[p];
	while(ch==' ') ch=prog[p++];
	if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
	{   
		while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
		{
		token[m++]=ch;
		ch=prog[p++];
		}
		token[m++]='\0';
		p--;
		syn=10;
		for(n=0;n<6;n++)
			if(strcmp(token,rwtab[n])==0)
			switch(n){
				case 0:
					   syn=1;
					   break;
				case 1:
					 syn=2;
					 break;
				case 2:
					syn=3;
					break;
				case 3:
					syn=4;
					break;
                case 4:
					syn=5;
					break;
				case 5:
					syn=6;
					break;
				default:break;
			}
		}
	

	else 
		if(ch>='0'&&ch<='9'){sum=0;
			while(ch>='0'&&ch<='9')
			{sum=sum*10+ch-'0';
		     ch=prog[p++];
			 }
		
	     p--;
		 syn=11;
		}
		


	else 
		switch(ch){
		case '<':m=0;
			     token[m++]=ch;
			     ch=prog[p++];
			     if(ch=='>')
				 {syn=21;
			      token[m++]=ch;}
			    else if(ch=='=')
				{
				  syn=22;
				  token[m++]=ch;
				}
			     else {syn=20;p--;}
			     break;
        case'>':m=0;
			    token[m++]=ch;
			    ch=prog[p++];
				if(ch=='=')
				{syn=24;
				token[m++]=ch;}
				else{
					syn=23;
					p--;
				}
				break;
		case ':':m=0;
			     token[m++]=ch;
				 ch=prog[p++];
				 if(ch=='=')
				 {syn=18;
				  token[m++]=ch;
				 }
				 else{
					 syn=17;
					 p--;
				 }
				 break;
		case '=':
			     syn=25;
			     token[0]=ch;
				 break;
		case'+':    syn=13;
			        token[0]=ch;
					break;
        case'-':
			    syn=14;
			    token[0]=ch;
				break;

        case'*':
			    syn=15;
			    token[0]=ch;
				break;
        case'/':
			    syn=16;
			    token[0]=ch;
				break;
		case ';':
			    token[0]=ch;
			    syn=26;
				break;
		case '(':
			token[0]=ch;
			syn=27;
			break;
		case ')':
			token[0]=ch;
			syn=28;
			break;
        case'#':
			    syn=0;
			    token[0]=ch;
				break;
		default:
			syn=-1;
	}
	return syn;
}


int lrparser(){   
	int schain=0;
	if(syn==1){
		scaner();
	    schain=yucu();
	    if(syn==6){
			scaner();
	        if(syn==0&&kk==0){
		    cout<<"success!";
		    kk=1;}
	}
	else {
		if(kk!=1) cout<<"缺end,错误!";
		kk=1;}
	}
	else{cout<<"缺begin错误!";kk=1;}
	return schain;
}
int yucu(){
	int schain=0;
	schain=statement();
	while(syn==26){
		scaner();
		schain=statement();
	}
	return schain;
}
int statement(){
	char tt[8],eplace[8];
	int schain=0;
	switch(syn){
		case 10:
			strcpy(tt,token);
			scaner();
			if(syn==18){
				scaner();
				strcpy(eplace,expression());
				emit(tt,eplace,"","");
				schain=0;
			}
			else{
				cout<<"error!缺少赋值号!";
			}
			
			break;
	}
	return schain;
}
char *expression(){
	char *tp,*ep2,*eplace,*tt;
	tp=new char[12];
    ep2=new char [12];
	eplace=new char [12];
	tt=new char [12];
	strcpy(eplace,term());
	while(syn==13||syn==14){
		switch(syn){
		case 13:
			tt[c]='+';
			break;
		case 14:
			tt[c]='-';
			break;
		default:break;
		}
		scaner();
		strcpy(eplace,term());
		strcpy(tp,newterm());
		emit(tp,eplace,tt,ep2);
		strcpy(eplace,tp);
	}
	return eplace;
}
char *term(){

	char *tp,*ep2,*eplace,*tt;
	tp=new char [12];
	ep2=new char [12];
	eplace=new char [12];
	tt=new char [12];
	strcpy(eplace,term());
	while(syn==15||syn==16){
		switch(syn){
		case 15:
			tt[c]='*';
			break;
		case 16:
			tt[c]='/';
			break;
		default:break;
		}
		scaner();
		strcpy(eplace,term());
		strcpy(tp,newterm());
		emit(tp,eplace,tt,ep2);
		strcpy(eplace,tp);
	}
	return eplace;

}


char *factor(){
	char *fplace;
	fplace=new char [12];
	strcpy(fplace," ");
	if(syn==10){
		strcpy(fplace,token);
		scaner();
	}
	else if(syn==11){
		itoa(sum,fplace,10);
		scaner();
		fplace=expression();
		if(syn==28)
			scaner();
		else{cout<<"')'error!";
			kk=1;
			}
	}
	else{
		cout<<"'('error!";
	     kk=1;
	}
	return fplace;
}
char *newterm(void){
	char*p;
	char m[8];
	p=new char [8];
	k++;
	itoa(k,m,10);
	strcpy(p+1,m);
	p[0]='t';
	return p;
}
void emit(char*result,char*ag1,char*op,char*ag2){
	quad[t].result[0]=result;
	quad[t].ag1[0]=ag1;
	quad[t].op[0]=op;
	quad[t].ag2[0]=ag2;
	t++;
}
void main(){
	int i;
	p=0;
	cout<<"please input string:\n";
	cin.getline(prog,80);
	scaner();
	do{
		
		lrparser();
		factor();
	
	}while(kk!=1);
	for(i=0;i<=20;i++)
		cout<<"("<<quad[i].result<<","<<quad[i].op<<","<<quad[i].ag1<<","<<quad[i].ag2<<","<<endl;
}



		
	

		






	

⌨️ 快捷键说明

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