📄 e.cpp
字号:
#include <iostream>
#include <string.h>
using namespace std;
class word{
public:
int k;
char val[8];
};
int jis=0;
int letter(char* ple){
if(((*ple>='a')&&(*ple<='z'))||((*ple>='A')&&(*ple<='Z')))return 1;
return 0;
}
int digit(char* ple){
if((*ple>=48)&&(*ple<=57))return 1;
return 0;
}
char* concat(char* plw,char c){
*plw=c; plw++;return plw;
}
char* wordaly(char* ple,char* plw,word* pws){
if(letter(ple)){
char fi[3]="if";
char el[5]="else";
char th[5]="then";
while(letter(ple)||digit(ple)){
plw=concat(plw,*ple);ple++;}
*plw=char(0);
if(!strcmp(fi,pws->val))pws->k=1;
else if(!strcmp(th,pws->val))pws->k=2;
else if(!strcmp(el,pws->val))pws->k=3;
else pws->k=4;
return ple;
}
else if(digit(ple)){
while(digit(ple)){
plw=concat(plw,*ple++);
}
pws->k=5;
*plw=char(0);
return ple;
}
else if(*ple=='('){
pws->k=6;
strcpy(pws->val,"(\0");
ple++;
return ple;
}
else if(*ple==')'){
pws->k=7;
strcpy(pws->val,")\0");
ple++;
return ple;
}
else if(*ple=='='){
pws->k=14;
strcpy(pws->val,"=\0");
ple++;
return ple;
}
else if(*ple=='<'){
plw=concat(plw,*ple);
if((*++ple)=='='){
plw=concat(plw,*ple);
pws->k=9;
ple++;
}
else pws->k=8;
*plw=char(0);
return ple;
}
else if(*ple=='>'){
plw=concat(plw,*ple);
if((*++ple)=='='){
plw=concat(plw,*ple);
pws->k=11;
ple++;
}
else pws->k=10;
*plw=char(0);
return ple;
}
else if(*ple=='+'){
plw=concat(plw,*ple);
if((*++ple)=='+'){
plw=concat(plw,*ple);
pws->k=13;
ple++;
}
else pws->k=12;
*plw=char(0);
return ple;
}
else if(*ple=='{'){
pws->k=15;
strcpy(pws->val,"{\0");
ple++;
return ple;
}
else if(*ple=='}'){
pws->k=16;
strcpy(pws->val,"}\0");
ple++;
return ple;
}
else {cout<<"词法分析错,非法定字符: "<<*ple++<<endl;return ple;}
}
void pword(word w[]){
for(int t=0;t<20;t++){
cout<<w[t].k<<","<<w[t].val<<endl;
if(w[t].val[0]=='#')break;
}
}
//以上为词法分析所定义的函数
void pri(int a[][17]){
for(int i1=0;i1<17;i1++)
for(int i2=0;i2<17;i2++)
a[i1][i2]=2;
a[16][3]=a[1][6]=a[2][15]=a[3][15]=a[4][13]=a[4][14]=a[6][7]=a[7][2]=a[13][4]=a[14][12]=a[15][16]=0;
a[4][16]=a[5][16]=a[11][7]=a[8][7]=a[9][7]=a[10][7]=a[13][16]=a[12][16]=a[16][0]=1;
a[6][5]=a[6][4]=a[6][11]=a[6][8]=a[6][9]=a[6][10]=a[14][5]=a[14][4]=a[15][4]=a[15][13]=a[0][1]=-1;
for(i1=4;i1<6;i1++)
for(int i2=7;i2<13;i2++)
a[i1][i2]=1;
for(i1=8;i1<13;i1++)
for(int i2=4;i2<6;i2++)
a[i1][i2]=-1;
}
void gram(int gra[][13]){
for(int g=0;g<11;g++)
for(int a=0;a<8;a++)
gra[g][a]=0;
gra[1][0]=17;gra[1][1]=1;gra[1][2]=6;gra[1][3]=7;gra[1][4]=2;gra[1][5]=15;gra[1][6]=16;
gra[1][7]=15;gra[1][8]=16;
gra[2][0]=18;gra[2][1]=8;
gra[3][0]=18;gra[3][1]=9;
gra[4][0]=18;gra[4][1]=10;
gra[5][0]=18;gra[5][1]=11;
gra[6][0]=20;gra[6][1]=4;
gra[7][0]=20;gra[7][1]=5;
gra[8][0]=19;gra[8][1]=4;gra[8][2]=14;gra[8][3]=12;
gra[9][0]=19;gra[9][1]=4;gra[9][2]=13;
gra[10][0]=19;gra[10][1]=13;gra[10][2]=4;
}
void op4(int i,word* tp){
if((i==2)||(i==3)||(i==4)||(i==5)){
cout<<"if "<<(tp-2)->val<<(tp-1)->val<<tp->val<<" goto L0"<<endl;
cout<<"goto L1"<<endl;
}
else if(i==8){
cout<<"L"<<jis<<" T1="<<tp->val<<(tp+1)->val<<(tp+2)->val<<endl;
cout<<(tp-2)->val<<"=T1"<<endl;jis++;
}
else if(i==9){
cout<<"L"<<jis<<" "<<tp->val<<(tp+1)->val<<endl;jis++;
}
else if(i==10){
cout<<"L"<<jis<<" "<<(tp+1)->val<<tp->val<<endl;
}
}
void cpu(word* tp,word* pws,int* sta,int pr[][17],int gra[][13]){
int* ste;int i,j,jug=0;
while(pws->val[0]!='#'){
if((pws->k<=20)&&(pws->k>=17))pws++;
else if(pr[*sta][pws->k]<=0){
if((pws->k<=16)&&(pws->k>=1))*++sta=pws->k;
pws++; jug=1;
}
else if(pr[*sta][pws->k]==1){
ste=sta;
if(jug!=2)tp=(pws-1);
jug=2;
while(pr[*(ste-1)][*ste]==0){ste--;tp--;}
for(i=1;i<11;i++){
for(j=1;ste<=sta;ste++,j++){
if(*ste!=gra[i][j])break;
}
if(ste>sta){
while(pr[*(sta-1)][*sta]==0){sta--;}sta--;
op4(i,tp);
break;
}
else ste=ste-j+1;
}
}
if((*sta==16)&&(*(sta-1)==20))break;
if(pr[*sta][pws->k]==2){cout<<*sta<<","<<pws->val<<"语法分析出错!"<<endl;pws++;}
}
if((*sta==16)&&(*(sta-1)==20))cout<<endl<<"语法分析成功完成!三地址代码已输出"<<endl;
else cout<<endl;
}
int main(){
word words[20];
char s[50];
char* ps;
char* pw;
word* pws;
word* tp;
int i=0;
ps=s;
gets(s);cout<<endl;
while((*ps==' ')||(*ps=='\n')||(*ps==' '))ps++;
while(int(*ps)!=0){
pws=&words[i];
pw=pws->val;
while((*ps==' ')||(*ps=='\n')||(*ps==' '))ps++;
ps=wordaly(ps,pw,pws);
i++;
}words[i].k=21;strcpy(words[i].val,"#\0");
// pword(words);//是否需要打印词法分析结果
//以上为主程序词法分析部分
int pr[17][17];pri(pr);
int gra[11][13]; gram(gra);
int stk[10];stk[0]=0;
int* sta;sta=stk;
pws=words; tp=pws;
cpu(tp,pws,sta,pr,gra);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -