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

📄 if-else.cpp

📁 if-else条件语句翻译程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	string jiegou=str;
    while(typ!='='){typ=type(s,pos,str);}   
	string shu[10];string fuhao[10];fuhao[0]="}";
	int n=0;int m=1;int jishu=1;
	T[k]=" L1: ";
	str="";      
	typ=type(s,pos,str);
	while(typ!='e'||fuhao[0]!="")
	{
		if(str!="+" && str!="-" &&str!=")" && str!="(" &&str!="*" &&str!="/"&&str!="}") 
		{
			shu[n]=shu[n]+str;
			str="";typ=type(s,pos,str);
			n++;
		}
		pre=precede(fuhao[m-1],str);
		if(pre=='<')
		{
			fuhao[m]=str;m++;
			str="";
			typ=type(s,pos,str);
		}
		else if(pre=='=')
		{
			fuhao[m-1]="";m--;
			str="";
			typ=type(s,pos,str);
		}
		else if(pre=='>')
		{
		
				change(T[k],go_num);go_num++;
				T[k]=T[k]+" T";
				char c; c=jishu-0+'0';jishu++;
			   	T[k]=T[k]+c+"="+shu[n-2]+fuhao[m-1]+shu[n-1];
			    k++;
				fuhao[m-1]="";m--;
				shu[n-1]="";					
				shu[n-2]="";
				shu[n-2]="T";shu[n-2]+=c;
				n--;
		}
	}
	change(T[k],go_num);go_num++;
	T[k]=T[k]+" "+jiegou+"="+shu[0];
    k++;
	
    typ=type(s,pos,str);      
	str="";
	typ=type(s,pos,str);   
	string jiegou1=str;
    while(typ!='='){typ=type(s,pos,str);}  
	string shu1[10];string fuhao1[10];fuhao1[0]="}";
	int n1=0;int m1=1;
	T[k]=" L2: ";
	str="";     
	typ=type(s,pos,str);
	while(typ!='#'||fuhao1[0]!="")
	{
		if(str!="+" && str!="-" &&str!=")" && str!="(" &&str!="*" &&str!="/"&&str!="}") 
		{
			shu1[n1]=shu1[n1]+str;
			str="";typ=type(s,pos,str);
			n1++;
		}
		pre=precede(fuhao1[m1-1],str);
		if(pre=='<')
		{
			fuhao1[m1]=str;m1++;
			str="";
			typ=type(s,pos,str);
		}
		else if(pre=='=')
		{
			fuhao1[m1-1]="";m1--;
			str="";
			typ=type(s,pos,str);
		}
		else if(pre=='>')
		{
		
				change(T[k],go_num);go_num++;
				T[k]=T[k]+" T";
				char c; c=jishu-0+'0';jishu++;
			   	T[k]=T[k]+c+"="+shu1[n1-2]+fuhao1[m1-1]+shu1[n1-1];
			    k++;
				fuhao1[m1-1]="";m1--;
				shu1[n1-1]="";					
				shu1[n1-2]="";
				shu1[n1-2]="T";shu1[n1-2]+=c;
				n1--;
		}
	}
	change(T[k],go_num);go_num++;
	T[k]=T[k]+" "+jiegou1+"="+shu1[0];
    k++;

	for(int z=0;z<k;z++)
	{
		cout<<T[z]<<endl;
	}
	cout<<100+k<<" end"<<endl;
	
}




//----------------------------------------------------------------------------------
//相关函数
void express(char  * &express)     
{
	express=new char[52];
	ifstream fin("ifelse.txt");
	fin.getline(express, 51);
	fin.close();
	cout<<"输入的if-else语句:"<<endl;
	cout<<express<<endl;
//	cout<<"请输入表达式(限50个字符以内)"<<endl;
//	cout<<"当输入#时为结束"<<endl;	
//	cin>>express;
}

char get_char(char *e,int &p)    
{
	char a=e[p];
	p++;             
	return a;
}
char precede(string a,string b)   //操作符优先级的判断
{
	if(a=="+")
	{
		if(b=="*"||b=="/"|| b=="(")return '<';
		else return '>';
	}
	if(a=="-")
	{
		if(b=="*"||b=="/"||b=="(")return '<';
		else return '>';
	}
	if(a=="*")
	{
		if(b=="(")return '<';
		else return '>';
	}
	if(a=="/")
	{
		if(b=="(")return '<';
		else return '>';
	}
	if(a=="(")
	{
		if(b==")")return '=';
		else if(b=="}"||b=="then")return '0';
		else return '<';
	}
	if(a==")")
	{
		if(b=="(")return '0';
		else return '>';
	}
	if(a=="}")
	{
		if(b==")"||b=="then")return '0';
		else if(b=="}")return '=';
		else return '<';
	}
	if(a=="&&")
	{
		if(b==")"||b=="}"|| b=="&&" ||b=="||"  ||b=="then")return '>';
		else return '<';
	}
	if(a=="||")
	{
		if(b==")"|| b=="}" ||b=="||"||b=="then")return '>';
		else return '<';
	}
	
	if(a=="then")
	{
		if(b==")"||b=="}")return '0';
		else if(b=="then")return '=';
		else return '<';
	}
	return '0';
}



