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

📄 cpp2.cpp

📁 编译的作业
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<stdio.h>
#include<string.h>





int start=0,state=0;
char A[200];//A存放原代码
char B[16][10]={{" "},{"void"},{"main"},{"int"},{"float"},{"char"},{"if"},{"else"},{"switch"},{"case"},
{"while"},{"for"},{"do"},{"continue"},{"break"},{"return"}};//B存放关键字
int e=0;//e记录已扫描原代码的个数
char C[20][10];//C存放标识符
int r=1;//r记录已存标识符的个数
float D[20];//存放常数
int u=1;//记录已存放常数的个数
char E[23][10]={{" "},{"-"},{"+"},{"*"},{"/"},{"%"},{"="},{"!"},{"<"},{">"},{"&"},{"|"},{","},{"("},
{")"},{"["},{"]"},{"=="},{">="},{"<="},{"!="},{"&&"},{"||"}};//存放运算符
char F[4]={' ',';','{','}'};//存放界符





typedef struct
{char name[10];
 int address;
}node;
node two[50];//存放原代码的二元组
int v=0;//v记录已存二元组的个数





int fail()
{
    switch(state)
	{case 0: start=1;break;
	 case 4: start=0;break;
	 case 1: start=5;break;
	 case 14: start=0;break;
	 case 5: start=15;break;
     case 19: start=0;break;
	 case 15: start=20;break;
	 case 23: start=0;break;
	}
    return start;
}







char nextchar()
{char c;
 c=A[e];
 e=e+1;
 return c;
}




int isletter(char s)
{if(((s>='a')&&(s<='z'))||((s>='A')&&(s<='Z')))
     return 1;
 else
	 return 0;
}





int isdigit(char s)
{if((s>='0')&&(s<='9'))
     return 1;
 else
	 return 0;
}





int GorB(char s[10])
{int i;
 for(i=0;i<16;i++)
 {
	 if(strcmp(B[i],s)==0)
	 
	  break;
	 
 }
 if(i==16)
	 return 0;
 else
     return i;
}




void important(int t,char s[10])
{printf("%s 关键字\n",s);
 int i;
 for(i=0;i<10;i++)
 two[v].name[i]=s[i];
 two[v].address=t;
 v=v+1;
}




void mark(char s[10])
{printf("%s 标识符\n",s);
 int j;
 for(j=1;j<r;j++)
  if(strcmp(C[j],s)==0)
  {int t;
   for(t=0;t<10;t++)
		two[v].name[t]=s[t];
   two[v].address=j;
   v=v+1;
   break;
  }
 if(j==r)
 {int i;
  for(i=0;i<10;i++)
  {C[r][i]=s[i];
   two[v].name[i]=s[i];
  }
  two[v].address=r;
  v=v+1;
  r=r+1;
 }
}





void cunbiao(char h[10],float k)
{int j;
 for(j=1;j<u;j++)
  if(D[j]==k)
  {int t;
   for(t=0;t<10;t++)
		two[v].name[t]=h[t];
   two[v].address=j;
   v=v+1;
   break;
  }
 if(j==u)
 {int i;
  for(i=0;i<10;i++)
  {D[u]=k;
   two[v].name[i]=h[i];
  }
  two[v].address=u;
  v=v+1;
  u=u+1;
 }
}






void digit(char s[10])
{int i,j;
 char L[10];
 float zhengshu=0.0;
 float result=0.0;
 float xiaoshu=0;
 int jishu=0;
 if(s[0]=='-')
 {i=1;
  while(s[i]!='\0')
  {
	  if(isdigit(s[i]))
	  {L[i]=s[i];
	   i=i+1;
	  }
	  else
	      break;
  }
 int k;
 for(k=1;k<i;k++)
      zhengshu=zhengshu*10+(L[k]-'0');
 result=zhengshu;
 if(s[i]=='.')
 {i=i+1;
  k=i;
  while(s[i]!='\0')
  {
	  if(isdigit(s[i]))
	  {L[i]=s[i];
	   i=i+1;
	  }
	  else
	      break;
  }
  int t;
  for(t=i-1;t>=k;t--)
	  xiaoshu=xiaoshu/10+(float)(L[t]-'0')/10;
  result=zhengshu+xiaoshu;
 }
 if(s[i]=='e')
 {i=i+1;
  if(s[i]=='-')
  {int a;
   i=i+1;
   a=i;
   while(s[i]!='\0')
   {L[i]=s[i];
    i=i+1;
   }
   while(a<i)
   {jishu=jishu*10+(L[a]-'0');
    a=a+1;
   }
   int b;
   for(b=0;b<jishu;b++)
	   result=result/10;
  }
  else
  {int c=i;
   while(s[i]!='\0')
   {L[i]=s[i];
    i=i+1;
   }
   while(c<i)
   {jishu=jishu*10+(L[c]-'0');
    c=c+1;
   }
   int d;
   for(d=0;d<jishu;d++)
	   result=result*10;
  }
 }
 result=0-result;
 }
 else
 {j=0;
  while(s[j]!='\0')
  {
	  if(isdigit(s[j]))
	  {L[j]=s[j];
	   j=j+1;
	  }
	  else
	      break;
  }
  int x;
  for(x=0;x<j;x++)
      zhengshu=zhengshu*10+(L[x]-'0');
  result=zhengshu;
  if(s[j]=='.')
  {j=j+1;
   x=j;
   while(s[j]!='\0')
   {
	  if(isdigit(s[j]))
	  {L[j]=s[j];
	   j=j+1;
	  }
	  else
	      break;
   }
   int y;
   for(y=j-1;y>=x;y--)
	  xiaoshu=xiaoshu/10+(float)(L[y]-'0')/10;
   result=zhengshu+xiaoshu;
  }
  if(s[j]=='e')
  {j=j+1;
   if(s[j]=='-')
   {int z;
    j=j+1;
    z=j;
    while(s[j]!='\0')
    {L[j]=s[j];
     j=j+1;
    }
    while(z<j)
    {jishu=jishu*10+(L[z]-'0');
     z=z+1;
    }
    int n;
    for(n=0;n<jishu;n++)
	   result=result/10;
   }
  else
  {int m=j;
   while(s[j]!='\0')
   {L[j]=s[j];
    j=j+1;
   }
   while(m<j)
   {jishu=jishu*10+(L[m]-'0');
    m=m+1;
   }
   int h;
   for(h=0;h<jishu;h++)
	   result=result*10;
  }
 }
 }
 printf("%f    数字\n",result);
 cunbiao(s,result);
}
 




