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

📄 yu.cpp

📁 对自己设计的一种简单的词法进行词法分析
💻 CPP
字号:
#include <iostream.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum,kk,pp,k;
char *rwtab[6]={"begin","if","then","while","do","end"};
struct 
{	char result[8];
	char ag1[8];
	char op[8];
	char ag2[8];
}quad[20];
bool letter(char ch);
bool digit(char ch);
void scaner();
void Irparser();
void yucu();
void statement();
char *expression();
char *term();
char *factor();
char *newtemp(void);
void emit(char *result,char *ag1,char *op,char *ag2);
int isdigit(char m);
int  ischar(char c);
void main()
{	p=0;
	pp=0;
	cout<<"输入表达语句:"<<endl;
	do
	{	ch=getchar();
		prog[p++]=ch;
	}while(ch!='#');
	p=0;
	Irparser();
	int i;
	cout<<"编译结果的四元式形式是:"<<endl;
	for(i=0;i<pp;i++)
	{	if(strlen(quad[i].op)==0)
			cout<<'('<<":=";
		else
			cout<<'('<<quad[i].op;
		cout<<','<<quad[i].ag1<<','<<quad[i].ag2<<','<<quad[i].result<<')'<<endl;
	}
	cout<<"编译结果的三地址指令格式是:"<<endl;
	for(i=0;i<pp;i++)
	{	
	    cout<<quad[i].result<<'='<<quad[i].ag1<<quad[i].op<<quad[i].ag2<<endl;
	}
}
//***************************************************************************
void scaner()
{
	for(n=0;n<10;n++)  
		token[n]=NULL;
	ch=prog[p++];
	while(ch==' ')
		ch=prog[p++];
	if(ischar(ch))
	{	m=0;
		while(ischar(ch)||isdigit(ch))
		{	token[m++]=ch;
			ch=prog[p++];
		}
		token[m++]='\0';
		p--;
		syn=10;
		for(n=0;n<6;n++)
		{  if(strcmp(token,rwtab[n])==0)
		   {  syn=n+1;
		   	  break;
		   }
		}
	}
	else 
	   if(isdigit(ch))
	   {	while(isdigit(ch))
	   	    {	sum=sum*10+ch-'0';
	   	    	ch=prog[p++];
	   	    }
	   	    p--;
	   	    syn=11;
	   }
	 else 
	   switch(ch)
	   {	case '<':m=0;token[m++]=ch;
	   	             ch=prog[p++];
	   	             if(ch=='>')
	   	             {	syn=21;
	   	             	token[m++]=ch;
	   	             }
	   	             else if(ch=='=')
	   	             {	syn=22;
	   	             	token[m++]=ch;
	   	             }
	   	             else
	   	             {  syn=20;
	   	             }
	   	             break;
	   	     case '>':m=0;token[m++]=ch;
	   	             ch=prog[p++];
	   	             if(ch=='=')
	   	             {	syn=24;
	   	             	token[m++]=ch;
	   	             }
	   	             else
	   	             {  syn=23;
	   	             }
	   	             break;
	   	     case ':':m=0;token[m++]=ch;
	   	             ch=prog[p++];
	   	             if(ch=='=')
	   	             {	syn=18;
	   	             	token[m++]=ch;
	   	             }
	   	             else
	   	             {  syn=17;
	   	             }
	   	             break;
	   	     case '+':syn=13;
	   	              m=0;
	   	               token[m++]=ch;
	   	              break;
	   	     case '-':syn=14;
	   	              m=0;
	   	               token[m++]=ch;
	   	              break;
	   	     case '*':syn=15;
	   	              m=0;
	   	               token[m++]=ch;
	   	              break;
	   	     case '/':syn=16;
	   	              m=0;
	   	               token[m++]=ch;
	   	              break;
	   	     case ';':syn=26;
	   	              m=0;
	   	               token[m++]=ch;
	   	              break;
	   	     case '=':syn=25;
	   	              m=0;
	   	               token[m++]=ch;
	   	              break;
	   	     case '(':syn=27;
	   	              m=0;
	   	               token[m++]=ch;
	   	              break;
	   	     case ')':syn=28;
	   	              m=0;
	   	               token[m++]=ch;
	   	              break;
	   	     case '#':syn=0;
	   	              m=0;
	   	              token[m++]=ch;
	   	              break;
	   	    default:syn=-1;     
	   }
	 token[m++]='\0';
}
int  ischar(char c)
{  if((c>=65&&c<=90)||(c>=97&&c<=122))
	   return 1;
   else return 0;
}
int isdigit(char m)
{  if(m>=48&&m<=57)
	   return 1;
   else return 0;
}
//**********************************************************************************
/*语法分析程序*/
void Irparser()
{	scaner();
	if(syn==1)
	{	scaner();
		yucu();
		if(syn==6)
		{	scaner();
			if((syn==0)&&(kk==0))
			{	cout<<"success"<<endl;
			}
		}
		else
		{	if(kk!=1)
			{	cout<<"缺少end"<<endl;
				kk=1;
			}
		}
	}
}
void yucu()
{
	statement();
	while(syn==26)
	{	scaner();
		statement();
	}
}
void statement()
{	char tt[8],eplace[8];
	switch(syn)
	{	case 10:strcpy(tt,token);
				scaner();
				if(syn=18)
				{	scaner();
					strcpy(eplace,expression());
					emit(tt,eplace,"","");
				}
				else{	cout<<"缺少赋值号"<<endl;
					}
				break;
	}
}
char *expression()
{	char *tp,*ep2,*eplace,*tt;
	ep2=new char[12];
	tp=new char[12];
	eplace=new char[12];
	tt=new char[12];
	strcpy(eplace,term());
	while((syn==13)||(syn==14))
	{	
		strcpy(tt,token);
		scaner();
		strcpy(ep2,term());
		strcpy(tp,newtemp());
		emit(tp,eplace,tt,ep2);
		strcpy(eplace,tp);
	}
	return  eplace;
}
char *term()
{	char *tp,*ep2,*eplace,*tt;
	tp=new char[12];
	ep2=new char[12];
	eplace=new char[12];
	tt=new char[12];
	strcpy(eplace,factor());
	while((syn==15)||(syn==16))
	{
		strcpy(tt,token);
		scaner();
		strcpy(ep2,factor());
		strcpy(tp,newtemp());
		emit(tp,eplace,tt,ep2);
		strcpy(eplace,tp);
	}
	return  eplace;
}
char *factor()
{	char *fplace;
	fplace=new char[12];
	strcpy(fplace," ");
	if(syn==10)
	{	strcpy(fplace,token);
		scaner();
	}
	else if(syn==11)
		{	itoa(sum,fplace,10);
			scaner();
		}
		else if(syn==27)
		{	scaner();
			fplace=expression();
			if(syn==28)
				scaner();
			else
			{	cout<<"输出')'错误"<<endl;
			}
		}
	else
	{	cout<<"输出')'错误"<<endl;
	}
	return fplace;
}
char *newtemp(void)
{	char *p;
	char m[8];
	p=new char[8];
	k++;
	itoa(k,m,10);
	strcpy(p+1,m);
	p[0]='t';
	return p;
}
void emit(char *result,char *ag1,char *op,char *ag2)
{	strcpy(quad[pp].result,result);
	strcpy(quad[pp].ag1,ag1);
	strcpy(quad[pp].op,op);
	strcpy(quad[pp].ag2,ag2);
	pp++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -