zoukankan      html  css  js  c++  java
  • 实验报告一 --词法分析程序

    实验一、 词法分析程序实验

    专业 计算机科学与技术   姓名 刘东  学号 201506110164

    一、        实验目的

    1. 编制一个词法分析程序

    二、        实验内容和要求

    1. 输入:源程序字符串
    2. 输出:二元组(种别,单词本身)
    3. 待分析语言的词法规则

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

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

    可执行程序名:cifafenxi.exe

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

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

        do

        {

               scanf("%s ",input);

               i=0;

               while(input[i] !='')

               {

                      //printf("char=%c ",input[i]);

                      if(input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/' || input[i] == '=')       //对字符串中的表达式做分词,并记录相应运算符 

                      {

                             //printf(" hello ");

                             p=(NODE*)malloc(sizeof(NODE));

                             p->next=NULL;

                             p->string=(char*)malloc(sizeof(char)*2);

                             p->string[0]='';

                             strncpy(p->string,&input[i],1);

                             p->next=yunsuanfu->next;

                             yunsuanfu->next=p;

                      //     printf("yunsuanfu is %c ",input[i]);

                      }

                      else if(ispunct(input[i]) && input[i] != '~')   //对字符串中出现界符的地方做分词,并记录相应界符

                      {

                             //ch=(char*)malloc(sizeof(NODE));

                             p=(NODE*)malloc(sizeof(NODE));

                             p->next=NULL;

                             p->string=(char*)malloc(sizeof(char)*2);

                             p->string[0]='';

                             strncpy(p->string,&input[i],1);

                             p->next=jiefu->next;

                             jiefu->next=p;

                      }

                      i++;

               }

               ch=strtok(input,delim);

               do

               {

                      if(input[0] =='~')

                             break;

                      q=head;

                      p=(NODE*)malloc(sizeof(NODE));

                      p->next=NULL;

                      p->string=(char*)malloc(sizeof(input));

                      p->string[0]='';

                      strcat(p->string,ch);           //连接前后字符串,合成新的字符串

                      while(q->next !=NULL)

                             q=q->next;

                      p->next=q->next;

                      q->next=p;

               }while(ch=strtok(NULL,delim));         

        }while(input[0] !='~');

                      if(strspn(p->string,biaowords))              //使用strspn()来对字符串中是否含有biaowords数组中的字符,若有则为标识符

                      {

                                    q->string=p->string;

                                    q->next=biaoshi->next;

                                    biaoshi->next=q;                            

                      }

    1. 4.      运行结果及分析

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

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

     

    实验结果与预期基本吻合,但是在界符那里会出现除界符以外其他的字符,我认为出现这一原因是因为在复制字符串的时候多了复制了几位,但修改后得出的结论并不是这样。

    四、        实验总结

    本次实验中我学会了如何通过C来写连接多个任意长度的字符串并返回该字符串。自己动手写了一个小型的分词模块,感觉对功能设计的手段丰富了。其实后来我知道了这个词法分析程序其实并不用做这么多,但我真的通过这次的实验尝试了很多以前没有想过的设计。

    主要的设计问题有:

    1、如何将各个字符串连接起来,使它变成一个新串。

    2、如何区分标识符,界符和运算符

    3、怎么输出结果

    解决方法:

    1、我使用动态数组来存储可变长度的字符串,每次输入一个字符窜后都会计算这个字符串的空间大小,并加上之前全部的空间大小来创建一个新的字符串,并使用strcmp()函数来复制先输入的字符串。

    2、我使用strspn()函数来匹配字符串中哪些是标识符。此前我对整个字符串做了一个分词。

    3、我是使用链表来记录每一个类别(如标识符、运算符、界符等)他们里面分别有哪些字符串。

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    归并排序python实现源码
    华为手机使用应用沙盒动态修改基带参数
    三星5.0以上机器最简单激活Xposed框架的经验
    python正常时间和unix时间戳时间的相互转换源码
    三星5.0以上设备最完美激活XPOSED框架的经验
    华为6.0系统设备最完美激活Xposed框架的经验
    C语言经典算法
    水果店小程序推广步骤笔记
    三星手机使用应用沙盒一键修改路由mac数据
    python通过装饰器检查函数参数的数据类型的代码
  • 原文地址:https://www.cnblogs.com/XiaoG-Liu/p/5942654.html
Copyright © 2011-2022 走看看