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

📄 siyuanshi.cpp

📁 编译原理 的赋值语句翻译
💻 CPP
字号:
/*
表达式生成四元式
算符优先方法
*/

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include      <iostream.h>
#include      <stdlib.h>

#define    STACK_INIT_SIZE    50
#define    STACKINCREMENT    5
#define    ERROR      0
#define    OVERFLOW     -2
#define    TRUE      1
#define    FALSE      0
#define    OK       1
#define    NULL      0



void GEQ();
void PRINT();
int check(char S,char C);
int change(char m);

typedef struct Stack
{
char *base;
char *top;
int stacksize;
}Stack;
int relation[8][8]={    {2,2,-2,-2,-2,-2,2,2},
         {2,2,-2,-2,-2,-2,2,2},
         {2,2,2,2,-2,-2,2,2},
         {2,2,2,2,-2,-2,2,2},
         {2,2,2,2,-1,-1,2,2},
         {-2,-2,-2,-2,-2,-2,0,2},
         {2,2,2,2,-1,-1,2,2},
         {-2,-2,-2,-2,-2,-2,-2,1}
         };
// <@-2  error@-1   =@0     >@2   OK@1
int     num=0;
char    QT[10][4],T='A',c;
struct Stack SEM,SYN;

struct InitStack(Stack s)
{
s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s.base)
    exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
//初始化堆栈
char GetTop(Stack &s)
{
char e;
if(s.top==s.base)
return ERROR;
e=*(s.top-1);
return e;
}
//取栈顶元素
char Pop(Stack &s)
{
char e;
if(s.top==s.base) 
    {printf("栈中已无元素!");
     exit(ERROR);
    }
e=*--s.top;
return e;
}
//出栈
struct Push(Stack &s,char e)
{
if(s.top-s.base>=s.stacksize) 
{
    s.base=(char *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(char));
    if(!s.base)
     exit(OVERFLOW);
    s.top=s.base+s.stacksize;
    s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
//入栈

void main()
{
int G;
InitStack(SEM);
InitStack(SYN);
printf("----表达式应由小写字母、运算符及小括号组成,并以\"#\"结束----\n");
printf("请输入表达式:");
Push(SYN,'#');
c=getchar();
while((G=check(GetTop(SYN),c))!=-1&&G!=1)
{
    if(G==-2)
     Push(SYN,c);
    else if(G==2)
    {
     if(GetTop(SYN)<='z'&&GetTop(SYN)>='a')
     {
      Push(SEM,Pop(SYN));
      continue;
     }
     else
     {
      GEQ();
      continue;
     }
    }
    else
     Pop(SYN);//    =
    c=getchar();
}
if(G==-1)
    printf("您的输入有误!");
else
    PRINT();
getchar();
}

int check(char S,char C)
{
return relation[change(S)][change(C)];
}

int change(char m)
{
switch(m)
{
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '/': return 3;
case '(': return 5;
case ')': return 6;
case '#': return 7;
default: return 4;
}
}

void GEQ()
{
QT[num][0]=Pop(SYN);
QT[num][2]=Pop(SEM);
QT[num][1]=Pop(SEM);
QT[num][3]=T;
Push(SEM,T);
num++;
T++;
}

void PRINT()
{
printf("您输入的表达式所对应的四元式为:\n");
for(int i=0;i<num;i++)
{
    printf("(");
    printf("%c",QT[i][0]);
    if(QT[i][1]<='Z'&&QT[i][1]>='A')
     printf("\t%c%d",'t',QT[i][1]-'A'+1);
    else
     printf("\t%c",QT[i][1]);
    if(QT[i][2]<='Z'&&QT[i][1]>='A')
     printf("\t%c%d",'t',QT[i][2]-'A'+1);
    else
     printf("\t%c",QT[i][2]);
    if(QT[i][3]<='Z'&&QT[i][1]>='A')
     printf("\t%c%d",'t',QT[i][3]-'A'+1);
    else
     printf("\t%c",QT[i][3]);
    printf(")\n");
}
}

⌨️ 快捷键说明

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