• 算法分析实验报告


    实验一、词法分析实验

    商业软件工程专业   赖锐扬  201506110129

    一、 实验目的

    通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。

    二、 实验内容和要求

    在原程序中输入源代码

    • 对字符串表示的源程序  
    • 从左到右进行扫描和分解
    • 根据词法规则
    • 识别出一个一个具有独立意义的单词符号
    • 以供语法分析之用
    • 发现词法错误,则返回出错信息

    在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。

    1. 识别关键字:main if int for while do return break continue,该类的单词码为1.
    2. 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
    3. 运算符:+、-、*、/、=、>、<、>=、<=、!=
    4. 分隔符:,、;、{、}、(、)
    5. 常数,如123,4587

    各种单词符号对应的种别码。

    输出形式:

    • 二元式

    – (单词种别,单词自身的值)

    • 单词种别,表明单词的种类,语法分析需要的重要信息

    – 整数码

    • 关键字、运算符、界符:一符一码
    • 标识符:10, 常数:11
    • 单词自身的值

    – 标识符token、常数sum

    – 关键字、运算符、界符token

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

    1. 源程序名:编译原理.zip 算法分析.c

             可执行程序名:实验报告.exe

    1. 原理分析及流程图

           

    1. 主要程序段及其解释:程序运行稳定
      #include<stdio.h>
      #include <string.h>
      char string[80],simbol[8],ch;
      int wordID,index,m,n,sum;
      char *rwtab[6]={"begin","if","then","while","do","end"};
      void scaner(void);
      
      main()
      {
          int index=0;
       printf("请输入字符串并以#为结束:");
      
          do{
                  scanf("%c",&ch);
                  string[index++]=ch;
          }while(ch!='#');
      
          index=0;
          do{
                  scaner();
                  switch(wordID)
                  {
                      case 11:
                          printf("( %-10d%5d )\n",sum,wordID);
                      break;
      
                      case -1:
                          printf("你有个字符串错了哦~\n");
                          return 0;
                      break;
      
                      default:
                      printf("( %-10s%5d )\n",simbol,wordID);
                      break;
                  }
              }while(wordID!=0);
       return 0;
       }
      
      void scaner(void)
      {
          sum=0;
      
          for(m=0;m<8;m++)
              simbol[m++]= NULL;
      
              ch=string[index++];
              m=0;
      
          while((ch==' ')||(ch=='\n'))
              ch=string[index++];
      
          if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
           {
              while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
              {
                  simbol[m++]=ch;
                  ch=string[index++];
              }
      
              index--;
              wordID=10;
      
              for(n=0;n<6;n++)
              if(strcmp(simbol,rwtab[n])==0)
              {
                  wordID=n+1;
                  break;
              }
           }
           else if((ch>='0')&&(ch<='9'))
           {
              while((ch>='0')&&(ch<='9'))
              {
                  sum=sum*10+ch-'0';
                  ch=string[index++];
              }
              index--;
              wordID=11;
          }
          else
          {
              switch(ch)
              {
              case '<':
                  simbol[m++]=ch;
                  ch=string[index++];
                  if(ch=='=')
                  {
                      wordID=22;
                      simbol[m++]=ch;
                  }
                  else
                  {
                      wordID=20;
                      index--;
                  }
              break;
      
              case '>':
                  simbol[m++]=ch;
                  ch=string[index++];
                  if(ch=='=')
                  {
                      wordID=24;
                      simbol[m++]=ch;
                  }
                  else
                  {
                      wordID=23;
                      index--;
                  }
              break;
      
              case '+':
                  simbol[m++]=ch;
                  ch=string[index++];
                  if(ch=='+')
                  {
                      wordID=17;
                      simbol[m++]=ch;
                  }
                  else
                  {
                      wordID=13;
                      index--;
                  }
              break;
      
              case '-':
                  simbol[m++]=ch;
                  ch=string[index++];
                  if(ch=='-')
                  {
                      wordID=29;
                      simbol[m++]=ch;
                  }
                  else
                  {
                      wordID=14;
                      index--;
                  }
              break;
      
              case '!':
                  ch=string[index++];
                  if(ch=='=')
                  {
                      wordID=21;
                      simbol[m++]=ch;
                  }
                  else
                  {
                      wordID=31;
                      index--;
                  }
              break;
      
              case '=':
                  simbol[m++]=ch;
                  ch=string[index++];
                  if(ch=='=')
                  {
                      wordID=25;
                      simbol[m++]=ch;
                  }
                  else
                  {
                      wordID=18;
                      index--;
                  }
              break;
      
              case '*':
                  wordID=15;
                  simbol[m++]=ch;
              break;
      
              case '/':
                  wordID=16;
                  simbol[m++]=ch;
              break;
      
              case '(':
                  wordID=27;
                  simbol[m++]=ch;
              break;
      
              case ')':
                  wordID=28;
                  simbol[m++]=ch;
              break;
      
              case '{':
                  wordID=5;
                  simbol[m++]=ch;
              break;
      
              case '}':
                  wordID=6;
                  simbol[m++]=ch;
              break;
      
              case ';':
                  wordID=26;
                  simbol[m++]=ch;
              break;
      
              case '\"':
                  wordID=30;
                  simbol[m++]=ch;
              break;
      
              case '#':
                  wordID=0;
                  simbol[m++]=ch;
              break;
      
              case ':':
                  wordID=17;
                  simbol[m++]=ch;
              break;
      
              default:
                  wordID=-1;
              break;
              }
          }
              simbol[m++]='\0';
      }
      1. 运行结果及分析

      输入源代码:begin if then while do end : #

      符合个字符的单词码

      一、 实验总结

       编译原理难学啊  词法分析器好难懂啊

  • 相关阅读:
    HDU
    HDU
    CodeForces
    HDU——2955 Robberies (0-1背包)
    南京区域赛之后
    算法作业三-哈夫曼编码
    HDU
    POJ 1220 NUMBER BASE CONVERSION(进制转换,大数)
    HDU 1535 Invitation Cards(最短路)
    HDU 3572 Task Schedule(网络流+当前弧优化)
  • 原文地址:https://www.cnblogs.com/129lai/p/5961213.html
Copyright © 2020-2023  润新知