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

📄 2.cpp

📁 用vc编写的一个词法分析源程序
💻 CPP
字号:

#include  <stdio.h>  
#include  <stdlib.h>  
#include  <string.h>  
 
void  getch();  
void  getsym();  
 
typedef  struct  tag_keywordarray  /*  存放关键字  */  
{  
       char  a[20];  
             
}keywordarray[10];  
 
typedef  struct  tag_token            /*  存放种别码和值的  */  
{  
       int  sym;  
       char  symbol[10];  
             
}token[100];  
 
keywordarray  keyword={            "begin","end","for","if","integer","procedure","read",  
"repeat","var","write"};  
static  token  token_PL;  
static  int  cc=0;  
static  int  j=0;  
static  char  line[50];  
char  ch;  
bool  RLP=true;  
 
void  main(void)  
{  
       int  i;  
       getsym();  
       for(i=0;i<j;i++)  
       {  
               printf("<");  
               printf("%d,",token_PL[i].sym);  
               printf("%s>  ",token_PL[i].symbol);  
       }  
       if(RLP==false)  
       {  
                   printf("\nNone  of  ')'\n");  
       }  
       system("pause");  
}  
 
void  getsym()  
{  
       int  k;  
       int  i;  
       char  A[10];  
       char  id[10];  
 
       while(ch==NULL)  
       {  
               getch();  
       }  
       /*  判断ch是否有字  */  
 
           while(ch!='\n')  
           {  
                       if((ch>='A'  &&  ch<='Z')  || (ch>='a'  &&  ch<='z'))  
                                   /*  判断取出的字是否为字母  */  
                       {  
                                   k=0;  
                                   A[k]=ch;  
                                   k=k+1;  
                                   getch();  
                                   while(1)  
                                   {  
                                               if((ch>'A'  &&  ch<'Z')   || (ch>='a'  &&  ch<='z' )||(ch>='0'  &&  ch<='9'))  
                                               {  
                                                           if(k<10)  
                                                           {  
                                                                       A[k]=ch;  
                                                                       k=k+1;  
                                                                       getch();  
                                                           }  
                                                           else  
                                                           {  
                                                                       getch();  
                                                                       /*  k>10则继续取词,但对后面的不错处理,截取前10个  */  
                                                           }  
                                               }  
                                               else  
                                               {  
                                                           cc-=1;  
                                                           break;  
                                               }  
                                   }  
 
                                   for(i=0;i<k;i++)  
                                   {  
                                               id[i]=A[i];  
                                   }  
                                   id[i]='\0';  
 
                                   bool  bKeyword=false;  
                                   for(i=0;i<10;i++)  
                                   {  
                                               if((stricmp(id,keyword[i].a))==0)  
                                               {  
                                                           token_PL[j].sym=1;  
                                                           strcpy(token_PL[j].symbol,keyword[i].a);  
                                                           j=j+1;  
                                                           bKeyword=true;  
                                                           break;  
                                               }  
                                   }  
                                   if(!bKeyword)  
                                   {  
                                               token_PL[j].sym=2;  
                                               strcpy(token_PL[j].symbol,id);  
                                               j=j+1;  
                                   }  
 
                       }  
                       else  
                       {  
                                   if(ch>='0'  &&  ch<='9')  /*  判断是否为数字  */  
                                   {  
                                               k=0;  
                                               A[k]=ch;  
                                               k=k+1;  
                                               getch();  
                                               while(1)  
                                               {  
                                                           if(ch>='0'  &&  ch<='9')  
                                                           {  
                                                                       if(k<10)  
                                                                       {  
                                                                                   A[k]=ch;  
                                                                                   k=k+1;  
                                                                                   getch();  
                                                                       }  
                                                                       else  
                                                                       {  
                                                                                   getch();  
                                                                       }  
                                                           }  
                                                           else  
                                                           {  
                                                                       cc-=1;  
                                                                       break;  
                                                           }  
                                               }  
                                               token_PL[j].sym=4;  
                                               A[k]='\0';  
                                               strcpy(token_PL[j].symbol,A);  
                                               j=j+1;  
                                   }  
                                   else    /*  是否为操作符  */  
                                   {  
                                               if(ch=='+')  
                                               {  
                                                           k=0;  
                                                           A[k]=ch;  
                                                           token_PL[j].sym=3;  
                                                           A[k+1]='\0';  
                                                           strcpy(token_PL[j].symbol,A);  
                                                           j=j+1;  
                                               }  
                                               else  if(ch=='-')  
                                               {  
                                                           k=0;  
                                                           A[k]=ch;  
                                                           token_PL[j].sym=3;  
                                                           A[k+1]='\0';  
                                                           strcpy(token_PL[j].symbol,A);  
                                                           j=j+1;  
                                               }  
                                               else  if(ch=='*')  
                                               {  
                                                           k=0;  
                                                           A[k]=ch;  
                                                           token_PL[j].sym=3;  
                                                           A[k+1]='\0';  
                                                           strcpy(token_PL[j].symbol,A);  
                                                           j=j+1;  
                                               }  
                                               else  if(ch=='/')  
                                               {  
                                                           k=0;  
                                                           A[k]=ch;  
                                                           token_PL[j].sym=3;  
                                                           A[k+1]='\0';  
                                                           strcpy(token_PL[j].symbol,A);  
                                                           j=j+1;  
                                               }  
                                               else  if(ch==':')  
                                               {  
                                                           k=0;  
                                                           A[k]=ch;  
                                                           getch();  
                                                           if(ch=='=')  
                                                           {  
                                                                       k=k+1;  
                                                                       A[k]=ch;  
                                                           }  
                                                           token_PL[j].sym=3;  
                                                           A[k+1]='\0';  
                                                           strcpy(token_PL[j].symbol,A);  
                                                           j=j+1;  
                                               }  
                                                                         else  if(ch=='"')  
                                               {  
                                                           k=0;  
                                                           A[k]=ch;  
                                                           token_PL[j].sym=5;  
                                                           A[k+1]='\0';  
                                                           strcpy(token_PL[j].symbol,A);  
                                                           j=j+1;  
                                               }  
 
                                                                         else  if(ch=='(')  
                                               {  
                                                           k=0;  
                                                           A[k]=ch;  
                                                           token_PL[j].sym=5;  
                                                           A[k+1]='\0';  
                                                           strcpy(token_PL[j].symbol,A);  
                                                           j=j+1;  
                                                                                           RLP=false;  
                                               }  
                                                                         else  if(ch==')')  
                                               {  
                                                           k=0;  
                                                           A[k]=ch;  
                                                           token_PL[j].sym=5;  
                                                           A[k+1]='\0';  
                                                           strcpy(token_PL[j].symbol,A);  
                                                           j=j+1;  
                                                                                           RLP=true;  
                                               }  
 
                                   }  
                       }  
                       getch();  
           }  
 
 }  
 
 
 void  getch()  
 {  
             if(line[0]==NULL)  
                         /*  如果缓冲中第一个位置为空的话,就认为未有语句输入  */  
             {  
                         int  i=-1;  
                         do  
                         {  
                                     i++;  
                                     scanf("%c",&line[i]);    
                         }while(line[i]!='\n');  
             }  
             ch=line[cc];      /*  取出一词  */  
             cc=cc+1;  
 }      /*  cc该声明为static比较好  */

⌨️ 快捷键说明

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