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

    格式说明:排版时注意按此模板的字体,字号和行距。

    报告提交和打印输出时请去掉此框。

    实验一、词法分析实验

    专业 商业软件  姓名 梁浩辉 学号201506110109

    一、        实验目的

    通过设计、开发一个高级语言的词法分析程序,加深对课堂教学内容(包括正规文法、正规表达式、有限自动机、NFA到DFA的转换、DFA的最小化)的理解,提高词法分析方法的实践能力。

    二、        实验内容和要求

         1)深入理解、掌握有限自动机及其应用;

    (2)掌握根据语言的词法规则构造识别其单词的有限自动机的方法;

    (3)掌握NFA到DFA的等价变换方法、DFA最小化的方法;

    (4)掌握设计、编码、调试词法分析程序的技术与方法,具体实现S语言的词法分析程序。

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

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

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

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

     

     

     

    主要总体设计问题。

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

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

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

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

    #include <stdio.h>

    #include <string.h>

    #define MAX 100

    main()

    {

        int i=0,j,m,n,syn;

        char 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]='';

               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;

                             }

                      }

     

               }

               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);

                      }

                      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);

                      }

                      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);

                      }

                      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:

                      break;

               }

        }while(ch!='#');

        getchar();

        getchar();

    }

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

    1. 4.      运行结果及分析

     

     

     

     

     

     

     

    四、        实验总结

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

  • 相关阅读:
    Mysql中varchar类型的猫腻!
    震惊!java中日期格式化的大坑!
    mysql数据库限制多次登录失败,限定用户重试时间
    2021年回顾与展望
    多线程循环打印abc
    2020年总结-用学习过的技术搭建一个简单的微服务框架 + 源码
    回溯算法
    PyTorch 中 weight decay 的设置
    数据结构与算法——计数排序
    数据结构与算法——堆排序
  • 原文地址:https://www.cnblogs.com/lianghaohui123/p/5985295.html
Copyright © 2011-2022 走看看