• 实验一 : 词法分析实验报告


    实验一、词法分析实验

    专业:商业软件工程  姓名:蔡锐彬  学号:201506110107

    一、        实验目的

    编制一个词法分析程序

    二、        实验内容和要求

      输入:源程序字符串

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

    待分析语言的词法规则

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

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

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

    2.      原理分析及流程图

    主要总体设计问题。

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

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

    1. #include <stdio.h>
      #include <string.h>
      char prog[666],token[8],ch;
      int syn,p,m,n,sum;
      char *rwtab[6]={"begin","if","then","while","do","end"};
      scaner();
      main()
      {
          p=0;
          printf("\n please input a string(end with '#'):\n");
          do{
              scanf("%c",&ch);
              prog[p++]=ch;
          }while(ch!='#');
          p=0;
          do{
              scaner();
              switch(syn)
              {
                  case 11:printf("( %-10d%5d )\n",sum,syn);
                  break;
                  case -1:printf("you have input a wrong string\n");
                  getch();
                  exit(0);
                  default: printf("( %-10s%5d )\n",token,syn);
                  break;
              }
          }while(syn!=0);
          getch();
      }
          scaner()
          {  
              sum=0;
          for(m=0;m<8;m++)token[m++]=NULL;
          ch=prog[p++];
          m=0;
          while((ch==' ')||(ch=='\n'))ch=prog[p++];
          if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
          { 
              while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
              {
                  token[m++]=ch;
                  ch=prog[p++];
              }
              p--;
              syn=10;
              for(n=0;n<6;n++)
                  if(strcmp(token,rwtab[n])==0)
                      { 
                          syn=n+1;
                          break;
                      }
          }
          else if((ch>='0')&&(ch<='9'))
          { 
              while((ch>='0')&&(ch<='9'))
              { 
                  sum=sum*10+ch-'0';
                  ch=prog[p++];
              }
              p--;
              syn=11;
          }
          else switch(ch)
          { 
              case '<':token[m++]=ch;
                  ch=prog[p++];
                  if(ch=='=')
                  {  
                      syn=22;
                      token[m++]=ch;
                  }
                  else
                  {  
                      syn=20;
                      p--;
                  }
                  break;
              case '>':token[m++]=ch;
                  ch=prog[p++];
                  if(ch=='=')
                  { 
                      syn=24;
                      token[m++]=ch;
                  }
                  else
                  { 
                      syn=23;
                      p--;
                  }
                  break;
              case '+': token[m++]=ch;
                  ch=prog[p++];
                  if(ch=='+')
                  { 
                      syn=17;
                      token[m++]=ch;
                  }
                  else
                  { 
                      syn=13;
                      p--;
                  }
                  break;
              case '-':token[m++]=ch;
                  ch=prog[p++];
                  if(ch=='-')
                  { 
                      syn=29;
                      token[m++]=ch;
                  }
                  else
                  { 
                      syn=14;
                      p--;
                  }
                  break;
              case '!':ch=prog[p++];
                  if(ch=='=')
                  { 
                      syn=21;
                      token[m++]=ch;
                  }
                  else
                  { 
                      syn=31;
                      p--;
                  }
                  break;
              case '=':token[m++]=ch;
                  ch=prog[p++];
                  if(ch=='=')
                  {    
                      syn=25;
                      token[m++]=ch;
                  }
                  else
                  { 
                      syn=18;
                      p--;
                  }
                  break;
              case '*': syn=15;
                  token[m++]=ch;
                  break;
              case '/': syn=16;
                  token[m++]=ch;
                  break;
              case '(': syn=27;
                  token[m++]=ch;
                  break;
              case ')': syn=28;
                  token[m++]=ch;
                  break;
              case '{': syn=5;
                  token[m++]=ch;
                  break;
              case '}': syn=6;
                  token[m++]=ch;
                  break;
              case ';': syn=26;
                  token[m++]=ch;
                  break;
              case '\"': syn=30;
                  token[m++]=ch;
                  break;
              case '#': syn=0;
                  token[m++]=ch;
                  break;
              case ':':syn=17;
                  token[m++]=ch;
                  break;
              default: syn=-1;
                  break;
                  }
          token[m++]='\0';
          printf("感谢您使用本程序!");
      }

       4.      运行结果及分析

      一般必须配运行结果截图,结果是否符合预期及其分析。   (截图需根据实际,截取有代表性的测试例子)  

    四、  实验总结

    在进行词法分析对比关键字的时候总是容易出错,,进行程序检查的时候发现是细节问题处理得不好,同时程序不够整洁,不能够有效的简化程序内容,总的来说程序有待改进。

     

  • 相关阅读:
    QNET弱网测试工具
    echart
    数组按照一大一小打乱排列
    根据环境开启 vconsole
    时间戳在ios上面显示NAN Bug
    去除字符串中html标签
    ios 上 复选框背景黑边bug
    echarts配置项说明
    JS 数据处理技巧及小算法
    js中最常用的几种遍历数据方法
  • 原文地址:https://www.cnblogs.com/bin763043666/p/5961151.html
Copyright © 2020-2023  润新知