编译原理--词法分析


实验1--词法分析实验:

内容:选择部分C语言的语法成分,参考附录C.1设计其词法分析程序,要求能够处理注释、部分复合运算符(如++>=等)。 或者:选择附录C.1简单语言的语法成分,设计其词法分析程序,要求增加注释和换行回车的处理。注意:附录C.1采用的是控制台输入输出的方式,测试数据要另外用文本文件保存好。


#include<string.h>

#include<stdio.h>

#include<stdlib.h>
#include<ctype.h>
char *table[7]={" ","main","int","if","then","else","return"},TOKEN[20],ch;  //定义关键字

int lookup(char *TOKEN){       //关键字匹配函数
      int m,i;
      for(i=1;i<6;i++){
           if((m=strcmp(TOKEN,table[i]))==0)
               return(i);
      }
      return(0);
}

void out(int c,char *TOKEN){      //输出函数
      printf("(%d,%s)\n",c,TOKEN);
}

void scanner(FILE *fp){            //扫描函数
      char TOKEN[20]={'\0'};
      char ch;
      int i,c;

      ch=fgetc(fp);               //获取字符,指针fp并自动指向下一个字符

      if(isalpha(ch)){               //判断该字符是否是字母
           TOKEN[0]=ch;
           ch=fgetc(fp);
           i=1;

           while(isalnum(ch)){        //判断该字符是否是字母或数字
                 TOKEN[i]=ch;
                 i++;
                 ch=fgetc(fp);
           }
           TOKEN[i]='\0';
           fseek(fp,-1,1);            //回退一个字符
           c=lookup(TOKEN);
           if(c==0)
                 out(6,TOKEN);        //输出标识符
           else out(c,TOKEN);         //输出关键字
      }
      else
           if(isdigit(ch)){           //判断是否是数字
                 TOKEN[0]=ch;
                 ch=fgetc(fp);
                 i=1;
                 while(isdigit(ch)){
                      TOKEN[i]=ch;
                      i++;
                      ch=fgetc(fp);
                 }
                 TOKEN[i]='\0';
                 fseek(fp,-1,1);
                 out(7,TOKEN);
           }
           else
            {
               TOKEN[0]=ch;
               switch(ch){
                     case'{':out(17,TOKEN);
                            break;
                      case'}':out(18,TOKEN);
                            break;
                     case',':out(14,TOKEN);
                            break;
                      case';':out(15,TOKEN);
                            break;
                     case'<':ch=fgetc(fp);
                            TOKEN[1]=ch;
                          if(ch=='='){
                            out(9,TOKEN);
                          }
                          else if(ch=='>'){
                            out(11,TOKEN);
                          }
                          else {
                            fseek(fp,-1,1);
                            out(8,TOKEN);
                      }
                          break;
                     case'=':out(10,TOKEN);
                          break;
                    case'>':ch=fgetc(fp);
                            TOKEN[1]=ch;
                          if(ch=='=') out(13,TOKEN);
                          else {
                                fseek(fp,-1,1);
                                out(12,TOKEN);
                            }
                          break;
                     default:printf("error!\n");
                          break;
                 }
           }
}

main()
{
      FILE *fp;
      if((fp=fopen("D:\\test.txt","r"))==NULL){   //读取文件内容,并返回文件指针,该指针指向文件的第一个字符
           fprintf(stderr,"error opening.\n");
           exit(1);
      }
      do{
          ch=fgetc(fp);
           if(ch=='#')                //文件以#结尾,作为扫描结束条件            
                 break;
           if(ch==' ')                //如果是空格,自动跳到下个字符
                 scanner(fp);
           else{
               fseek(fp,-1,1);        //如果不是空格,则回退一个字符并扫描
               scanner(fp);
           }
      }while(ch!='#');
      return(0);
}

你可能感兴趣的:(编译原理--词法分析)