• 词法分析实验报告


    实验一、词法分析实验

    商业软件工程   麦振澎  201506110162

    一、        实验目的

      对用户输入的字符串进行判断,区分它们的类型,熟悉词法分析的过程。

    二、        实验内容和要求

         用户输入的字符串进行判断,分别输出每个字符串所属的类型。其中的判断标准如下:

        无符号整数:<整数>{<整数>}

        标识符:<字母>{<字母><数字>}

        数字:0|1|2|......|8|9

        字母:a|b|......x|y|z

        保留字:const|var|procedur|begin|end|odd|if|then|call|while|do|read|write

        运算符:+|-|*|/|=|#|<|<=|>|>=|:=

        界符:(|)|,|;|.

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

    1.       源程序名:cifafenxi.c,可执行程序名:cifafenxi.exe
    2.       原理分析及流程图
        
        
    3. 主要程序段及其解释:

      (1). 将保留字存放在数组中:
        
      char const_temp[6]={'c','o','n','s','t',' '};
      char var_temp[4]={'v','a','r',' '};
      char procedur_temp[9]={'p','r','o','c','e','d','u','r',' '};
      char begin_temp[6]={'b','e','g','i','n',' '};
      char end_temp[4]={'e','n','d',' '};
      char odd_temp[4]={'o','d','d',' '};
      char if_temp[3]={'i','f',' '};
      char then_temp[5]={'t','h','e','n',' '};
      char call_temp[5]={'c','a','l','l',' '};
      char while_temp[6]={'w','h','i','l','e',' '};
      char do_temp[3]={'d','o',' '};
      char read_temp[5]={'r','e','a','d',' '};
      char write_temp[6]={'w','r','i','t','e',' '};

      2).判断数字和无符号整数:

      if(ch>='0'&&ch<='9')
              {
                  chtemp=getchar();
                  if(chtemp<'0'||chtemp>'9')
                  {
                      printf("数字:%c
      ",ch);
                      ch=chtemp;
                  }
                  else
                  {
                      printf("无符号整数:%c",ch);
                      ch=chtemp;
                      while(ch>='0'&&ch<='9')
                      {
                          printf("%c",ch);
                          ch=getchar();
                      }
                      printf("
      ");
                  }
              }

      3).判断字母和标识符以及保留字:

      else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
              {
                  chtemp=getchar();
                  if((chtemp<'a'||chtemp>'z')&&(chtemp<'A'||chtemp>'Z'))
                  {
                      printf("字母:%c
      ",ch);
                      ch=chtemp;
                  }
                  else
                  {
                      if(chtemp!='
      '&&(ch=='v'||ch=='p'||ch=='b'||ch=='e'||ch=='o'||ch=='i'||ch=='t'||ch=='d'||ch=='r'))
                          ch=Keyworld_first(ch,chtemp);
                      else if(chtemp!='
      '&&(ch=='w'||ch=='c'))
                          ch=Keyworld_double(ch,chtemp);
                      else
                      {
                          printf("标识符:%c%c",ch,chtemp);
                          if(chtemp=='
      ')break;
                          ch=getchar();
                          while(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
                          {
                              printf("%c",ch);
                              ch=getchar();
                          }
                          printf("
      ");
                      }
                  }
              }

      4).判断运算符:

      else if(ch=='+'||ch=='-'||ch=='*'||ch=='='||ch=='<'||ch=='>'||ch==':'||ch=='/'||ch=='#')
              {
                  chtemp=getchar();
                  if(chtemp=='='&&(ch=='>'||ch=='<'||ch==':'))
                  {
                      printf("运算符:%c%c
      ",ch,chtemp);
                      ch=getchar();
                  }
                  else
                  {
                      printf("运算符:%c
      ",ch);
                      ch=chtemp;
                  }
              }

      4).判断界符:

      else if(ch=='('||ch==')'||ch==','||ch==';'||ch=='.')
              {
                  printf("界符:%c
      ",ch);
                  ch=getchar();
              }

      5).区分保留字和标识符1:

      char Keyworld_first(char temp,char temppp)
      {
          char *p;
          int i,number,length=-1;
          switch (temp)
          {
              case 'v': p=var_temp;
                        break;
              case 'p': p=procedur_temp;
                        break;
              case 'b': p=begin_temp;
                        break;
              case 'e': p=end_temp;
                        break;
              case 'o': p=odd_temp;
                        break;
              case 'i': p=if_temp;
                        break;
              case 't': p=then_temp;
                        break;
              case 'd': p=do_temp;
                        break;
              case 'r': p=read_temp;
                        break;
          }
          for(i=0;i<9;i++)
          {
              if(p[i]==' ')break;
              length++;
          }
          number=0;
          while(temp==p[number])
          {
              if(number==length+1)break;
              if(number==0)
                  temp=temppp;
              else 
                  temp=getchar();    
              number++;
          }
          if(number==length+1&&(!(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')))
          {
              printf("保留字:");
              for(i=0;i<=length;i++)
                  printf("%c",p[i]);
              printf("
      ");
          }
          else
          {
              printf("标识符:");
              for(i=0;i<number;i++)
                  printf("%c",p[i]);
              while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')
                  {
                      printf("%c",temp);
                      temp=getchar();
                  }
              printf("
      ");
          }
          return temp;
      }

      6).区分保留字和标识符2:

      char Keyworld_double(char temp,char temppp)
      {
          char *p;
          int i,number,length=-1;
          switch (temp)
          {
              case 'c': if(temppp=='o')
                            p=const_temp;
                        else if(temppp=='a')
                            p=call_temp;
                        else
                        {
                          printf("标识符:");
                          printf("%c",temp);
                          temp=temppp;
                          while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')
                              {
                                  printf("%c",temp);
                                  temp=getchar();
                              }
                          printf("
      ");
                          return temp;
                        }
                        break;
              case 'w': if(temppp=='h')
                            p=while_temp;
                        else if(temppp=='r')
                            p=write_temp;
                        else
                        {
                            printf("标识符:");
                          printf("%c",temp);
                          temp=temppp;
                          printf("%c",temp);
                          while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')
                              {
                                  printf("%c",temp);
                                  temp=getchar();
                              }
                          printf("
      ");
                          return temp;
                        }
                        break;
          }
          for(i=0;i<9;i++)
          {
              if(p[i]==' ')break;
              length++;
          }
          number=1;
          temp=temppp;
          while(temp==p[number])
          {    
              if(number==length+1)break;
              temp=getchar();
              number++;
          }
          if(number==length+1&&(!(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')))
          {
              printf("保留字:");
              for(i=0;i<=length;i++)
                  printf("%c",p[i]);
              printf("
      ");
          }
          else
          {
              printf("标识符:");
              for(i=0;i<number;i++)
                  printf("%c",p[i]);
              while(temp>='a'&&temp<='z'||temp>='A'&&temp<='Z'||temp>='0'&&temp<='9')
                  {
                      printf("%c",temp);
                      temp=getchar();
                  }
              printf("
      ");
          }
          return temp;
      }
    4. 运行结果及截图:

      四、        实验总结
        
      对于实现这个功能而言,最麻烦的地方莫过于要去区分标识符和保留字,因为标识符可能是保留字中的一部分或者保留字的加长,所以为了方便判断,把保留字存在数组里,在判断的过程中能够方便地调用。对于实现功能而言,不算太难,比较基础,只是有点麻烦,需要细心而已,但细心对于我来说却是一个难题,希望在以后的学习中能改变这个缺点。

       

  • 相关阅读:
    java配置文件读取
    简易表单验证
    Enter键提交表单
    background-attachment:fixed应用
    随机生成密钥
    javascript/jquery判断是否为undefined或是null!
    jQuery获取和设置disabled属性、背景图片路径
    $(function(){})里面不能声明定义函数
    CSS浏览器兼容性----Hack
    数组快速排序
  • 原文地址:https://www.cnblogs.com/www924121851/p/5943528.html
Copyright © 2020-2023  润新知