int  lie(char c)       //分析表的列
{
	switch(c)
	{
	case 'i':return 0;
	case 't':return 1;
	case 'e':return 2;
	case 'f':return 3;
	case '=':return 4;
	case '+':return 5;
	case '*':return 6;
	case '&':return 7;
	case 'n':return 8;
	case '(':return 9;
	case ')':return 10;
	case '{':return 11;
	case '}':return 12;
	case '#':return 13;
	case 'F':return 14;
	case 'E':return 15;
	case 'K':return 16;
	case 'T':return 17;
	case 'S':return 18;
	}
}
//-------------词法分析阶段------------------------
char divid(char * s,char ch)   //界符的判断 
{
	
	char div[18]={'{','}','[',']','(',')',';','>','<','=','|','+','*','-','/','!','&','#'};  
    int i;
	for(i=0;i<18;i++)
	{
		if(ch==div[i])return 'd';     
	}
	return 'z';       
}
char type (char * s,int &pos,string & str) //将输入的字符串转换成为相应的字符
{                                                            
	
	char ch=get_char(s,pos);
	string keyword[10]={"int","char","if","then","else","bool","while","do","true","false"};  
	if(ch=='('){str+='('; return '(';}
	if(ch==')'){str+=')'; return ')';}
	if(ch=='#'){str+='#'; return '#';}
	if(ch=='{'){str+='{'; return '{';}
	if(ch=='}'){str+='}'; return '}';}

	if(ch=='+'){str+='+'; return '+';}   
	if(ch=='-'){str+='-'; return '+';}
	if(ch=='*'){str+='*'; return '*';}   
	if(ch=='/'){str+='/'; return '*';}
	if(ch=='<')
	{
		if(get_char(s,pos)=='='){str=str+'<'; str=str+'='; return '&';}
		else{pos--;str+='<'; return '&';}
	}
	if(ch=='>')
	{
		if(get_char(s,pos)=='='){str=str+'>';str=str+'='; return '&';}
		else{pos--;str+='>';return '&';}
	}
	if(ch=='|')
	{
		if(get_char(s,pos)=='|'){str=str+'|';str=str+'|'; return '&';}
		else{pos--;str+='|';return '&';}
	}
	if(ch=='&')
	{
		if(get_char(s,pos)=='&'){str=str+'&';str=str+'&'; return '&';}
		else{pos--;str+='&';return '&';}
	}
	if(ch=='=')
	{
		if(get_char(s,pos)=='='){str=str+'=';str=str+'='; return '&';}
		else{pos--;str+='=';return '=';}
	}
 
	char c=divid(s,ch);
	int i;
	if((ch>='a'&& ch<='z')||(ch>='A'&&ch<='Z'))   
	{	c=divid(s,ch); 	
		while(ch!='\0'&& c=='z')   //如果不是空字符
		{
			str=str+ch;     
			ch=get_char(s,pos);c=divid(s,ch); 
		}
		pos--;
		if(str=="if")return 'i';    
			else if(str=="then")return 't';   
			else if(str=="else")return 'e';
		for(i=0;i<10;i++)
		{	
			if(str.compare(keyword[i])==0)return 'k';   //和关键字进行比较
		}
		return 'f';   
	}

	
	if(ch>='0'&&ch<='9')   //对数字进行组合
	{
		
	    while(ch>='0' && ch<='9')
		{	str=str+ch;
	    	ch=get_char(s,pos);
		}
	    if(ch=='.')      //浮点数的操作
		{   str=str+ch;
	    	ch=get_char(s,i);
	    	while(ch>='0' && ch<='9')
			{	
		    	str=str+ch;
			    ch=get_char(s,pos);
			}
		}
		pos--;
		return 'n';      
	}
}

double convert(double s)    
{
	char c,t;
	c=(char)s;
	t='0';
	return c-t;
}
char convert2(int s)    
{
	char t;	
	t=s-0+'0';
	return t;
}
void change(string &t,int n)  //生成操作下标
{int k=10;int d;
	while(n!=0)
	{
		d=n%k;
		t=convert2(d)+t;
		n=n/10;
	}
}


//---------------栈的相关操作------------------------
bool initstack_char(stack_char &s)  //初始化栈
{
	s.base =(char *)malloc(stack_init_size * sizeof(char));
	if(!s.base )return false;
	s.top =s.base ;
	s.stacksize =stack_init_size;
	return true;
}
bool initstack_double(stack_double &s) 
{
	s.base =(double *)malloc(stack_init_size * sizeof(double));
	if(!s.base )return false;
	s.top =s.base ;
	s.stacksize =stack_init_size;
	return true;
}
char gettop_char(stack_char &s)   //获得栈顶元素
{   
        char e;
	if(s.top ==s.base )return 0;
	e=*(s.top -1);
	return e;
}
int  gettop_double(stack_double &s)  
{   
        int e;
	if(s.top ==s.base )return 0;
	e=int(*(s.top -1));
	return e;
}
bool push_char(stack_char &s,char e)    //元素进栈
{
	
	if(s.top -s.base >=s.stacksize )
	{
		s.base =(char *)realloc (s.base ,(s.stacksize + stackincrement) * sizeof(char));
		if(!s.base )return false;
		s.top =s.base +s.stacksize ;
		s.stacksize =s.stacksize +stackincrement;
	}
	*( s.top )++=e;
	return false;
}
bool push_double(stack_double &s,double e)    
{	
	if(s.top -s.base >=s.stacksize )
	{
		s.base =(double *)realloc (s.base ,(s.stacksize + stackincrement) * sizeof(double));
		if(!s.base )return false;
		s.top =s.base +s.stacksize ;
		s.stacksize =s.stacksize +stackincrement;
	}
	*( s.top )++=e;
	return false;
}
bool pop_char(stack_char &s,char &e)//通过判断栈顶和栈底元素来进行出栈操作,出栈后用e返回指向栈顶的指针
{
	
	if(s.top ==s.base )return false;
	e= * --s.top ;
	return true;
}
bool pop_double(stack_double &s,double &e)   
{
	
	if(s.top ==s.base )return false;
	e= * --s.top ;
	return true;
}



⌨️ 快捷键说明

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