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

📄 编译原理.cpp

📁 词法分析器,在记事本"in"中输入要分析的语句,在记事本"out"中输出结果.
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
#include<math.h>
fstream infile,outfile;
static int tt=0;
static int bb=0;
static int total=0;
static int total1=0;
void jnumble(char a[])
{
	int i,j,k=0;
	i=strlen(a);
	for(j=0;j<i;j++)
     k=k+(a[j]-48)*pow(10,i-1-j);
    outfile<<"(2,"<<k<<")"<<k<<"     ";
	cout<<"(2,"<<k<<")"<<k<<"     ";
		tt++;
	if(tt%4==0)
	{   
		outfile<<endl;
		cout<<endl;
	}
}
void jsaved(char a[],char c[][10])
{
	char b[13][10]={"program","var","procedure","begin","end","if","then","else","while","do","call","integer","real"};
	if(strcmp(a,b[0])==0)
		{
		   outfile<<"(3,0)program     ";
			cout<<"(3,0)program     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else	if(strcmp(a,b[1])==0)
		{
	        outfile<<"(4,0)var     ";
			cout<<"(4,0)var     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
		else 	if(strcmp(a,b[2])==0)
		{
            outfile<<"(5,0)procedure     "; 
			cout<<"(5,0)procedure     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else	if(strcmp(a,b[3])==0)
		{
	        outfile<<"(6,0)begin     ";
			cout<<"(6,0)begin     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
}  		
				else	if(strcmp(a,b[4])==0)
		{
            outfile<<"(7,0)end     ";
			cout<<"(7,0)end     ";
			tt++;
			if(tt%4==0)
			{	
				cout<<endl;
				outfile<<endl;
			}
		}
else	if(strcmp(a,b[5])==0)
		{
            outfile<<"(8,0)if     ";
			cout<<"(8,0)if     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else	if(strcmp(a,b[6])==0)
		{
	       outfile<<"(9,0)then     ";
			cout<<"(9,0)then     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else	if(strcmp(a,b[7])==0)
		{
	        outfile<<"(10,0)else     ";
			cout<<"(10,0)else     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else	if(strcmp(a,b[8])==0)
		{
	        outfile<<"(11,0)while     ";
			cout<<"(11,0)while     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else	if(strcmp(a,b[9])==0)
		{
	         outfile<<"(12,0)do    ";
			cout<<"(12,0)do    ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else	if(strcmp(a,b[10])==0)
		{
	        outfile<<"(13,0)call     ";
			cout<<"(13,0)call     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else if(strcmp(a,b[11])==0)
		{
	        outfile<<"(14,0)integer     ";
			cout<<"(14,0)integer     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else if(strcmp(a,b[12])==0)
		{
	        outfile<<"(15,0)real     ";
			cout<<"(15,0)real     ";
			tt++;
			if(tt%4==0)
			{
				outfile<<endl;
				cout<<endl;
			}
		}
else 
{
	if(strlen(a)>=8)
	{
       outfile<<"Float      ";
		cout<<"Float      ";
	}
	else
	{
	for(int j=0;j<total;j++)
	{
		if(strcmp(a,c[j])==0)
		{
			 outfile<<"(1,"<<j+1<<")"<<c[j]<<"     ";
			cout<<"(1,"<<j+1<<")"<<c[j]<<"     ";
			tt++;
			break;
		}
	}
	if(j==total)
		{
 strcpy(c[total],a);
 total++;
outfile<<"(1,"<<total<<")"<<a<<"     ";
 cout<<"(1,"<<total<<")"<<a<<"     ";
 tt++;
		}
		if(tt%4==0)
		{
			outfile<<endl;
			cout<<endl;
		}
}
}
}
void jsingle2(char a[])
{
	char b[4];
	strcpy(b,a);
	if(strcmp(b,":=")==0)
	{
        outfile<<"(29,0):=     ";
		cout<<"(29,0):=     ";
		tt++;
		if(tt%4==0)
		{
			outfile<<endl;
			cout<<endl;
		}
	}
    else if(strcmp(b,"<=")==0)
	{
		 outfile<<"(24,0)<=     ";
		cout<<"(24,0)<=     ";
		tt++;
		if(tt%4==0)
		{
			outfile<<endl;
			cout<<endl;
		}
	}
     else if(strcmp(b,">=")==0)
	{
		outfile<<"(26,0)>=     ";
		cout<<"(26,0)>=     ";
		tt++;
		if(tt%4==0)
		{
			outfile<<endl;
			cout<<endl;
		}
	}
    else if(strcmp(b,"<>")==0)
	{
        outfile<<"(28,0)<>    "; 
		cout<<"(28,0)<>    ";
		tt++;
		if(tt%4==0)
		{
			outfile<<endl;
			cout<<endl;
		}
	}
	else if((strcmp(b,"/*")==0))
	{
		total1++;
	}
        else if((strcmp(b,"*/")==0))
			total1--;
}
void jsingle1(char a[])
{
char b;
b=a[0];
if(b=='+')
{
    outfile<<"(16,0)+     ";
	cout<<"(16,0)+     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='-')
{
    outfile<<"(17,0)-     ";
	cout<<"(17,0)-     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='*')
{
    outfile<<"(18,0)*     ";
	cout<<"(18,0)*     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='/')
{
     outfile<<"(19,0)/     ";
	cout<<"(19,0)/     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='~')
{
	outfile<<"(20,0)~     ";
	cout<<"(20,0)~     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b==94)
{
    outfile<<"(21,0)^     ";
	cout<<"(21,0)^     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='<')
{
    outfile<<"(23,0)<     ";
	cout<<"(23,0)<     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='>')
{
    outfile<<"(25,0)>     ";
	cout<<"(25,0)>     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='(')
{
    outfile<<"(33,0)(     ";
	cout<<"(33,0)(     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b==')')
{
    outfile<<"(34,0))    "; 
	cout<<"(34,0))    ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='=')
{
    outfile<<"(27,0)=     ";
	cout<<"(27,0)=     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b==';')
{
    outfile<<"(30,0);    ";
	cout<<"(30,0);    ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b=='.')
{
    outfile<<"(31,0).     ";
	cout<<"(31,0).     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b==',')
{
    outfile<<"(32,0),     ";
	cout<<"(32,0),     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
else if(b==':')
{
    outfile<<"(35,0):     ";
	cout<<"(35,0):     ";
	tt++;
	if(tt%4==0)
	{
		outfile<<endl;
		cout<<endl;
	}
}
}
void main()
{
 infile.open("in.txt",ios::in);
 outfile.open("out.txt",ios::out);
 if(! infile)
 {
	 cout<<"in.txt can't open.\n";
	 exit(0);
 }
 char a[80];
 char d[10][10];
 char b[10];
 char b1[10];
 int i,j,k,l;
 int  m=0;
 while(! infile.eof())
 {
	 infile.getline(a,sizeof(a));
	  k=strlen(a);
	  for(i=0;i<k;i++)
	  {
		  if(a[i]==' ')
		  {
			  for(j=1;j<k;j++)
			  {
				  a[j-1]=a[j];
			  }
			  a[j-1]='\0';
               k--;
		  }
		  else break;
	  }
	 int count=0;
	 for(i=0;i<k+1;i++)
	 {
		 if((a[i]!=' ')&&(a[i]!='\0'))
		 {
			b[count]=a[i];
			count++;
		 }
		 else
		 {
			 b[count]='\0';
			 j=count;
			 count=0;
			 while(j!=0)
			 {
			  if(((65<=b[0])&&(b[0]<=90))||((97<=b[0])&&(b[0]<=122))||(b[0]=='_'))
			 {
				 b1[0]=b[0];
				 for(l=1;l<j;l++)
				 {
					 if(((65<=b[l])&&(b[l]<=90))||((97<=b[l])&&(b[l]<=122))||(b[l]=='_')||((b[l]>=48)&&(b[l]<=57)))
			       b1[l]=b[l];
					 else break;
				 }
				 b1[l]='\0';
				 jsaved(b1,d);
				 for(m=l;m<j;m++)
				 {
					 b[m-l]=b[m];
				 }
				 b[m-l]='\0';
				 j=j-l;
			 }
else if(((b[0]>=40)&&(b[0]<=47))||((b[0]>=58)&&(b[0]<=62))||(b[0]==94)) 
			 {
				 b1[0]=b[0];
				 for(l=1;l<j;l++)
				 {
				if(((b[l]>=40)&&(b[l]<=47))||((b[l]>=58)&&(b[l]<=62))||(b[l]==94)) 
				{
					b1[l]=b[l];
				}
				else break;
				 }
				 b1[l]='\0';
				 if(l==1)
					 jsingle1(b1);
				 else if(l==2)
					 jsingle2(b1);
				 else //error judge
				 {
					 //cout<<"b";
                      outfile<<"**error("<<++bb<<")**"<<"     ";
					 cout<<"**error("<<bb<<")**"<<"     ";
					 tt++;
					 if(tt%4==0)
					 {
						 outfile<<endl;
						 cout<<endl;
					 }
				 }
				 for(m=l;m<j;m++)
				 {
					 b[m-l]=b[m];
				 }
				 b[m-l]='\0';
				 j=j-l;
			 }
else if((b[0]>='0')&&(b[0]<='9'))
			 {
				 b1[0]=b[0];
				 for(l=1;l<j;l++)
				 {
					 if((b[l]>='0')&&(b[l]<='9'))
						 b1[l]=b[l];
					 else break;
				 }
				 if(((65<=b[l])&&(b[l]<=90))||((97<=b[l])&&(b[l]<=122))||(b[l]=='_'))
				 {
					 outfile<<"**error("<<++bb<<")**     ";
				 cout<<"**error("<<bb<<")**     ";
				 break;
				 }
				 b1[l]='\0';
				 jnumble(b1);
				 for(m=l;m<j;m++)
				 {
					 b[m-l]=b[m];
				 }
				 b[m-l]='\0';
				 j=j-l;
			 }

else // 出错处理
			 {
               outfile<<"**error("<<++bb<<")**     ";
				 cout<<"**error("<<bb<<")**     ";
				 tt++;
				 if(tt%4==0)
				 {
					 outfile<<endl;
					 cout<<endl;
				 }
				 for(l=1;l<j;l++)
				 {
					 b[l-1]=b[l];
				 }
				 b[l-1]='\0';
				 j=j-1;
				 }
			 }
	 }
	 }
 }
 if(total1!=0)
 {
	 outfile<<"注释符不搭配      ";
	 cout<<"注释符不搭配     ";
 }
 outfile.close();
}

⌨️ 快捷键说明

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