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

📄 1926126.cpp

📁 词法分析算法源代码
💻 CPP
字号:
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
int i,j,k,flag,number,state; 
/*status 用于标识是否为关键字,1表示是关键字,0表示否!*/ 
char ch; 
char line[10] = {" "}; //缓冲区,用来存放输入的字母
char program[500]; //program是一个字符型的数组,包括字母,空格,界符,常数,运算符,
int Scan(char program[]) 
{ 
char *keywords[14] = {"void","main","if","else","then","break","int", 
"char","float","include","for","while","printf", "scanf"}; //C语言中的关键字
number = 0; 
state = 0; 
j = 0; 
ch = program[i++]; 
/* To handle the lettle space and stab*/ 

/*处理字母*/ 
if ((ch >= 'a') && (ch <= 'z' )) 
{ 
while ((ch >= 'a') && (ch <= 'z' )) 
{ 
line[j++]=ch; //将第一个字母存入缓冲区
ch=program[i++]; //program是输入的程序,现在是在对program进行扫描
} 
i--; 
line[j++] = '\0'; 
for (k = 0; k < 14; k++) 
if (strcmp (line,keywords[k]) == 0) //判断第一个字符串是否是关键字
switch(k) 
{ 
case 0:
	{ 
		flag = 1; 
        state = 1; 
         break; 
	} 
case 1:
	{ 
     flag = 2; 
     state = 1; 
     break; 
	} 
case 2:
	{ 
      flag = 3; 
      state = 1; 
       break; 
	} 
case 3:
	{ 
      flag = 4; 
      state = 1; 
       break; 
	} 
case 4:
	{ 
       flag = 5; 
       state= 1; 
         break; 
	}  
case 5:
	{ 
      flag = 6; 
      state= 1; 
       break; 
	} 
case 6:
	{ 
      flag = 7; 
       state = 1; 
       break; 
	} 
case 7:
	{ 
      flag = 8; 
      state = 1; 
         break; 
	} 
case 8:
	{ 
      flag = 9; 
       state= 1; 
      break; 
	} 
case 9:
	{ 
      flag = 10; 
      state = 1; 
        break; 
	} 
case 10:
	{ 
     flag = 11; 
     state = 1; 
       break; 
	}
case 11:
	{ 
      flag = 12; 
      state = 1; 
       break; 
	} 
case 12:
	{ 
      flag = 13; 
      state = 1; 
      break; 
	} 
case 13:
	{
		flag=14;
		state=1;
		break;
	}//flag  从1~14为关键字的范围
} 
 if (state == 0) 
{ 
   flag = 100; //flag 为100说明不是关键字
} 
} //到此对关键字处理完成



/*处理数值*/ 
else if ((ch >= '0') && (ch <= '9')) 
{ 
number = 0; 
while ((ch >= '0' ) && (ch <= '9' )) 
{ 
number = number*10+(ch-'0'); 
ch = program[i++]; 
} 
flag = 200; 
i--; 
} //对数字处理完,flag为200表明是数字


/*运算符和界符的处理*/ 
else switch (ch) 
{ 

     case '=':   //对=,==的判断

		 { 
            if (ch == '=') 

                line[j++] = ch; 
                line[j] = '\0'; 
               ch = program[i++]; 
               if (ch == '=') 
			   { 
                   line[j++] = ch; 
                    line[j] = '\0'; 
                    flag = 401; //对program中的字符的标志为???
			   } //对“==”的处理
               else 
			   { 
                   i--; 
                   flag = 402; 
			   } 
 
              break; 
		 } 
         case'>':			  //对>,>=的处理
			 { 
                 if (ch == '>') 
                line[j++] = ch; 
                 line[j] = '\0'; //在字符串的末尾加0为了字符串的输出
                 ch = program[i++]; 

                 if (ch == '=') 
				 { 
                   line[j++] = ch; 
                   line[j] = '\0'; 
                   flag = 403; 
				 } 
                 else 
				 { 
                   i--; 
                    flag = 404; 
				 }				 
                  break; 
			 } 
	/*判断<,<=*/

         case'<':
			 { 
                if (ch == '<') 
                line[j++] = ch; 
                line[j] = '\0'; 
                ch = program[i++]; 				
               if (ch == '=') 
			   { 
                 line[j++] = ch; 
                 line[j] = '\0'; 
                 flag = 405; 
			   } 
              else 
			  {				  
                  i--; 
                 flag = 406; 
			  } 
              break; 
			 }			 

           case'!':
			   { 
                  if (ch == '!') 
                  line[j++] = ch; 
                  line[j] = '\0'; 
                  ch = program[i++]; 
                 if (ch == '=') 
				 { 
                    line[j++] = ch; 
                     line[j] = '\0'; 
                    flag = 407; 
				 } 
                else 
				{ 
                  i--; 
                  flag = 408; 
				}
				
                break; 
			   } 

           case'+':
				   { 
                     if (ch == '+') 
                         line[j++] = ch; 
                          line[j] = '\0'; 
                          ch = program[i++]; 
                     if (ch == '=') 
					 { 
                       line[j++] = ch; 
                       line[j] = '\0'; 
                       flag = 409; 
					 } 

                    else if (ch == '+') 
					{ 
                       line[j++] = ch; 
                       line[j] = '\0'; 
                      flag = 410; 
					} 

                    else 
					{ 
                       i--; 
                       flag = 411; 
					} 
                   break; 
				   } 
            case'-':
					{ 
                       if (ch == '-') 
                       line[j++] = ch; 
                       line[j] = '\0'; 
                       ch = program[i++]; 
                       if (ch == '=') 
					   { 
                          line[j++] = ch; 
                          line[j] = '\0'; 
                          flag = 412; 
					   } 
                       else if( ch == '-') 
					   { 
                          line[j++] = ch; 
                           line[j] = '\0'; 
                         flag = 413; 
					   } 
                         else 
						 { 
                             i--; 
                            flag = 414; 
						 } 
                           break; 
					 } 
			


            case'*':
					{ 
                       if (ch == '*') 
                       line[j++] = ch; 
                        line[j] = '\0'; 
                       ch = program[i++]; 
                        if (ch == '=') 
						{ 
                           line[j++] = ch; 
                           line[j] = '\0'; 
                           flag = 415; 
						} 
                        else 
						{ 
                          i--; 
                          flag = 416; 
						} 
                           break; 
					} 
           case'/':
				{ 
                    if (ch == '/') 
                    line[j++] = ch; 
                    line[j] = '\0'; 
                    ch = program[i++]; 
                    if (ch == '=') 
					{ 
                        line[j++] = ch; 
						line[j] = '\0'; 
                        flag = 417; 
					} 
                        else 
						{ 
                            i--; 
                           flag = 418; 
						} 
                          break; 
					} //flag从401到418为运算符的范围
	//对界符进行处理,flag从501到513为界符的范围
        case';':
			{ 
                 line[j] = ch; 
                 line[j+1] = '\0'; 
                 flag = 501; 
                  break; 
			} 
        case'(':
			{ 
               line[j] = ch; 
                line[j+1] = '\0'; 
               flag = 502; 
               break; 
			} 
       case')':
		   { 
             line[j] = ch; 
             line[j+1] = '\0'; 
              flag = 503; 
              break; 
		   } 
        case'[':
			{ 
               line[j] = ch; 
               line[j+1] = '\0'; 
               flag = 504; 
                 break; 
			} 
       case']':
		   { 
              line[j] = ch; 
              line[j+1] = '\0'; 
              flag = 505; 
            break; 
		   } 
      case'{':
		  { 
            line[j] = ch; 
            line[j+1] = '\0'; 
            flag = 506; 
              break; 
		  } 
      case'}':
		  { 
            line[j] = ch; 
            line[j+1] = '\0'; 
            flag = 507; 
             break; 
		  } 
      case':':
		  { 
           line[j] = ch; 
           line[j+1] = '\0'; 
           flag = 508; 
            break; 
		  } 
     case'"':
		 { 
           line[j] = ch; 
           line[j+1] = '\0'; 
           flag = 509; 
             break; 
		 } 

     case'%':
		 { 
            if (ch == '%') 
            line[j++] = ch; 
            line[j] = '\0'; 
            ch = program[i++]; 
           if (ch == '=') 
		   { 
             line[j++] = ch; 
             line[j] = '\0'; 
             flag = 510; 
		   } 
          else 
		  { 
            i--; 
            flag = 511; 
		  } 
             break; 
		 } 
    case',':
		{ 
          line[j] = ch; 
          line[j+1] = '\0'; 
          flag = 512; 
            break; 
		} 
	case'.':
		{
			line[j]=ch;
			line[j+1]='\0';
			flag=513;
			break;
		}
    case'#':
		{ 
           line[j] = ch; 
            line[j+1] = '\0'; 
            flag = 513; 
             break; 
		} 
   case'$':
	   { 
           line[j] = '#'; 
           flag = 0; 
            break; 
	   } //程序输入结束
	   //虑空格,回车,TAB
   case' ':
	   {
		   line[j]=ch;
		   line[j+1]='\0';
		   flag=555;
		   break;
	   }
   case'\n':
	   {
		   line[j]=ch;
		   line[j+1]='\0';
		   flag=556;
		   break;
	   }
   case 9:
	   {
		   line[j]=ch;
		   flag=557;
		   break;
	   }

   default:
	   { 
           flag = -1; 
            break; 
	   } 
   } 

  return flag; 
    } 


   void main() 
   { 
      i=0; 
      printf("请输入程序并以$做为结束输入完成的标志:\n"); 
      do 
	  { 
       ch = getchar(); 
       program[i++] = ch; 
	  }while(ch != '$'); 
       i = 0; 
     do{ 
       flag = Scan(program); 
        if (flag == 200) 
		{ 
         printf("(%d,%d)\n",flag,number); 
		} 
        else if (flag == -1) 
		{ 
         printf("(%d,error)\n",flag); 
		} 
          else 
		  { 
            printf("(%d,%s)",flag,line); 
		  } 
	 }while (flag != 0); 
 
   } 

⌨️ 快捷键说明

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