📄 bianyi.txt
字号:
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 10
#define Zhan_size 10
char guanjianzi[10][10]={"int","main","if","\0"};
char yunsuanfu_liebiao[14][3]={"=","+","-","*","/",">","<",">=","<=","!=","==","\0"};
int yunsuanfu_zhongbiema[14]={21,22,23,24,25,31,32,33,34,35,36};
char fengefu_liebiao[10]={'(',')','{','}',';',','};
int fengefu_zhongbiema[10]={26,27,28,29,30,37};
char feizhongjiefu[N]={'E','L','T','N','F'};
char zhongjiefu[N]={'i','+','*','(',')','#'};
char css[N][20]={"(1)E->TL","(2)L->+TL","(3)L->$","(4)T->FN","(5)N->*FN","(6)N->$","(7)F->i","(8)F->(E)"};
int M[N][N]={{0,-1,-1,0,-1,-1},{-1,1,-1,-1,2,2},{3,-1,-1,3,-1,-1},{-1,5,4,-1,5,5},{6,-1,-1,7,-1,-1}};
char chuli_hang[80];
int zhongbiema,chuli_hang_counter=1;
int nc=5,tc=6,css_num=8;
char Zhan[N];
int top=0,base=0;
int proc=1;
int nextstat=1;
int k=1;
typedef struct fu_haobiao_jiedian{
int id;
int chuli_hang_no;
char name[10];
int num;
struct fu_haobiao_jiedian *next;
}*fu_haobiao_zhizhen;
typedef struct{
fu_haobiao_zhizhen touzhizhen;
fu_haobiao_zhizhen weizhizhen;
}fu_haobiao;
fu_haobiao fuhaobiao;
void Init_fuhaobiao(fu_haobiao &S)
{
S.touzhizhen=S.weizhizhen=(fu_haobiao_zhizhen)malloc(sizeof(fu_haobiao_jiedian));
if(!S.touzhizhen) exit(-2);
S.touzhizhen->next=NULL;
}
void insert_fuhaobiao(fu_haobiao &S,int zhongbiema,int chuli_hang_counter,char name[10],int num)
{
fu_haobiao_zhizhen p;
p=(fu_haobiao_zhizhen)malloc(sizeof(fu_haobiao_jiedian));
if(!p) exit(-2);
p->id=zhongbiema;
p->chuli_hang_no=chuli_hang_counter;
strcpy(p->name,name);
p->num=num;
p->next=NULL;
if(S.touzhizhen==S.weizhizhen)
{
S.touzhizhen->next=p;
S.weizhizhen=p;
S.weizhizhen->next=NULL;
return;
}
S.weizhizhen->next=p;
S.weizhizhen=p;
S.weizhizhen->next=NULL;
return;
}
void Destroytable(fu_haobiao &S)
{
while(S.touzhizhen)
{
S.weizhizhen=S.touzhizhen->next;
free(S.touzhizhen);
S.touzhizhen=S.weizhizhen;
}
}
void getguanjianzi(char a[10],int &pos)
{
int j;
for(j=0;(chuli_hang[pos]>=48 && chuli_hang[pos]<=57)||(chuli_hang[pos]>=97 && chuli_hang[pos]<=122)||(chuli_hang[pos]>=65 && chuli_hang[pos]<=90);pos++,j++)
a[j]=chuli_hang[pos];
a[j]='\0';
}
int pangduan_zifuchuan(char a[10])
{
int i;
for(i=0;i<10;i++)
if(!strcmp(guanjianzi[i],a))
{
zhongbiema=i;
cout<<"("<<zhongbiema<<",“"<<guanjianzi[i]<<"”)"<<endl;
insert_fuhaobiao(fuhaobiao,zhongbiema,chuli_hang_counter,guanjianzi[i],0);
return 1;
}
zhongbiema=10;
cout<<"("<<zhongbiema<<",“"<<a<<"”)"<<endl;
insert_fuhaobiao(fuhaobiao,zhongbiema,chuli_hang_counter,a,0);
return 0;
}
int huoqu_shuzi(int &pos)
{
int num=0;
int *nump;
while(chuli_hang[pos]>=48 && chuli_hang[pos]<=57)
{
num=10*num+(chuli_hang[pos]-48);
pos++;
}
zhongbiema=20;
cout<<"("<<zhongbiema<<","<<num<<")"<<endl;
nump=#
insert_fuhaobiao(fuhaobiao,zhongbiema,chuli_hang_counter,"\0",num);
return num;
}
int xunzhao_yunsuanfu(int pos)
{
int i,flag=0;
char linshichuanstr[3];
linshichuanstr[0]=chuli_hang[pos];
linshichuanstr[1]=chuli_hang[pos+1];
linshichuanstr[2]='\0';
for(i=0;yunsuanfu_liebiao[i][0]!='\0';i++)
if(!strcmp(yunsuanfu_liebiao[i],linshichuanstr))
{
zhongbiema=yunsuanfu_zhongbiema[i];
cout<<"("<<zhongbiema<<",“"<<yunsuanfu_liebiao[i]<<"”)"<<endl;
insert_fuhaobiao(fuhaobiao,zhongbiema,chuli_hang_counter,yunsuanfu_liebiao[i],0);
return 2;
}
linshichuanstr[1]='\0';
for(i=0;yunsuanfu_liebiao[i][0]!='\0';i++)
if(!strcmp(yunsuanfu_liebiao[i],linshichuanstr))
{
zhongbiema=yunsuanfu_zhongbiema[i];
cout<<"("<<zhongbiema<<",“"<<yunsuanfu_liebiao[i][0]<<"”)"<<endl;
insert_fuhaobiao(fuhaobiao,zhongbiema,chuli_hang_counter,yunsuanfu_liebiao[i],0);
return 1;
}
return 0;
}
int xunzhao_fengefu(char a)
{
int i;
char b[10];
for(i=0;fengefu_liebiao[i]!='\0';i++)
if(fengefu_liebiao[i]==a)
{
zhongbiema=fengefu_zhongbiema[i];
cout<<"("<<zhongbiema<<",“"<<a<<"”)"<<endl;
b[0]=a;
b[1]='\0';
insert_fuhaobiao(fuhaobiao,zhongbiema,chuli_hang_counter,b,0);
return 1;
}
return 0;
}
void print_yuyi()
{
cout<<"("<<nextstat++<<") (*, 2, 3, T"<<k++<<")"<<endl;
cout<<"("<<nextstat++<<") (+, T"<<k-1<<", 4, T"<<k++<<")\n";
cout<<"("<<nextstat++<<") (=, T"<<k<<", , i)\n";
cout<<"("<<nextstat++<<") (j>, "<<"i, 10, 6)\n";
cout<<"("<<nextstat++<<") (j, ,"<<" , 7)\n";
cout<<"("<<nextstat++<<") ("<<"=, 3, ,"<< "j"<<")\n";
cout<<"("<<nextstat++<<") End"<<endl;
}
void Ruzhan(char *caozuofu_zhan,int &top,char p)
{
caozuofu_zhan[top]=p;
top++;
}
void Ruzhan(int *caozuoshu_zhan,int &top,char p)
{
caozuoshu_zhan[top]=p;
top++;
}
void Chuzhan(char *caozuofu_zhan,int &top,char p)
{
p=caozuofu_zhan[top];
top--;
}
void Chuzhan(int *caozuoshu_zhan,int &top,char p)
{
p=caozuoshu_zhan[top];
top--;
}
void Ruzhan(char ch)
{
Zhan[top]=ch;
top++;
}
char Chuzhan()
{
char ch;
if(top==base)
{
cout<<"分析栈已空!"<<endl;
return '\0';
}
top--;
ch=Zhan[top];
return ch;
}
int chazhao_zhongjiefu(char a)
{
for(int i=0;i<tc;i++)
if(a==zhongjiefu[i])
return i;
return -1;
}
int chazhao_zhongjiefu2(char a)
{
for(int i=0;i<tc-1;i++)
if(a==zhongjiefu[i])
return i;
return -1;
}
int chazhao_feizhongjiefu(char a)
{
for(int i=0;i<nc;i++)
if(a==feizhongjiefu[i])
return i;
return -1;
}
void shuchu_tiaojianju(char name1[10],char name2[10],int a,int b)
{
char t[10]="\0";
if(!strcmp(name1,t))
cout<<"("<<nextstat++<<")(j, , ,"<<b<<")"<<endl;
else
cout<<"("<<nextstat++<<")(j,"<<name2<<","<<a<<","<<b<<")"<<endl;
}
void tiaojianyuju(fu_haobiao_zhizhen p1,fu_haobiao_zhizhen p2)
{
fu_haobiao_zhizhen p3;
p3=p2->next;
shuchu_tiaojianju(p3->name,p2->name,p1->num,nextstat+1);
shuchu_tiaojianju("\0","\0",0,nextstat+1);
}
void jiandanfuzhiju(fu_haobiao_zhizhen p1,fu_haobiao_zhizhen p2)
{
if(p1->id==20)
{
p2->num=p1->num;
cout<<"("<<nextstat++<<")(=,"<<p1->num<<", ,"<<p2->name<<")"<<endl;
}
if(p1->id==10)
{
p2->num=p1->num;
cout<<"("<<nextstat++<<")(=,"<<p1->name<<", ,"<<p2->name<<")"<<endl;
}
}
int shouxunxiabiao(char op[7],char p)
{
int len;
len=strlen(op);
for(int i=0;i<len;i++)
if(op[i]==p) return i;
return -1;
}
int youxianji(int op_pre[7][7],char op[7],char a,char b)
{
int i,j;
i=shouxunxiabiao(op,a);
j=shouxunxiabiao(op,b);
return op_pre[i][j];
}
int sizeyunsuan(int a,char op,int b)
{
switch(op)
{
case '+': return a+b; break;
case '-': return a-b; break;
case '*': return a*b; break;
case '/': return a/b; break;
default: return a*b; break;
}
}
void fenxi_chuli_hang()
{
int pos=0,flag;
char a[10];
while(chuli_hang[pos]!='\0')
{
flag=0;
if((chuli_hang[pos]>=97 && chuli_hang[pos]<=122)||(chuli_hang[pos]>=65 && chuli_hang[pos]<=90))//当前字符为字母
{
getguanjianzi(a,pos);
pangduan_zifuchuan(a);
flag=1;
}
if((chuli_hang[pos]>=48 && chuli_hang[pos]<=57) && flag==0)
{
huoqu_shuzi(pos);
flag=1;
}
while(flag==0)
{
flag=xunzhao_yunsuanfu(pos);
if(flag==1)
{ pos++; break; }
if(flag==2)
{ pos+=2; break; }
flag=xunzhao_fengefu(chuli_hang[pos]);
if(flag==1)
{ pos++; break; }
if(chuli_hang[pos]==' ' || chuli_hang[pos]=='\t' || chuli_hang[pos]=='\b')
{ pos++; break; }
cout<<"源程序中有非法字符!"<<endl;
return;
}
}
}
void yucefenxi(char Ana_string[20],int chuli_hang_num)
{
char X,a,linshichuan[20];
int i,j,flag,pos=0,k,l,len;
Ruzhan('#');
Ruzhan('E');
a=Ana_string[pos];
while(1)
{
X=Chuzhan();
flag=chazhao_zhongjiefu2(X);
if(flag!=-1)
{
if(X==a) { pos++; a=Ana_string[pos]; }
else { cout<<"\n 源程序第"<<chuli_hang_num<<"行的表达式有错,这是由于串含有的终结符"<<a<<"在文法中未定义!"<<endl;return;}
}
else
{
if(X=='#') { if(X==a){ cout<<"\n 源程序第"<<chuli_hang_num<<"行中没有语法错误!"<<endl; return; }
else { cout<<"\n 源程序第"<<chuli_hang_num<<"行的表达式有错,这可能是由于串含有的终结符"<<a<<"在文法中未定义!"<<endl; return;}
}
else
{
i=chazhao_feizhongjiefu(X); j=chazhao_zhongjiefu(a);
if(j==-1){ cout<<"\n 源程序第"<<chuli_hang_num<<"行的表达式有错,这可能是由于串含有的终结符"<<a<<"在文法中未定义!"<<endl;return; }
if(M[i][j]==-1) { cout<<"\n 源程序第"<<chuli_hang_num<<"行中形如"; len=strlen(Ana_string); Ana_string[len-1]='\0'; cout<<Ana_string<<"的表达式有错!"<<endl;
return; }
else { strcpy(linshichuan,css[M[i][j]]); l=strlen(linshichuan);
for(k=l-1;linshichuan[k]!='>' && linshichuan[k]!='$';k--) Ruzhan(linshichuan[k]);
} } } }
}
void cifa_fenxi()
{
FILE *fp;
int i;
if((fp=fopen("test.txt","r"))==NULL)
{
cout<<"无法打开源程序文件,是否建立?"<<endl;
exit(0);
}
cout<<"词法分析的结果如下:\n";
while(!feof(fp))
{
for(i=0;!feof(fp);i++)
{
fread(&chuli_hang[i],sizeof(char),1,fp);
if(chuli_hang[i]==10 || feof(fp))
{
chuli_hang[i]='\0';
break;
}
}
fenxi_chuli_hang();
chuli_hang_counter++;
}
fclose(fp);
}
void yufa_fenxi()
{
fu_haobiao_zhizhen p1;
int i;
char Ana_string[20];
p1=fuhaobiao.touzhizhen->next;
cout<<"\n\n语法分析的结果如下:\n";
while(p1!=NULL)
{
if(p1->id==21 || (p1->id>=31 && p1->id<=36))
{
for(i=0;i<20;i++)
Ana_string[i]='\0';
p1=p1->next;
for(i=0;i<20 && p1->id!=27 && p1->id!=30;i++)
{
if(p1->id==20 || p1->id==10)
Ana_string[i]='i';
else Ana_string[i]=p1->name[0];
p1=p1->next;
}
Ana_string[i]='#';
Ana_string[i+1]='\0';
yucefenxi(Ana_string,p1->chuli_hang_no);
}
p1=p1->next;
}
}
void yuyi_fenxi()
{
fu_haobiao_zhizhen p1,p2,p3;
int steps=0;
p2=fuhaobiao.touzhizhen;
p1=p2->next;
cout<<"\n\n语义分析的结果如下:\n";
while(p1!=NULL)
{
if(p1->id==21)
{
p1=p1->next;
p3=p1->next;
}
if(p1->id==2)
{
p2=p1->next->next;
p1=p2->next->next;
}
p2=p1;
p1=p1->next;
}
print_yuyi();
}
void main()
{
Init_fuhaobiao(fuhaobiao);
cifa_fenxi();
yufa_fenxi();
yuyi_fenxi();
Destroytable(fuhaobiao);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -