词法分析实验报告

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

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

实验一、词法分析实验

专业 商业软件  姓名 梁浩辉 学号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.      运行结果及分析

 

 

 

 

 

 

 

四、        实验总结

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

原文地址:https://www.cnblogs.com/lianghaohui123/p/5985295.html