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

📄 e.cpp

📁 1) 写出符合算符优先法的文法及属性文法。 2) 完成题目要求的中间代码三地址表示的描述。 3) 写出算符优先法的思想
💻 CPP
字号:
#include <iostream>
#include <string.h>
using namespace std;
class word{
public:
	int k;
	char val[8];
};
int jis=0;
int letter(char* ple){
	if(((*ple>='a')&&(*ple<='z'))||((*ple>='A')&&(*ple<='Z')))return 1;
	return 0;
}
int digit(char* ple){
	if((*ple>=48)&&(*ple<=57))return 1;
	return 0;
}
char* concat(char* plw,char c){
	*plw=c;	plw++;return plw;
}
char* wordaly(char* ple,char* plw,word* pws){
	if(letter(ple)){
		char fi[3]="if";
		char el[5]="else";
		char th[5]="then";
		while(letter(ple)||digit(ple)){
			plw=concat(plw,*ple);ple++;}
		*plw=char(0);
		if(!strcmp(fi,pws->val))pws->k=1;
		else if(!strcmp(th,pws->val))pws->k=2;
		else if(!strcmp(el,pws->val))pws->k=3;
		else pws->k=4;
		return ple;
	}
	else if(digit(ple)){
		while(digit(ple)){
			plw=concat(plw,*ple++);
		}
		pws->k=5;
		*plw=char(0);
		return ple;
	}
	else if(*ple=='('){
		pws->k=6;
		strcpy(pws->val,"(\0");
		ple++;
		return ple;
	}
	else if(*ple==')'){
		pws->k=7;
		strcpy(pws->val,")\0");
		ple++;
		return ple;
	}
	else if(*ple=='='){
		pws->k=14;
		strcpy(pws->val,"=\0");
		ple++;
		return ple;
	}
	else if(*ple=='<'){
		plw=concat(plw,*ple);
		if((*++ple)=='='){
			plw=concat(plw,*ple);
			pws->k=9;
			ple++;
		}
		else pws->k=8;
		*plw=char(0);
		return ple;
	}
	else if(*ple=='>'){
		plw=concat(plw,*ple);
		if((*++ple)=='='){
			plw=concat(plw,*ple);
			pws->k=11;
			ple++;
		}
		else pws->k=10;
		*plw=char(0);
		return ple;
	}
	else if(*ple=='+'){
		plw=concat(plw,*ple);
		if((*++ple)=='+'){
			plw=concat(plw,*ple);
			pws->k=13;
			ple++;
		}
		else pws->k=12;
		*plw=char(0);
		return ple;
	}
	else if(*ple=='{'){
		pws->k=15;
		strcpy(pws->val,"{\0");
		ple++;
		return ple;
	}
	else if(*ple=='}'){
		pws->k=16;
		strcpy(pws->val,"}\0");
		ple++;
		return ple;
	}
	else {cout<<"词法分析错,非法定字符: "<<*ple++<<endl;return ple;}
}
void pword(word w[]){
	for(int t=0;t<20;t++){
			cout<<w[t].k<<","<<w[t].val<<endl;
		if(w[t].val[0]=='#')break;
	}
}
//以上为词法分析所定义的函数
void pri(int a[][17]){
	for(int i1=0;i1<17;i1++)
		for(int i2=0;i2<17;i2++)
			a[i1][i2]=2;
	a[16][3]=a[1][6]=a[2][15]=a[3][15]=a[4][13]=a[4][14]=a[6][7]=a[7][2]=a[13][4]=a[14][12]=a[15][16]=0;
	a[4][16]=a[5][16]=a[11][7]=a[8][7]=a[9][7]=a[10][7]=a[13][16]=a[12][16]=a[16][0]=1;
	a[6][5]=a[6][4]=a[6][11]=a[6][8]=a[6][9]=a[6][10]=a[14][5]=a[14][4]=a[15][4]=a[15][13]=a[0][1]=-1;
	for(i1=4;i1<6;i1++)
		for(int i2=7;i2<13;i2++)
			a[i1][i2]=1;
	for(i1=8;i1<13;i1++)
		for(int i2=4;i2<6;i2++)
			a[i1][i2]=-1;
}
void gram(int gra[][13]){
	for(int g=0;g<11;g++)
		for(int a=0;a<8;a++)
			gra[g][a]=0;
	gra[1][0]=17;gra[1][1]=1;gra[1][2]=6;gra[1][3]=7;gra[1][4]=2;gra[1][5]=15;gra[1][6]=16;
	gra[1][7]=15;gra[1][8]=16;
	gra[2][0]=18;gra[2][1]=8;
	gra[3][0]=18;gra[3][1]=9;
	gra[4][0]=18;gra[4][1]=10;
	gra[5][0]=18;gra[5][1]=11;
	gra[6][0]=20;gra[6][1]=4;
	gra[7][0]=20;gra[7][1]=5;	
	gra[8][0]=19;gra[8][1]=4;gra[8][2]=14;gra[8][3]=12;
	gra[9][0]=19;gra[9][1]=4;gra[9][2]=13;
	gra[10][0]=19;gra[10][1]=13;gra[10][2]=4;	
}
void op4(int i,word* tp){
	if((i==2)||(i==3)||(i==4)||(i==5)){
		cout<<"if "<<(tp-2)->val<<(tp-1)->val<<tp->val<<" goto L0"<<endl;
		cout<<"goto L1"<<endl;
	}
	else if(i==8){
		cout<<"L"<<jis<<" T1="<<tp->val<<(tp+1)->val<<(tp+2)->val<<endl;
		cout<<(tp-2)->val<<"=T1"<<endl;jis++;
	}
	else if(i==9){
		cout<<"L"<<jis<<" "<<tp->val<<(tp+1)->val<<endl;jis++;
	}
	else if(i==10){
        cout<<"L"<<jis<<" "<<(tp+1)->val<<tp->val<<endl;
	}
}
void cpu(word* tp,word* pws,int* sta,int pr[][17],int gra[][13]){
	int* ste;int i,j,jug=0;
	while(pws->val[0]!='#'){
		if((pws->k<=20)&&(pws->k>=17))pws++;
		else if(pr[*sta][pws->k]<=0){
			if((pws->k<=16)&&(pws->k>=1))*++sta=pws->k;
			pws++; jug=1;
		}
		else if(pr[*sta][pws->k]==1){
			ste=sta;
			if(jug!=2)tp=(pws-1);
			jug=2;
			while(pr[*(ste-1)][*ste]==0){ste--;tp--;}
			for(i=1;i<11;i++){
				for(j=1;ste<=sta;ste++,j++){
					if(*ste!=gra[i][j])break;
				}
				if(ste>sta){
					while(pr[*(sta-1)][*sta]==0){sta--;}sta--;
					op4(i,tp);
					break;
				}
				else ste=ste-j+1;
			}
		}
		if((*sta==16)&&(*(sta-1)==20))break;
		if(pr[*sta][pws->k]==2){cout<<*sta<<","<<pws->val<<"语法分析出错!"<<endl;pws++;}
	}
	if((*sta==16)&&(*(sta-1)==20))cout<<endl<<"语法分析成功完成!三地址代码已输出"<<endl;
	else cout<<endl;
}

int main(){
	word words[20];
	char s[50];
	char* ps;
	char* pw;
	word* pws;
	word* tp;
	int i=0;
	ps=s;
	gets(s);cout<<endl;
	while((*ps==' ')||(*ps=='\n')||(*ps=='	'))ps++;
	while(int(*ps)!=0){
		pws=&words[i];
		pw=pws->val;
		while((*ps==' ')||(*ps=='\n')||(*ps=='	'))ps++;
		ps=wordaly(ps,pw,pws);
		i++;
	}words[i].k=21;strcpy(words[i].val,"#\0");
//	pword(words);//是否需要打印词法分析结果
//以上为主程序词法分析部分
	int pr[17][17];pri(pr);
	int gra[11][13];	gram(gra);
	int stk[10];stk[0]=0;
	int* sta;sta=stk;
	pws=words;	tp=pws;
	cpu(tp,pws,sta,pr,gra);
	return 0;
}

⌨️ 快捷键说明

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