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

📄 bianyi.txt

📁 简单的c编译器
💻 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=&num;
	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 + -