正文

词法分析器(C语言版)2007-06-06 22:59:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/tld5yj/26461.html

分享到:

这是我用C语言编写的能识别C语言的关键字之类的一个词法分析器,需要有一个程序文件,然后在程序的第一行把#define Filaname “文件名”的那个文件名换成要识别的文件的准确路径,之后就运行就可以了,这个程序是在TurboC 2.0和本网站提供的TC for windows 3.1中调试成功的,如有问题请及时联系我,谢谢!(自认为不足之处就是没有调用函数,一个main弄到底,还有就是没有注释,看不懂的话千万不要硬撑啊!)

#define Filename "1.txt"
#include<string.h>
#include<stdio.h>

main()
{char keyword[32][9]={"auto","break","case","char","const","continue","default","double","do","else","enum","extern","float","for","goto","if","int","long","register","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};
 char sing[40][5]={"->","++","--","<<",">>","<=",">=","==","!=","&&","||","?:","+=","-=","*=","/=","%=",">>=","<<=","&=","|=","^=","=",".","!","~","-","*","&'","/","%","+","<",">","^","|'","?",":",",",";"};
 char *s;
 char temp[10][9],ci[9];
 char *go,*now;
 int i,j,n,k,out,tag1=0,tag2=0,tag3=0;
 FILE *p;
 if((p=fopen(Filename,"r"))==NULL)
 {printf("Can't open the file!");
  exit(0);
 }
 while(!feof(p))  /*while*/
 {fgets(s,100,p);
  now=s;
  go=now;
  while((*now)!='\0')  /*startwhile*/
  {if((*now)==' '||(*now)=='\n')
   {now=now+1;
    go=now;
    continue;
   }
   if((*now)=='/'&&(*(now+1))=='*')  /*startif*/
   {printf("Sign: /*\n");
    go=go+2;
    printf("Instruction: ");
    for(;!((*go)=='*'&&(*(go+1))=='/');go++)
    printf("%c",*go);
    printf("\n");
    printf("Sign: */\n");
    go=go+2;
    now=go;
    continue;
   }  /*endif1 endwhile*/
   else if(((*now)=='(')||((*now)==')')||((*now)=='[')||((*now)==']')||((*now)=='{')||((*now)=='}'))
   {printf("Sign: %c\n",*now);
    tag1++;
    now++;
    go=now;
    continue;
   }
   else if((*now)=='\'')
   {printf("Sign: ");
    printf("%c\n",*now);
    tag2++;
    now++;
    go=now;
    continue;
   }
   else if((*now)=='"')
   {printf("Sign: ");
    printf("%c\n",*now);
    tag3++;
    now++;
    go=now;
    continue;
   }
   else if(((*now)!='"')&&tag3%2==1)
   {if((*now)!='%')
    {printf("Const Strng: ");
     for(;((*go)!='"')&&((*go)!='%');go++)
     printf("%c",*go);
     printf("\n");
    }
    else
    {printf("Sign: ");
     do
     {printf("%c",*go);
      go++;
     }while(((*go)!='"')&&((*go)!='%'));
     printf("\n");
    }
    now=go;
    continue;
   }
   else if((*now)=='&')
   {printf("Sign: %c\n",*now);
    go++;
    now=go;
    continue;
   }
   else if((*now)=='#')
   {printf("Headfile: ");
    for(;(*go)!=' '&&(*go)!='\n'&&(*go)!='\0';go++)
    printf("%c",*go);
    printf("\n");
    now=go;
    continue;
   }  /*endif2 endwhile*/
   else if(((*now)>='a'&&(*now)<='z')||((*now)>='A'&&(*now)<='Z')||((*now)=='_')) 
   {i=0;
    for(n=0;n<32;n++)
    {if((*go)==keyword[n][0])
     {for(k=0;k<strlen(keyword[n]);k++)
      temp[i][k]=keyword[n][k];
      for(k=strlen(keyword[n]);k<10;k++)
      temp[i][k]='\0';
      i++;
     }
    }
    j=i;
    if(i==0)
    {printf("Identifier: ");
     for(;(*go)!=' '&&(*go)!='\n'&&(*go)!='\0';go++)
     {if(((*go)>='a'&&(*go)<='z')||((*go)>='A'&&(*go)<='Z')||((*go)=='_')||((*go)>='0'&&(*go)<='9'))
      printf("%c",*go);
      else break;
     }
     printf("\n");
     now=go;
     continue;
    }
    for(k=0;k<j;k++)
    {for(i=0;i<strlen(temp[k]);i++)
     {ci[i]=(*go);
      go=go+1;
     }
     for(i=strlen(temp[k]);i<9;i++)
     ci[i]='\0';
     if((strcmp(ci,temp[k])==0&&(*go)==' ')||(strcmp(ci,temp[k])==0&&(*go)=='\0')||(strcmp(ci,temp[k])==0&&(*go)=='\n'))
     {printf("Keyword: ");
      for(out=0;out<strlen(temp[k]);out++)
      printf("%c",temp[k][out]);
      printf("\n");
      now=go;
      break;
     }
     else
     {go=now;
      continue;
     }
    }
    if(k>=j)
    {go=now;
     printf("Identifier: ");
     for(;(*go)!=' '&&(*go)!='\n'&&(*go)!='\0';go++)
     {if(((*go)>='a'&&(*go)<='z')||((*go)>='A'&&(*go)<='Z')||((*go)>='0'&&(*go)<='9'))
      printf("%c",*go);
      else break;
     }
     printf("\n");
     now=go;
     continue;
    }
   }  /*endif3 endwhile*/
   else if((*now)>='0'&&(*now)<='9')
   {printf("Const: ");
    for(;(*go)>='0'&&(*go)<='9';go++)
    printf("%c",*go);
    printf("\n");
    now=go;
    continue;
   }  /*endif4 endwhile*/
   else
   {i=0;
    for(n=0;n<40;n++)
    {if((*go)==sing[n][0])
     {for(k=0;k<strlen(sing[n]);k++)
      temp[i][k]=sing[n][k];
      for(k=strlen(sing[n]);k<10;k++)
      temp[i][k]='\0';
      i++;
     }
    }
    j=i;
    if(i==0)
    {now=now+1;
     go=now;
     continue;
    }
    for(k=0;k<j;k++)
    {for(i=0;i<strlen(temp[k]);i++)
     {ci[i]=(*go);
      go=go+1;
     }
     for(i=strlen(temp[k]);i<9;i++)
     ci[i]='\0';
     if(strcmp(ci,temp[k])==0)
     {printf("Sign: ");
      for(out=0;out<strlen(temp[k]);out++)
      printf("%c",temp[k][out]);
      printf("\n");
      now=go;
      break;
     }
     else
     {go=now;
      continue;
     }
    }
    if(k>=j)
    {go=now;
     printf("Identifier: ");
     for(;(*go)!=' '&&(*go)!='\n'&&(*go)!='\0';go++)
     printf("%c",*go);
     printf("\n");
     now=go;
     continue;
    }
   }  /*ednif5 endwhile*/
  }  /*endwhile*/
 }  /*while*/
 fclose(p);
 printf("\n");
 if(tag1%2==1)
 {printf("Error:\n");
  printf("Maybe wrong match in \"()\",\"[]\" or \"{}\"!\n");
 }
 if((tag2%2==1)||(tag3%2==1))
 {printf("Error:\n");
  printf("Maybe wrong match in \" ' \" or \" \" \"!\n");
 }
 printf("\nPress Enter key to exit...");
 getchar();
}

阅读(5881) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册