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

📄 1.cpp

📁 一个用C++编写的词法分析器程序
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
int i,j,k,flag,number,status,end=0,pro=0;

char ch;
char words[10] = {" "};
char program[500];
int Scan(char program[])
{
    char *keywords[5] = {"if","then","else","while","do"};
int m=0;
	end=0;
number = 0;
status   = 0;           /* zhongbie */
j      = 0;
ch     = program[i++];
 
      

      /*id*/
if(ch==' ')  /*将空格去掉*/
{
   while(ch==' ')
         ch=program[i++];

   
}
   if ((ch >= 'a') && (ch <= 'z' ))
{
       for(m=0;m<=9;m++)
	       words[m]=NULL;
while ((ch >= 'a') && (ch <= 'z' ))
{
words[j++]=ch;
ch=program[i++];
}
if(ch=='@')
{            /*纯字母的单词,且已结束*/
   end=1;
   i--;
}
else while((ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='=')&&(ch!='<')&&(ch!='>'))/*还有其他字符,放到words,直到这个字符串结束*/
{  
   words[j++]=ch;
   ch=program[i++];
   if(ch=='@')
   {
	   end=1;
       i--;
	   
	   break;
   }   
}
  i--;	
  words[j] = '\0';
   for (k = 0; k < 4; k++)
		if (strcmp (words,keywords[k]) == 0)   /*判断是否是关键字*/
switch(k)
{
case 0:{
 flag = 1;
 status = 1;
 pro=1;
 break;
}
case 1:{
 flag = 2;
 status = 1;
 pro=1;
 break;
}
case 2:{
 flag = 3;
 status = 1;
 pro=1;
 break;
}
case 3:{
 flag = 4;
 status = 1;
 pro=1;
 break;
}
case 4:{
 flag = 5;
 status = 1;
 pro=1;
 break;
}

		} 
   if (status == 0)  /* 是标识符 */
   {
      flag = 100;     /* 其他标识符的种别 */         
      pro=2;
   }
words[j]   = '\0';
  }

   /* digits*/
else if(ch=='0')
{
	 for(m=0;m<=9;m++)
	       words[m]=NULL;
	 words[j++]=ch;
	 ch=program[i++];
     if((ch=='=')||(ch==' ')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')||(ch=='(')||(ch==')')||(ch=='<')||(ch=='>'))
	{
		flag=200;
        number=0;
	}
     else if(ch=='@')
	 {  
		  flag=200;
	      number=0; 
	      end=1;
		  i--;
	 }

	 else if((ch>='1')&&(ch<='7'))/*判断8进制数*/
	 {   
	     words[j++]=ch;
		 ch=program[i++];
		 while((ch>='0' ) && (ch<= '7' ))
		 {    
               words[j++]=ch;
	           ch  = program[i++];
		 }
          
         if((ch=='=')||(ch==' ')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')||(ch=='(')||(ch==')')||(ch=='<')||(ch=='>'))
            flag = 800;
         else if(ch=='@')
		 {  
	           i--;
			 flag=800;
               end=1;
		 }
	      else{    
		      while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
			  {   
                  ch=program[i++];
                  if(ch=='@')
				  {   
			         i--;
			         end=1;
	                 break;
				  }
			 }
               i--;
            flag=-1;
		 }
	words[j]   = '\0';
	 }

/*else{    
     while(ch!=' ')
	 {   
          ch=program[i++];
          if(ch=='@')
		  {   
			 i--;
			 end=1;
	         break;
		  }
	 }
     
            flag=-1;
		 }

*/

else if(ch=='x')/*判断16进制数*/
	 {   
	     words[j++]=ch;
		 ch=program[i++];
		 if(((ch>='0' ) && (ch<= '9' ))||((ch>= 'a')&&(ch<= 'f')))/*0x后是正确字符*/
		 {
		     
			 words[j++]=ch;
		     ch=program[i++];
			 while(((ch>='0' ) && (ch<= '9' ))||((ch>= 'a')&&(ch<= 'f')))/*进一步判断是否是16进制数*/
			{   
			   
               words[j++]=ch;
	           ch  = program[i++];
			}
		 
            if((ch=='=')||(ch==' ')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')||(ch=='(')||(ch==')')||(ch=='<')||(ch=='>'))
			{
				flag = 1600;
                i--;
				
			}
				else if(ch=='@')
			{  
	              i--;
			      flag=1600;
                  end=1;
			}
	        else{    
		      while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
			  {   
                  ch=program[i++];
                  if(ch=='@')
				  {   
			         i--;
			         end=1;
	                 break;
				  }
			 }
			i--;
            flag=-1;
			}
		 }
         else/*0x后是其他字符则错误*/
		 {
             while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
			  {   
                  ch=program[i++];
                  if(ch=='@')
				  {   
			         i--;
			         end=1;
	                 break;
				  }
			 }
			i--;
            flag=-1;
		 }
}
else{    
     while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))
	 {   
          ch=program[i++];
          if(ch=='@')
		  {   
			 i--;
			 end=1;
	         break;
		  }
	 }
      i--;
            flag=-1;
		 }


words[j]   = '\0';
}

else if ((ch > '0') && (ch <= '9'))/*判断10进制数*/
{
	for(m=0;m<=9;m++)
	       words[m]=NULL; 
	number = 0;
while ((ch >= '0' ) && (ch <= '9' ))
{
    words[j++]=ch;
	number = number*10+(ch-'0');
    ch  = program[i++];
}
i--;
if((ch=='=')||(ch==' ')||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/')||(ch=='(')||(ch==')')||(ch=='<')||(ch=='>'))
   flag = 200;
else if(ch=='@')
{  
	    flag=200;
        end=1;
}
	  else{
while((ch!='=')&&(ch!=' ')&&(ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/')&&(ch!='(')&&(ch!=')')&&(ch!='<')&&(ch!='>'))

{       
      words[j++]=ch;
      ch=program[i++];
      if(ch=='@')
	  {
	   end=1;
       i--;/*此时的program[i]=='@'*/
	   break;
	  }   
}     
    i--;
    flag=-1;
}
words[j]   = '\0';
}
/*opereation*/
else
{
    for(m=0;m<=9;m++)
	    words[m]=NULL;	
	switch(ch){
          case'+':{
                 if (ch == '+')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 411;
                 pro=3;
				 break;
				  }
	      case'-':{
                 if (ch == '-')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 414;
                 pro=3;
				 break;
				  }
	      case'*':{
                 if (ch == '*')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 416;
                 pro=3;
				 break;
				  }
	      case'/':{
                 if (ch == '/')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 418;
                 pro=3;
				 break;
				  }
	      case'>':{
                 if (ch == '>')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 404;
                 pro=3;
				 break;
				  }
          case'<':{
                  if (ch == '<')
                      words[j++] = ch;
                  words[j]   = '\0';
                  flag       = 405;
                  pro=3;
				  break;
				  }
          case'=':{
                 if (ch == '=')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 402;
                 pro=3;
				 break;
				  } 
		  case'(':{
                 if (ch == '(')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 502;
                 pro=3;
				 break;
				  }
		  case')':{
                 if (ch == ')')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 503;
                 pro=3;
				 break;
				  }
		  case';':{
                 if (ch == ';')
                     words[j++] = ch;
                 words[j]   = '\0';
                 flag       = 501;
                 pro=3;
				 break;
				  }
		  case'@':{
                   words[j++] = '#';
                   words[j]   = '\0';
				   flag       = 0;
				   end = 1;
                   pro=3;
				   break;
				   }
           default:{
                   flag = -1;
                   
				   break;
				   }
	}
}
return flag;
}
main()
{
i=0;
printf("please input a program");
do
{
  ch           = getchar();
  program[i++] = ch;
}while(ch != '@');
 i = 0;
do{
  flag = Scan(program);
  if (flag == 200)
  {
printf("(INT10,%2d,%d)",flag,number);
  }
  else if (flag == -1)
  {
printf("(%d,error)",flag);
  }
  else if(flag==800)
  {
printf("(INT8,%2d,%4s)",flag,words);
  }
  else if(flag==1600)
  {
printf("(INT16,%2d,%4s)",flag,words);
  }
  else
  {
      if(pro==1)
	     printf("(ORDER,%2d,%4s)",flag,words);
      else if(pro==2)
		      printf("(ID,%2d,%4s)",flag,words);
      else if(pro==3)
		      printf("(OPREATION,%2d,%4s)",flag,words);		     
      else printf("(others,%2d,%4s)",flag,words);
      pro=0;
  }
}while (end != 1);
    system("pause");
}

⌨️ 快捷键说明

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