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

📄 if-else.cpp

📁 if-else条件语句翻译程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include<iostream>
#include<fstream>
#include<string>
using namespace std;
#define stack_init_size 100
#define stackincrement 10

 struct stack_char      
{
	char * base;
	char *top;
	int stacksize;
};
struct stack_double      
{
	double * base;
	double *top;
	int stacksize;
};

bool initstack_char(stack_char &s);     
bool initstack_double(stack_double &s);
char gettop_char(stack_char &s);      
int gettop_double(stack_double &s);
bool push_char(stack_char &s,char e);   
bool push_double(stack_double &s,double e); 
bool pop_char(stack_char &s,char &e);   
bool pop_double(stack_double &s,double &e); 
void express(char  * &express);     
char get_char(char *e,int &p);    
bool fx(char * s);
void siyuanshi(char * s);
char precede(string a,string b); 
int lie(char c);
char divid(char * s,char ch) ;
char type (char * s,int &pos,string & str);
double convert(double s);
char convert2(int s);
void change(string &t,int n);
//----------------------------------------------------------------------------
int main ()
{
	char *s;bool b;
    express(s);
	b=fx(s);
	if(b==true)
	{
		siyuanshi(s);
	}
	return 1;
}
//----------------------------------------------------------------------------
bool fx(char * s)     //语法分析SLR(1)
{
	int i,j;
	string fenxi[31][19];    
              
fenxi[0][0]="s2";fenxi[0][18]="1";
fenxi[1][13]="acc";
fenxi[2][3]="s5";fenxi[2][8]="s6";fenxi[2][9]="s7";fenxi[2][14]="4";fenxi[2][15]="3";
fenxi[3][1]="s20";
fenxi[4][1]="r7";fenxi[4][5]="s11";fenxi[4][6]="s12";fenxi[4][7]="s13";fenxi[4][10]="r7";fenxi[4][12]="r7";
fenxi[4][16]="10";
fenxi[5][0]="r8";fenxi[5][1]="r8";fenxi[5][2]="r8";fenxi[5][3]="r8";fenxi[5][4]="r8";fenxi[5][5]="r8";fenxi[5][6]="r8";fenxi[5][7]="r8";fenxi[5][8]="r8";fenxi[5][9]="r8";fenxi[5][10]="r8";fenxi[5][11]="r8";fenxi[5][12]="r8";fenxi[5][13]="r8";
fenxi[6][0]="r9";fenxi[6][1]="r9";fenxi[6][2]="r9";fenxi[6][3]="r9";fenxi[6][4]="r9";fenxi[6][5]="r9";fenxi[6][6]="r9";fenxi[6][7]="r9";fenxi[6][8]="r9";fenxi[6][9]="r9";fenxi[6][10]="r9";fenxi[6][11]="r9";fenxi[6][12]="r9";fenxi[6][13]="r9";
fenxi[7][3]="s5";fenxi[7][8]="s6";fenxi[7][9]="s7";fenxi[7][14]="4";fenxi[7][15]="8";
fenxi[8][10]="s9";
fenxi[9][0]="r10";fenxi[9][1]="r10";fenxi[9][2]="r10";fenxi[9][3]="r10";fenxi[9][4]="r10";fenxi[9][5]="r10";fenxi[9][6]="r10";fenxi[9][7]="r10";fenxi[9][8]="r10";fenxi[9][9]="r10";fenxi[9][10]="r10";fenxi[9][11]="r10";fenxi[9][12]="r10";fenxi[9][13]="r10";
fenxi[10][0]="r3";fenxi[10][1]="r3";fenxi[10][2]="r3";fenxi[10][3]="r3";fenxi[10][4]="r3";fenxi[10][5]="r3";fenxi[10][6]="r3";fenxi[10][7]="r3";fenxi[10][8]="r3";fenxi[10][9]="r3";fenxi[10][10]="r3";fenxi[10][11]="r3";fenxi[10][12]="r3";fenxi[10][13]="r3";
fenxi[11][3]="s5";fenxi[11][8]="s6";fenxi[11][9]="s7";fenxi[11][14]="14";
fenxi[12][3]="s5";fenxi[12][8]="s6";fenxi[12][9]="s7";fenxi[12][14]="15";
fenxi[13][3]="s5";fenxi[13][8]="s6";fenxi[13][9]="s7";fenxi[13][14]="16";
fenxi[14][1]="r7";fenxi[14][5]="s11";fenxi[14][6]="s12";fenxi[14][7]="s13";fenxi[14][10]="r7";fenxi[14][12]="r7";fenxi[14][16]="17";
fenxi[15][1]="r7";fenxi[15][5]="s11";fenxi[15][6]="s12";fenxi[15][7]="s13";fenxi[15][10]="r7";fenxi[15][12]="r7";fenxi[15][16]="18";
fenxi[16][1]="r7";fenxi[16][5]="s11";fenxi[16][6]="s12";fenxi[16][7]="s13";fenxi[16][10]="r7";fenxi[16][12]="r7";fenxi[16][16]="19";
fenxi[17][0]="r4";fenxi[17][1]="r4";fenxi[17][2]="r4";fenxi[17][3]="r4";fenxi[17][4]="r4";fenxi[17][5]="r4";fenxi[17][6]="r4";fenxi[17][7]="r4";fenxi[17][8]="r4";fenxi[17][9]="r4";fenxi[17][10]="r4";fenxi[17][11]="r4";fenxi[17][12]="r4";fenxi[17][13]="r4";
fenxi[18][0]="r5";fenxi[18][1]="r5";fenxi[18][2]="r5";fenxi[18][3]="r5";fenxi[18][4]="r5";fenxi[18][5]="r5";fenxi[18][6]="r5";fenxi[18][7]="r5";fenxi[18][8]="r5";fenxi[18][9]="r5";fenxi[18][10]="r5";fenxi[18][11]="r5";fenxi[18][12]="r5";fenxi[18][13]="r5";
fenxi[19][0]="r6";fenxi[19][1]="r6";fenxi[19][2]="r6";fenxi[19][3]="r6";fenxi[19][4]="r6";fenxi[19][5]="r6";fenxi[19][6]="r6";fenxi[19][7]="r6";fenxi[19][8]="r6";fenxi[19][9]="r6";fenxi[19][10]="r6";fenxi[19][11]="r6";fenxi[19][12]="r6";fenxi[19][13]="r6";
fenxi[20][11]="s21";
fenxi[21][3]="s23";fenxi[21][17]="22";
fenxi[22][12]="s25";
fenxi[23][4]="s24";
fenxi[24][3]="s5";fenxi[24][8]="s6";fenxi[24][9]="s7";fenxi[24][14]="4";fenxi[24][15]="27";
fenxi[25][2]="s26";fenxi[26][11]="s28";
fenxi[27][0]="r2";fenxi[27][1]="r2";fenxi[27][2]="r2";fenxi[27][3]="r2";fenxi[27][4]="r2";fenxi[27][5]="r2";fenxi[27][6]="r2";fenxi[27][7]="r2";fenxi[27][8]="r2";fenxi[27][9]="r2";fenxi[27][10]="r2";fenxi[27][11]="r2";fenxi[27][12]="r2";fenxi[27][13]="r2";
fenxi[28][3]="s23";fenxi[28][17]="29";fenxi[29][12]="s30";
fenxi[30][0]="r1";fenxi[30][1]="r1";fenxi[30][2]="r1";fenxi[30][3]="r1";fenxi[30][4]="r1";fenxi[30][5]="r1";fenxi[30][6]="r1";fenxi[30][7]="r1";fenxi[30][8]="r1";fenxi[30][9]="r1";fenxi[30][10]="r1";fenxi[30][11]="r1";fenxi[30][12]="r1";fenxi[30][13]="r1";
     
	
	char ch,typ; int pos=0;
	int size;
	string st;

	//符号栈和状态栈的定义和初始化
    stack_char symbol;  initstack_char(symbol);      
	stack_double state;  initstack_double(state);     
	push_double(state,0); push_char(symbol,'#');

	ch=get_char(s,pos);
	while(ch=='\0')
	{ch=get_char(s,pos);} 
	pos--;
    while(ch!='#'||gettop_char(symbol)!='#')     
	{
		string str;     
		while(ch=='\0'){ch=get_char(s,pos);}
		typ=type(s,pos,str);
		i=gettop_double(state);   
		j=lie(typ);           
		st=fenxi[i][j];
		if(st=="acc"){cout<<"语法分析成功!"<<endl;return true;}   
		if(st=="") {cout<<"语法出现错误!"<<endl;return false;}              
        size=st.size(); 
		if(st[0]=='s')    
		{
			double change=0;int k;
			for(k=1;k<size;k++)     
			{
				change=change*10+convert(st[k]);
			}
			push_double(state,change);
			push_char(symbol,typ);
			ch=get_char(s,pos);
			pos--;
		}
		else if(st[0]=='r')     
		{
			double change=0;int k;double e;char z;
			for(k=1;k<size;k++)
			{
				change=change*10+convert(st[k]);
			}
			switch(int(change))          
			{
			case 1:
				for(k=0;k<10;k++)        
				{
					pop_char(symbol,z);//如果是r1,则将符号栈和状态栈的栈顶元素出栈
					pop_double(state,e);
				}
				push_char(symbol,'S');     
				if(str=="then"||str=="else"){
					pos=pos-4; 
				    ch=get_char(s,pos);	 
				}
				else
				{
					if(str==">="||str=="<="||str=="=="||str=="&&")
					{
						pos=pos-2;
						ch=get_char(s,pos);
					}
				}
				break;
			case 2:
				for(k=0;k<3;k++)        
				{
					pop_char(symbol,z);
					pop_double(state,e);
				}
				push_char(symbol,'T');     
				if(str=="then"||str=="else"){
					pos=pos-4; 
				    ch=get_char(s,pos);	 
				}
				else
				{
					if(str==">="||str=="<="||str=="=="||str=="&&")
					{
						pos=pos-2;
						ch=get_char(s,pos);
					}
				}
				break;
			case 3:
				for(k=0;k<2;k++)       
				{
					pop_char(symbol,z);
					pop_double(state,e);
				}
				push_char(symbol,'E');     
				if(str=="then"||str=="else"){
					pos=pos-4; 
				    ch=get_char(s,pos);	 
				}
				else
				{
					if(str==">="||str=="<="||str=="=="||str=="&&")
					{
						pos=pos-2;
						ch=get_char(s,pos);
					}
				}
				break;
			case 4:
			case 5:
			case 6:
				for(k=0;k<3;k++)       
				{
					pop_char(symbol,z);
					pop_double(state,e);
				}
				push_char(symbol,'K');     
				if(str=="then"||str=="else"){
					pos=pos-4; 
				    ch=get_char(s,pos);	 
				}
				else
				{
					if(str==">="||str=="<="||str=="=="||str=="&&")
					{
						pos=pos-2;
						ch=get_char(s,pos);
					}
				}
				break;
			case 7:
				push_char(symbol,'K'); 
				if(str=="then"||str=="else"){
					pos=pos-4; 
				    ch=get_char(s,pos);			    	 
				}
                else
				{
					if(str==">="||str=="<="||str=="=="||str=="&&")
					{
						pos=pos-2;
						ch=get_char(s,pos);
					}
				}
				break;
			case 8:
			case 9:
			     
					pop_char(symbol,z);
					pop_double(state,e);
			        
				push_char(symbol,'F');     
				if(str=="then"||str=="else"){
					pos=pos-4; 
				    ch=get_char(s,pos);	 
				}
				else
				{
					if(str==">="||str=="<="||str=="=="||str=="&&")
					{
						pos=pos-2;
						ch=get_char(s,pos);
					}
				}
				break;
			case 10:
				for(k=0;k<3;k++)       
				{
					pop_char(symbol,z);
					pop_double(state,e);
				}
				push_char(symbol,'F');     
				if(str=="then"||str=="else"){
					pos=pos-4; 
				    ch=get_char(s,pos);			    	 
				}
				else
				{
					if(str==">="||str=="<="||str=="=="||str=="&&")
					{
						pos=pos-2;
						ch=get_char(s,pos);
					}
				}
				break;
			}
			i=gettop_double(state);
			j=lie(gettop_char(symbol));
			string t;
			t=fenxi[i][j];	
			if(t==""){cout<<"语法错误!"<<endl;return false;}
			else
			{	double go=0;int siz;siz=t.size();
			    for(k=0;k<siz;k++)
				{
		    		go=go*10+convert(t[k]);
				}
				push_double(state,go);
			}
		
		pos--;
		}
	}
}


