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

📄 exprtran.c

📁 一个改进的递归下降分析程序
💻 C
字号:
//本程序将简单中缀算术表达式翻译成四元式,表达式中只有+和*运算符
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"

char ch;
int k;

int T(char *p);
int F(char *p);
int E1(char p[10],char *t);
int T1(char p[10],char *t);


char *NEWT()
{
char *p;
char m[8];
p=(char*)malloc(8);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]='T';
return(p);
}


//产生式E↑t→T↑pE'↓p的翻译子程序,t为综合属性,形参用指针变量
int E(char *t)   
{  int es=0;
   char p[10]={" "};
   es=T(p);//调分析T子程序
//   printf("E中 %s\n",p);
   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(char p[10],char *t)  
{	int es;
	char ch1;
	char r[10]={" "},t0[10]={" "};
//	printf("xym  E1 %s\n",p);
    if (ch=='+'||ch=='-')
	{   ch1=ch;
		ch=getchar();
        es=T(r);
        strcpy(t0,NEWT());//产生一个临时变量
	    if(ch1=='+') 
		printf("      ADD %s,%s,%s\n",p,r,t0);
	    else
        printf("      SUB %s,%s,%s\n",p,r,t0);
		es=E1(t0,t);
	   return(es);
    }  else 
	{
		strcpy(t,p);
		return(0);
	}
}

//产生式T↑p→F↑pT'↓p的翻译子程序,t为综合属性,形参用指针变量
int T(char *t)   
{  int es=0;
   char p[10]={" "};
   es=F(p);//调分析F子程序
//   printf("T中 %s\n",p);
   es=T1(p,t);//调分析T1子程序
   return(es);
}

//T'=>*FT'|ε
//产生式T'↓p↑t→*F↑r @MULT↓p,r,t T' 和T'↓p↑t→ε翻译子程序
//p为继承属性,形参用整型变量,t为综合属性,形参用指针变量
int T1(char p[10],char *t)   
{   int es; 
char r[10]={" "},t0[10]={" "};
	char ch2;
//	printf("xym  T1 %s\n",p);
	if (ch=='*'||ch=='/')
	{  ch2=ch;
	   ch=getchar();
       es=F(r);
 	   strcpy(t0,NEWT());//产生一个临时变量
       if(ch2=='*')
	   printf("      MULT %s,%s,%s\n",p,r,t0);
	   else
	   printf("      DIV %s,%s,%s\n",p,r,t0);
	   es=T1(t0,t);
	   return(es);
    }  else 
	{	
		strcpy(t,p);
		return(0);
	}
}

//产生式F↑p ->(E↑p) |ID↑p的翻译子程序,p为综合属性,形参用指针变量
int F(char *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;
 //       printf("F中 %s\n",p);
	    ch=getchar();
		return(es);
	} else return(4);
   }
}
//主程序
main()
{
	int es=0;
	char 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 + -