?? exprtran.c
字號(hào):
//本程序?qū)⒑?jiǎn)單中綴算術(shù)表達(dá)式翻譯成四元式,表達(dá)式中只有+和*運(yùn)算符
#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()//返回一個(gè)臨時(shí)變量,順序產(chǎn)生A、B、...、Z,最多產(chǎn)生26個(gè)臨時(shí)變量
{ static int i=64;//設(shè)置i為靜態(tài)變量,確保下次調(diào)用時(shí)i為上次調(diào)用的結(jié)果
i=i+1;
return(i);
}
//產(chǎn)生式E↑t→T↑pE'↓p的翻譯子程序,t為綜合屬性,形參用指針變量
int E(int *t)
{ int es=0;
int p;
es=T(&p);//調(diào)分析T子程序
es=E1(p,t);//調(diào)分析E1子程序
return(es);
}
//產(chǎn)生式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();//產(chǎn)生一個(gè)臨時(shí)變量
printf(" ADD %c,%c,%c\n",p,r,t0);
es=E1(t0,t);
return(es);
} else
{ *t=p;
return(0);
}
}
//產(chǎn)生式T↑p→F↑pT'↓p的翻譯子程序,t為綜合屬性,形參用指針變量
int T(int *t)
{ int es=0,p;
es=F(&p);//調(diào)分析F子程序
es=T1(p,t);//調(diào)分析T1子程序
return(es);
}
//產(chǎn)生式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();//產(chǎn)生一個(gè)臨時(shí)變量
printf(" MULT %c,%c,%c\n",p,r,t0);
es=T1(t0,t);
return(es);
} else
{ *t=p;
return(0);
}
}
//產(chǎn)生式F↑p ->(E↑p) |ID↑p的翻譯子程序,p為綜合屬性,形參用指針變量
int F(int *p)//分析F子程序
{ int es=0;
if (ch=='(')
{
ch=getchar();
es=E(p);//調(diào)分析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("請(qǐng)輸入算術(shù)表達(dá)式(操作數(shù)只能是單個(gè)字母):");
ch=getchar();
printf("輸出四元式為:\n");
es=E(&t);//調(diào)分析表達(dá)式E的翻譯程序
if (es==0) printf("\n翻譯成功!\n");
else printf("\n表達(dá)式有語(yǔ)法錯(cuò)誤!\n");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -