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

📄 4元组.cpp

📁 编译的中间代码生成
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define al 1

void factor();		//F → P F1
void factor_1();    //F1 → ^F F1 |  ε
void power();		//P → n|(E)
void term_1();		//T1 → *T T1 | /T T1 | ε
void term();		//T → F T1
void expr_1();
void expr();
void statement();
void gen();
void newTemp();


// 定义全局数据结构用于计算
char *p;            
struct ParseStack
{
    char  str[al+1] ; 
    int   sym ;
}stack[100];       // 栈变量
int  top=0 ; 
char tempVar[2];
char tempIndex='1';

void  newTemp() 
{
	tempVar[0]='t';
	tempVar[1]=tempIndex;
    tempIndex++ ;
}

void gen(char p,int stact1,int stact2,char temp[])
{
	if(stack[stact2].str[0]=='t' && stack[stact1].str[0]!='t')
		cout<<"("<<p<<","<<stack[stact1].sym<<","<<stack[stact2].str<<","<<temp<<")"<<endl;
	else if(stack[stact1].str[0]=='t' && stack[stact2].str[0]!='t')
		cout<<"("<<p<<","<<stack[stact1].str<<","<<stack[stact2].sym<<","<<temp<<")"<<endl;
	else if(stack[stact1].str[0]=='t' && stack[stact2].str[0]=='t')
		cout<<"("<<p<<","<<stack[stact1].str<<","<<stack[stact2].str<<","<<temp<<")"<<endl;
	else
		cout<<"("<<p<<","<<stack[stact1].sym<<","<<stack[stact2].sym<<","<<temp<<")"<<endl;
}

void expr()    //  E → T E1
{
	term();
	expr_1();

}

void error()   // error
{
	printf("error!!!\n");
}
	
int getsym()   // 读取数字
{
	int num;
	if( *p<='9' && *p>='0' )
	{	// 整常数的处理
		num=0; 
		do{
			num=10 * num + *p - '0' ;
			p++;
		}while( *p<='9' && *p>='0' ) ;
	}
	return num;
}

void power()		  //P → n|(E)
{
	
	if( *p<='9' && *p>='0' )
	{
		int num=0;
		//读入的数压入栈中
		num=getsym();
		stack[top++].sym=num;
	}
	else if(*p == '(')
		{
			p++;
			expr();
			if(*p != ')' ) 
				error();
				p++;
		}
		else error();
	
}

void factor()		  //F → P F1
{
	power();
	factor_1();
}

void factor_1()       //F1 → ^F F1 |  ε
{
	if( *p== '^' )
	{
		p++;
		factor();
		newTemp() ;    // 生成新的临时变量名 
		gen( '^',  top-2, top-1,tempVar ) ;
		strcpy(stack[top-2].str,tempVar);
		top-- ;   // 调整栈指针
		factor_1();
	}	
}

void term_1()		//T1 → *T T1 | /T T1 | ε
{
	if(*p=='*' )
	{
		p++;
		term() ;
		newTemp() ;    // 生成新的临时变量名 
		gen( '*',  top-2, top-1,tempVar ) ;
		strcpy(stack[top-2].str,tempVar);
		top-- ;   // 调整栈指针
		expr_1() ;
	}
    else  if( *p=='/' )
		{
			p++;
			term() ;
			newTemp() ;    // 生成新的临时变量名 
			gen( '/',  top-2, top-1,tempVar ) ;
			strcpy(stack[top-2].str,tempVar);
			top-- ;   // 调整栈指针
			expr_1() ;
		}

}

void term()		//T → F T1
{
	factor();
	term_1();

}

void expr_1()
{
	if(*p=='+' )
	{
		p++;
		term() ;
		newTemp() ;    // 生成新的临时变量名  
		gen( '+', top-2 , top-1 , tempVar ) ; 
		strcpy(stack[top-2].str,tempVar);
		top-- ;   // 调整栈指针
		expr_1() ;
	}
    else  if( *p=='-' )
		{
			p++;
			term() ;
			newTemp() ;    // 生成新的临时变量名 
			gen( '-',  top-2, top-1,tempVar ) ;
			strcpy(stack[top-2].str,tempVar);
			top-- ;   // 调整栈指针
			expr_1() ;
		}

}

void statement()
{
	expr();
}

void main()
{
  
	p=(char *)malloc(100*sizeof(char));
	printf("输入表达式:\n");
	cin>>p;
	statement();
}

⌨️ 快捷键说明

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