📄 4元组.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 + -