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

    实验一、词法分析实验

    专业 商业软件工程 姓名 胡德霖 学号 201506110208

    一、        实验目的

         输入字符串,显示字符串和种别码

    二、        实验内容和要求

         将输入的字符串通过词法分析器一一识别出来,同时将该字符串或者字符并且和种别码一起输出来。

     

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

     

    1. 1.      程序名:词法分析.c

            可执行程序名:词法分析.exe

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

     

    主要总体设计问题。

    采用数组存放数据,通过字符串的比较实现关键字的种别码输出。

    问题:当输入连续的关键字时如ifif后面一个无法识别.

    解决:当输出完一个关键字后就释放token的数组

    1. 3.      主要程序段及其解释:
    2. #include <stdio.h>
      #include <string.h>
      #define MAX 100
      main()
      {
          int i=0,j,n,syn;
          char num[MAX],standard[6][10]={"begin","if","then","while","do","end"},string[MAX],token[MAX],ch;
          printf("请输入一串字符,以#结尾:");
          do{
              scanf("%c",&ch);
              string[i]=ch;
              i++;
          }while(ch!='#');
          string[i]='#';
          i=0;
          do{
              for(j=0;j<MAX;j++)
                  token[j]='';
              for(j=0;j<MAX;j++)
                  num[j]='';
              ch=string[i];
              i++;
              while(ch==' '||ch=='
      ')
              {
                  ch=string[i];
                  i++;
              }
              j=0;
              while(ch>='a'&& ch<='z' || ch>='A'&&ch<='Z') /*判断是否为字符关键字*/
              {
                  token[j]=ch;
                  ch=string[i];
                  i++;
                  j++;
                  for(n=0;n<6;n++)
                  {
                      if(strcmp(token,standard[n])==0)
                      {
                          syn=n+1;
                          printf("%s,种别码%d
      ",standard[n],syn);
                          for(j=0;j<MAX;j++)
                              token[j]='';
                          j=0;
                      }
                  }
      
              }
              while(ch>='0'&& ch<='9') /*判断是否为数字*/
              {
                  num[j]=ch;
                  ch=string[i];
                  i++;
                  j++;
              }
              if(num[0]>='0'&&num[0]<='9')
                  printf("%s,种别码%d
      ",num,syn=11);
              for(j=0;j<MAX;j++)
                  num[j]='';
              j=0;
              switch(ch)
              {
              case '+':
                  syn=13;
                  printf("%c,种别码%d
      ",ch,syn);
                  break;
              case '-':
                  syn=14;
                  printf("%c,种别码%d
      ",ch,syn);
                  break;
              case '*':
                  syn=15;
                  printf("%c,种别码%d
      ",ch,syn);
                  break;
              case '/':
                  syn=16;
                  printf("%c,种别码%d
      ",ch,syn);
                  break;
              case ':':
                  ch=string[i];
                  i++;
                  if(ch=='=')
                  {
                      syn=18;
                      printf("%c%c,种别码%d
      ",token[j-1],ch,syn);
                  }
                  else
                  {
                      syn=17;
                      printf("%c,种别码%d
      ",ch,syn);
                      i--;
                  }
                  break;
              case '<':
                  token[j]=ch; 
                  j++;
                  ch=string[i];
                  i++;
                  if(ch=='=')
                  {
                      syn=21;
                      printf("%c%c,种别码%d
      ",token[j-1],ch,syn);
                  }
                  else
                  {
                      syn=20;
                      printf("%c,种别码%d
      ",ch,syn);
                      i--;
                  }
                  break;
              case '>':
                  token[j]=ch;
                  j++;
                  ch=string[i];
                  i++;
                  if(ch=='=')
                  {
                      syn=24;
                      printf("%c%c,种别码%d
      ",token[j-1],ch,syn);
                  }
                  else{
                      syn=23;
                      printf("%c,种别码%d
      ",ch,syn);
                      i--;
                  }
                  break;
              case '=':
                  syn=25;
                  printf("%c,种别码%d
      ",ch,syn);
                  break;
              case ';':
                  syn=26;
                  printf("%c,种别码%d
      ",ch,syn);
                  break;
              case '(':
                  syn=27;
                  printf("%c,种别码%d
      ",ch,syn);
                  break;
              case ')':
                  syn=28;
                  printf("%c,种别码%d
      ",ch,syn);
                  break;
              default:
                  i--;
                  break;
              }
              
          }while(ch!='#');
          getchar();
          getchar();
      }

    利用string数组储存用户输入的字符串再一个个读取字符,当读到字母就用token数组存放,读完后再对照是否为关键字,当为其他字符时再判断输出。

    1. 4.      运行结果及分析

     

    四、        实验总结

    心得体会,在这次的实验中了解词法分析的过程,解决一些问题。在完成我的词法分析器的时候考虑到关键字固定的字符串,这就有利于字符串的比较,从而识别出对应的种别码。因为是第一次接触,显得有些不知所措,不知道从何下手,最后经过努力,勉勉强强算是完成了吧。

     

     

     

     

     

  • 相关阅读:
    SqlMap入门
    本地文件上载到Docker容器
    CentOS7 安装Docker-ce
    windows10 子系统(WSL) 文件位置
    慕课网-安卓工程师初养成-5-1 编程练习
    慕课网-安卓工程师初养成-4-14 Java 循环语句之多重循环
    慕课网-安卓工程师初养成-4-13 练习题
    慕课网-安卓工程师初养成-4-12 Java循环跳转语句之 continue
    慕课网-安卓工程师初养成-4-11 Java循环跳转语句之 break
    慕课网-安卓工程师初养成-4-10 练习题
  • 原文地址:https://www.cnblogs.com/q1736699804/p/5955506.html
Copyright © 2011-2022 走看看