//-------------------------语义分析阶段---------------------------------------
void siyuanshi(char * s)//语义分析
{
	int pos=0;  
	char typ;  
	string str;    
	typ=type(s,pos,str);
    while(typ!='('){typ=type(s,pos,str);}       
	char pre;
	string t[20]; string biaozhi[20];string T[30];
	biaozhi[0]="(";int i=0;int j=1;int k=0;int go_num=100;
	str="";      
	typ=type(s,pos,str);
	while(typ!='t')
	{
		if(str!="&&" && str!="||" &&str!=")" && str!="(") 
		{
			while(str!="&&" && str!="||" &&str!=")" && str!="(")        
			{
			    t[i]=t[i]+str;
				str="";
                typ=type(s,pos,str);
			}
		    i++;
		}
		pre=precede(biaozhi[j-1],str);
		if(pre=='<')
		{
			biaozhi[j]=str;j++;
			str="";
			typ=type(s,pos,str);
		}
		else if(pre=='=')
		{
			biaozhi[j-1]="";j--;
			str="";
			typ=type(s,pos,str);
		}
		else if(pre=='>')
		{
			if(t[0]!="")
			{
				if(biaozhi[j-1]=="||")
				{
					if(t[i-2]!="T")
					{   string temp;
					    change(temp,go_num+3);
						change(T[k],go_num);go_num++;
			    	    T[k]=T[k]+" if "+t[i-2]+" goto "+temp;
			            k++;
					}
					if(t[i-1]!="T")
					{
						string temp;
					    change(temp,go_num+2);
						change(T[k],go_num);go_num++;
		        	    T[k]=T[k]+" if "+t[i-1]+" goto "+temp;
			    	    k++;
					}
					change(T[k],go_num);go_num++;
					T[k]=T[k]+" goto ";
			    	k++;
				}
		    	else if(biaozhi[j-1]=="&&")
				{
					if(t[i-2]!="T")
					{
						string temp;
					    change(temp,go_num+2);
						change(T[k],go_num);go_num++;
			    	    T[k]=T[k]+" if "+t[i-2]+" goto "+temp;
			            k++;
						string temp1;
					    change(temp1,go_num+3);
						change(T[k],go_num);go_num++;
			    	    T[k]=T[k]+" goto "+temp1;
			    	    k++;
					}
					if(t[i-1]!="T")
					{

					    change(T[k],go_num);go_num++;
		        	    T[k]=T[k]+" if "+t[i-1]+" goto ";
			    	    k++;
				    	change(T[k],go_num);go_num++;
					    T[k]=T[k]+" goto ";
			    	    k++;
					}
				}
		    	t[i-1]="";t[i-2]="T";i=i-1;
		    	biaozhi[j-1]="";j--;
			}
			else
			{
				biaozhi[j-1]="";j--;
			}
		}
	}
	if(t[0]!=""&&t[0]!="T")
	{
		change(T[k],go_num);go_num++;
	    T[k]=T[k]+" if "+t[0]+" goto L1";
	    k++;
		change(T[k],go_num);go_num++;
	    T[k]=T[k]+" goto L2";
	    k++;
	}
	typ=type(s,pos,str);
	str="";
	typ=type(s,pos,str);

⌨️ 快捷键说明

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