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

📄 exprtran.c

📁 编译原理中的语义实现中的算术表达式的属性翻译
💻 C
字号:
//本程序将简单中缀算术表达式翻译成四元式,表达式中只有+和*运算符
#include "stdio.h"
#include "ctype.h"
char ch;
int T(int *p);
int F(int *p);
int E1(int p,int *t);
int T1(int p,int *t);
int NEWT()//返回一个临时变量,顺序产生A、B、...、Z,最多产生26个临时变量
{ static int i=64;//设置i为静态变量,确保下次调用时i为上次调用的结果
  i=i+1;
  return(i);
}
//产生式E↑t→T↑pE'↓p的翻译子程序,t为综合属性,形参用指针变量
int E(int *t)   
{  int es=0;
   int p;
   es=T(&p);//调分析T子程序
   es=E1(p,t);//调分析E1子程序  
   return(es);
}
//产生式E'↓p↑t→+T↑r @ADD↓p,r,t E'↓p↑t 和E'↓p↑t→ε翻译子程序
//p为继承属性,形参用整型变量,t为综合属性,形参用指针变量
int E1(int p,int *t)  
{	int r,es,t0;
	if (ch=='+')
	{  ch=getchar();
       es=T(&r);
       t0=NEWT();//产生一个临时变量
	   printf("      ADD %c,%c,%c\n",p,r,t0);
	   es=E1(t0,t);
	   return(es);
    }  else 
	{	*t=p;
		return(0);
	}
}
//产生式T↑p→F↑pT'↓p的翻译子程序,t为综合属性,形参用指针变量
int T(int *t)   
{  int es=0,p;
   es=F(&p);//调分析F子程序
   es=T1(p,t);//调分析T1子程序
   return(es);
}
//产生式T'↓p↑t→*F↑r @MULT↓p,r,t T' 和T'↓p↑t→ε翻译子程序
//p为继承属性,形参用整型变量,t为综合属性,形参用指针变量
int T1(int p,int *t)   
{
	int r,es,t0;
	if (ch=='*')
	{  ch=getchar();
       es=F(&r);
	   t0=NEWT();//产生一个临时变量
       printf("      MULT %c,%c,%c\n",p,r,t0);
	   es=T1(t0,t);
	   return(es);
    }  else 
	{	*t=p;
		return(0);
	}
}
//产生式F↑p ->(E↑p) |ID↑p的翻译子程序,p为综合属性,形参用指针变量
int F(int *p)//分析F子程序
{  int es=0;
   if (ch=='(')
   {
      ch=getchar();
      es=E(p);//调分析E子程序
      if (ch!=')') return(3);
      else {ch=getchar();return(es);}
   } else
   {
	if (isalpha(ch)) //判断是否为字母
	{   *p=ch;
	    ch=getchar();
		return(es);
	} else return(4);
   }
}
//主程序
main()
{
	int es=0,t;
    printf("请输入算术表达式(操作数只能是单个字母):");
	ch=getchar();
	printf("输出四元式为:\n");
	es=E(&t);//调分析表达式E的翻译程序
	if (es==0) printf("\n翻译成功!\n");
	else printf("\n表达式有语法错误!\n");
}


⌨️ 快捷键说明

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