正文

词法分析器(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();}

阅读(6105) | 评论(1)


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

评论

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