司徒春燕

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

实验一、词法分析实验

 

专业:商软2班   姓名:司徒春燕  学号:201506110187

 

 

 

一、        实验目的

 

     编制一个词法分析程序。

 

二、        实验内容和要求

      输入:源程序字符串

 

输出:二元组(种别,单词本身)

 

待分析语言的词法规则。

 

 

三、        实验方法、步骤及结果测试

 

  1. 1.      源程序名:压缩包文件(rarzip)中源程序名×××.c

可执行程序名:×××.exe

 

词法分析.c 

 

  1. 2.      原理分析及流程图

 

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

 

原理分析:让用户输入程序代码,将代码以字符串的形式存入文件中,再将文件作为参数传到词法分析函数中,识别出各个具有独立意义的单词,即基本关键字、标识符、数字、运算符、分隔符五大类。并依次输出各个单词的种别。

 

 

流程图:

 

  1. 3.      主要程序段及其解释:

实现主要功能的程序段,重要的是程序的注释解释。

 

FILE *fp;

    char ch;

    printf("请输入源程序代码(以#键结束):\n");

    if((fp=fopen("data.txt","w"))==NULL)

    {

           printf("Failure to open data.txt!\n");

        exit(0);

    }

    ch=getchar();

    while(ch!='#') //将字符串存放到文件中

    {

           fputc(ch,fp);

        ch=getchar();

    }

fclose(fp);

 

 

 

//词法分析,识别文件中的字符串

while(!feof(fp))

   {

          if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||ch=='='||ch=='>'||ch=='<') //判断判断运算符

                 printf("%c\t运算符\n",ch);

        else if(ch==';'||ch=='{'||ch=='}'||ch=='('||ch==')')//判断分隔符

                 printf("%c\t分隔符\n",ch);

 

 

        else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') 

//判断字符是不是字母

          {

                 if((fp1=fopen("data1.txt","w"))==NULL)

                 {

                        printf("Failure to open data1.txt!\n");

                exit(0);

                 }

            while(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')

//将每个字母合并成一个字符串放到一个新的文件中

                 {

                        fputc(ch,fp1);

                i++;

                ch=fgetc(fp);

                 }

            fclose(fp1);

 

            if((fp1=fopen("data1.txt","rb"))==NULL)

//从文件中读取字符串

                 {

                        printf("Failure to open data1.txt!\n");

                exit(0);

                 }

            fgets(alp,i+1,fp1);

            for(j=0;j<30;j++)

                 {

                        if(strcmp(alp,keyword[j])==0)

//判断是否为关键字或标识符

                flag=1;

                 }

            if(flag==1)

                        printf("%s\t关键字\n",alp);

            else

                        printf("%s\t标识符\n",alp);

            fclose(fp1);

            Analyse(fp,ch);

          }

 

 

 

        else if(ch=='\n'||ch==' ')//识别回车和空格

                 printf("\r");

 

 

 

        else if(ch>='0'&&ch<='9')//识别数字

          {

                 if((fp2=fopen("data2.txt","w"))==NULL)

                 {

                        printf("Failure to open data2.txt!\n");

                exit(0);

                 }

            while(ch>='0'&&ch<='9')

                 {

                        fputc(ch,fp2);

                n++;

                ch=fgetc(fp);

                 }

            fclose(fp2);

            if((fp2=fopen("data2.txt","rb"))==NULL)

                 {

                        printf("Failure to open data2.txt!\n");

                exit(0);

                 }

            fgets(num,n+1,fp2);

            printf("%s\t数字\n",num);

            fclose(fp2);

            Analyse(fp,ch);//递归继续识别

}

 

 

 

  1. 4.      运行结果及分析

一般必须配运行结果截图,结果是否符合预期及其分析。

   (截图需根据实际,截取有代表性的测试例子)

 

 

 

 

 

 

四、        实验总结

 

心得体会,实验过程的难点问题及其解决的方法。

 

这次实验对我来说是挺难的,花了很长的时间来做的,程序还有很多地方有待完善。

实验过程中我觉得比较难的是输入源程序,然后录入,再者就是从文件中识别字符串,我通过向同学请教,得知字符串可以存放在文件中,然后整个程序是靠文件来支撑的。

 

 

posted on 2016-10-14 14:33  187司徒春燕  阅读(315)  评论(1编辑  收藏  举报