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

📄 cpp.cpp

📁 这是一个大学教学用的编绎程序,集语法分析和语法制导翻绎为一体,其中语法分析采用算符优先分析算法.
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
//#include "cpp1.cpp"
#include "sm.cpp"
//#define INT 6
void out(int p);
char check(char,char);
bool checkvt(char);
int newtemp();
void gen();
char s[100],b[20];
int s1[100],i=0,i1=0,c[20][4],E_place,q;
void main()
{
	char a;
	int j1,j2,j4=0;
	char Q;
	for(int k=0;k<20;k++)
	{
		name[k][0]='\0';
		const1[k][0]='\0';
	}
	q=1;
	s[q]='#';
	s1[q]=0;
	intput();
	j2=strlen(d);
	for(k=0;k<j2;k++)
	{
		switch(d[k]){
		case '+': if((d[k+1]=='*')||(d[k+1]=='+'))
				  {
					  cout<<"is not a sentence"<<endl<<"语法错误"<<endl;
					  cout<<"两个或两个以上运算符号连续出现"<<endl;
					  return;
				  }
				  if(d[k+1]=='#')
				  {
					  cout<<"is not a sentence"<<endl<<"语法错误"<<endl;
					  cout<<"两个或两个以上运算符号连续出现"<<endl;
					  return;
				  }
		case '*': if((d[k+1]=='+')||(d[k+1]=='*')&&(d[k+2]=='*'))
				  {
					  cout<<"is not a sentence"<<endl<<"语法错误"<<endl;
					  cout<<"两个或两个以上运算符号连续出现"<<endl;
					  return;
				  }
				  if((d[k+1]=='+')||(d[k+1]=='*')&&(d[k+2]=='*'))
				  {
					  cout<<"is not a sentence"<<endl<<"语法错误"<<endl;
					  cout<<"两个或两个以上运算符号连续出现"<<endl;
					  return;
				  }
		}
	}
	do
	{
		a=sm();
		while(a=='?')
			a=sm();
		if((strtoken[0]=='\0')||(a=='+')||(a=='^')||(a=='(')||(a==')')||(a=='*')){
			j4=j4;
		}
		else
			j4=entry();
		if(checkvt(s[q])) //s[q] in VT
			j1=q;
		else
			j1=q-1;
		while(check(s[j1],a)=='>')  //s[j1]>a
		{
			do
			{
				Q=s[j1];
				if(checkvt(s[j1-1]))  //s[j1-1] in VT
					j1=j1-1;
				else
					j1=j1-2;
			}while((check(s[j1],Q)=='>')||(check(s[j1],Q)=='='));  //s[j1]<Q
				//retract s[j+1]……s[q] to N

			if(q==j1+1)
			{
				q=j1+1;
				s[q]='N';
				s1[q]=j4;
			}
			else if(s[q]!=')')
			{
				E_place=newtemp();
				gen();
				s1[j1+1]=E_place;
				q=j1+1;
				s[q]='N';
			}
			else if(s[q]==')')
			{
				s1[j1+1]=s1[q-1];
				q=j1+1;
				s[q]='N';
			}
			for(int j3=1;j3<=q;j3++)
				cout<<s[j3];
			cout<<endl;
		}
			
		if((check(s[j1],a)=='<')||(check(s[j1],a)=='='))  
		{
			q=q+1;
			s[q]=a;
		}

		else{
			cout<<"Not a sentence"<<endl;
			cout<<s[j1]<<"与"<<a<<"没有优先关系"<<endl;
			return;
		}
		for(int j3=1;j3<=q;j3++)
				cout<<s[j3];
			cout<<endl;
	}while(a!='#');
	if((s[1]=='#')&&(s[2]=='N')&&(s[3]=='#'))
	{
		for(int i2=1;i2<=i1;i2++)
			cout<<"( "<<b[i2]<<" "<<c[i2][1]<<" "<<c[i2][2]<<" "<<c[i2][3]<<" )"<<endl;
		cout<<endl<<endl;
		cout<<"此输入串的语法制导翻译如下:"<<endl;
		for(i2=1;i2<=i1;i2++)
		{
			cout<<"( "<<b[i2]<<" ";
			if(c[i2][1]>=100)
				cout<<name[c[i2][1]-100]<<" ";
			else cout<<"T"<<c[i2][1]<<" ";
			if(c[i2][2]>=100)
				cout<<name[c[i2][2]-100]<<" ";
			else cout<<"T"<<c[i2][2]<<" ";
			if(c[i2][3]>=100)
				cout<<name[c[i2][3]-100]<<" )"<<endl;
			else cout<<"T"<<c[i2][3]<<" )"<<endl;
		}
		cout<<"Is a sentence"<<endl;
	}
	else cout<<"Not a sentence"<<endl;
}
void out(int p)
{

	cout<<'\t'<<p<<endl;
}
char check(char c,char d)
{
	switch(c)
	{
	case '+': if((d=='+')||(d==')')||(d=='#'))
				  return '>';
				else if((d=='*')||(d=='^')||(d=='i')||(d=='('))
					return '<';
	case '*': if((d=='+')||(d=='*')||(d==')')||(d=='#'))
				  return '>';
				else if((d=='^')||(d=='(')||(d=='i'))
				  return '<';
	case '^':if((d=='+')||(d=='*')||(d==')')||(d=='#'))
				  return '>';
				else if((d=='^')||(d=='(')||(d=='i'))
				  return '<';
	case 'i': if((d=='+')||(d=='*')||(d=='^')||(d==')')||(d=='#'))
				  return '>';
				else if((d=='(')||(d=='i'))
				  return '?';
	case '(': if(d==')')
				  return '=';
				else if((d=='+')||(d=='*')||(d=='^')||(d=='(')||(d=='i'))
				  return '<';
				else if(d=='#')
					return '?';
	case ')': if((d=='+')||(d=='*')||(d==')')||(d=='^')||(d=='#'))
				  return '>';
				else if((d=='i')||(d=='('))
				  return '?';
	case '#': if((d=='#'))
				  return '=';
				else if((d=='+')||(d=='*')||(d=='^')||(d=='(')||(d=='i'))
				  return '<';
				else if(d==')')
					return '?';
	default : return '?';
	}
	
}
bool checkvt(char e)
{
	switch(e){
	case '+': return 1;
	case '*': return 1;
	case '^': return 1;
	case 'i': return 1;
	case '(': return 1;
    case ')': return 1;
	case '#': return 1;
	default : return 0;
	}
}
int newtemp()
{
	i=i+1;
	return i;
}
void gen()
{
	i1=i1+1;
	b[i1]=s[q-1];
	c[i1][1]=s1[q-2];
	c[i1][2]=s1[q];
	c[i1][3]=E_place;
}








	

⌨️ 快捷键说明

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