int isyunsuanfu1(char s)
{char L[10];
 L[0]=s;
 L[1]='\0';
 int j=1;
 while(j<23)
 {if(strcmp(E[j],L)==0)
      break;
  else
	  j=j+1;
 }
 if(j==23)
	 return 0;
 else
	 return j;
}





int isyunsuanfu2(char s[10])
{int j=1;
 while(j<23)
 {if(strcmp(E[j],s)==0)
      break;
  else
	  j=j+1;
 }
 if(j==23)
	 return 0;
 else
	 return j;
}





void yunsuanfu(char s[10],int t)
{printf("%s 运算符\n",s);
 int i;
 for(i=0;i<10;i++)
 two[v].name[i]=s[i];
 two[v].address=t;
 v=v+1;
}




int isjiefu(char s)
{int i=1;
 while(i<4)
 {if(F[i]==s)
      break;
  else
	  i=i+1;
 }
 if(i==4)
	 return 0;
 else
	 return i;
 
}





void jiefu(char s[10],int t)
{printf("%s 界符\n",s);
 int i;
 for(i=0;i<10;i++)
 two[v].name[i]=s[i];
 two[v].address=t;
 v=v+1;
}






void nexttaken()
{
	char L[10];//L存放以扫描的字符
	int i=0; 
	//L[i]='\0';
    int j=0;
	int k;
	int p,q;
	int h;
	char c;
	while(1){
		switch(state){
		   case 0:
			   c=nextchar();//nextchar()为获得一下个字符
			   if(c==' ')//)||(c==13)||(c==10))
			   {state=0;
			    break;
			   }
			   else
				   if(c=='#')//#为原程序结束标志
				   {j=1;
				    break;
				   }
				   else
				   {state=fail();//fail()为切换状态表
				    e=e-1;
			        break;
				   }
		   case 1:
			   c=nextchar();
			   if(isletter(c))//isletter()为判断是否为字母
			   {state=2;
			    L[i]=c;
				i=i+1;
			    break;
			   }
			   else
				   if(c=='#')
				   {L[i]='\0';
					j=1;
				    break;
				   }
				   else
				   {state=fail();
				    e=e-1;
			        break;
				   }
		   case 2:
			   c=nextchar();
			   if(isletter(c)||isdigit(c))//isdigit()为判断是否为数字
			   {state=2;
			    L[i]=c;
				i=i+1;
				break;
			   }
			   else
				   if(c=='#')
				   {L[i]='\0';
                    if(k=GorB(L))//GorB()判断是否为关键字
						important(k,L);//important()输出关键字并将起存放
					else
					    mark(L);//mark()输出标识符并将起存放(两个表)
					j=1;
				    break;
				   }
				   else
					   if(c==' ')
					   {state=4;
					    L[i]='\0';
					    if(k=GorB(L))//GorB()判断是否为关键字
						{//L[i]='\0';
						 important(k,L);//important()输出关键字并将起存放
						 i=0;}
					    else
						{//L[i]='\0';
                         mark(L);//mark()输出标识符并将起存放
						 i=0;
						}
					    break;
					   }
					   else
					   {L[i]=c;
					    i=i+1;
						state=3;
			            break;
					   }
		   case 3:
			   c=nextchar();
			   if(c=='#')
			   {L[i]='\0';
			    printf("%s 错误\n",L);
				j=1;
			    break;
			   }
			   else
				   if(c==' ')
				   {state=4;
				    L[i]='\0';
				    printf("%s 错误\n",L);
					i=0;
                    break;
				   }
				   else
				   {state=3;

⌨️ 快捷键说明

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