C语言词法分析器

Posted on 2010-04-16 13:17  雅飞士  阅读(1646)  评论(0编辑  收藏  举报

  这学期在学编译原理,老师推荐的教材是陈火旺老师的,但自己却按着蒋立源老师的讲,幸好也无所谓,都一样啦。

   上周实验课做了词法分析器部分,这部分的实验内容,包括预处理,单词分离并归类,也就这些。

   我是用C语言写的C语言的词法分析。

   先将代码保存下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "compil.h"

void checkStr(char *str);

FILE digitFile = fopen("digitFile.c","w");
FILE keyFile = fopen("keyFile.c","w");
FILE identifierFile = fopen("identifierFile.c","w");
FILE errorFile = fopen("errorFile.c","w");

void lexical(FILE *fin)
{
   int i;
   char ch;
   char str[80],file_name[20];
   while(!feof(fin))
   {
      fscanf(fin,"%s",str);             /*空格之间为一串*/
      checkStr(str);
     // printf("%s\n",str);
   }
   fclose(fin);
   getch();
}

void   checkStr(char *str)
{
     char ch;
     char tmp[20];
     
     int i=0,j,k;
     InitKeyTable();
     InitOperatTable();
    // printf("input str:");
    // scanf("%s",str);
     //ch = str[0];
     do{
        ch = str[i]; 
        j = i;                          /* j 为每次循环的开始位置*/
        strcpy(tmp,"");
        if(isalpha(ch)){                 /*字母开头*/
           do{
              ch = str[++i];
           }while(isalpha(ch));
          if(i<strlen(str)){ 
           if(isdigit(ch)){
              printf("%s\t\t标识符\n",&str[j]);
              fprintf(identifierFile,"%s\t\t标识符\n",&str[j]);
              break;
           }
           else{
                
               strncpy(tmp,&str[j],i-j);
               tmp[i-j]='\0';
               if(!isKey(tmp)){
                 printf("%s\t\t 标识符\n",tmp);
                 fprintf(identifierFile,"%s\t\t标识符\n",tmp);
                 continue;
                 }
           }
        } 
        else
         if(!isKey(str)){
             printf("%s\t\t标识符\n",&str[j]);
             fprintf(identifierFile,"%s\t\t标识符\n",&str[j]);
             break;
          }
     }  
        else if(isdigit(ch)){            /*数字开头*/ 
           do{
              ch = str[++i];
           }while(isdigit(ch));
             if((i<strlen(str))&&isdigit(str[0]))
             {  printf("%s\t\t错误的标识符 \n",str);
                fprintf(errorFile,"%s\t\t错误的标识符 \n",str);
             break;
             }
             else{
             strncpy(tmp,&str[j],i-j);
             tmp[i-j]='\0';
             printf("%s\t\t 数字\n",tmp);
             fprintf(digitFile,"%s\t\t 数字\n",tmp);
             continue;
             }
     }
       else {                            /*其他符号开头*/      
        
         do{
           ch = str[++i];
         }while(!isalpha(ch)&&!isdigit(ch));
           strncpy(tmp,&str[j],i-j);
           tmp[i-j]='\0';
           if(!isOperat(tmp))   
              continue;
     }
                                     
   }while(i<strlen(str));
     
}

 以上只是词法分析的关键代码,其他都是些修饰性的代码,贴出来也无意义。

词法分析的程度有益于后面的语法分析。

感觉编译原理不是很好学,要用到很多的知识。数据结构,离散等。

Copyright © 2024 雅飞士
Powered by .NET 8.0 on Kubernetes