实验一、词法分析实验

实验一、词法分析实验

专业 商软3班  姓名 陈文豪  学号 201506110196

一、实验目的

   编制一个词法分析程序

二、实验内容和要求

    输入:源程序字符串

输出:二元组(种别,单词符号本身)

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

1. 源程序名:压缩包文件(rarzip)中源程序名词法分析.c,可执行程序名:词法分析.exe

2. 原理分析及流程图

关键过程:把输入的字符串存入数组---从数组中拿出一个字符根据它的ascii码判断出种别---判断完后输出

3. 主要程序段及其解释

  1 void cwh()
  2 {
  3     int i,m;/*m用于记录linshi的下标*/
  4     char *guanjianzi[6]= {"begin","if","then","while","do","end"}; /*char*[]数组每个元素指向一个char型的变量,关键字数组记得zhongbie+1*/
  5     for(i=0; i<15; i++)
  6     {
  7         linshi[i]=NULL;   /*定义一个临时存放字符串的数组用作比较*/
  8     }
  9     m=0;/*初始化下标*/
 10     sum=0;
 11     ch=zifu[p++];
 12     /*开始识别字符种别*/
 13     while(ch==' ')
 14     {
 15         ch=zifu[p++];
 16     }
 17     /*识别关键字或者标识符*/
 18     if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
 19     {
 20         while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))/*将标识符存入临时数组*/
 21         {
 22             linshi[m++]=ch;
 23             ch=zifu[p++];
 24         }
 25         linshi[m]='\0';
 26         p--;
 27         zhongbie=10;/*p=p+1下次识别就是p+1*/
 28         for(i=0; i<6; i++) /*将识别出来的字符和已定义的关键字作比较 */
 29         {
 30             if(strcmp(linshi,guanjianzi[i])==0)
 31             {
 32                 zhongbie=i+1;
 33                 break;
 34             }
 35         }
 36     }
 37     /*识别数字*/
 38     else if((ch>='0'&&ch<='9'))
 39     {
 40         while((ch>='0'&&ch<='9'))
 41         {
 42             linshi[m++]=ch;
 43             ch=zifu[p++];
 44         }
 45         p--;
 46         zhongbie=11;
 47     }
 48     else
 49     {
 50         switch(ch)
 51         {
 52         case ':':
 53             linshi[m++]=ch;
 54             ch=zifu[p++];
 55             if(ch=='=')
 56             {
 57                 zhongbie=18;
 58                 linshi[m++]=ch;
 59             }
 60             else
 61             {
 62                 zhongbie=17;
 63                 p--;
 64             }
 65             break;
 66         case '<':
 67             linshi[m++]=ch;
 68             ch=zifu[p++];
 69             if(ch=='=')
 70             {
 71                 zhongbie=21;
 72                 linshi[m++]=ch;
 73             }
 74             else if(ch=='>')
 75             {
 76                 zhongbie=22;
 77                 linshi[m++]=ch;
 78             }
 79             else
 80             {
 81                 zhongbie=20;
 82                 p--;
 83             }
 84             break;
 85         case '>':
 86             linshi[m++]=ch;
 87             ch=zifu[p++];
 88             if(ch=='=')
 89             {
 90                 zhongbie=24;
 91                 linshi[m++]=ch;
 92             }
 93             else
 94             {
 95                 zhongbie=23;
 96                 p--;
 97             }
 98             break;
 99         case '+':
100             zhongbie=13;
101             linshi[0]=ch;
102             break;
103         case '-':
104             zhongbie=14;
105             linshi[0]=ch;
106             break;
107         case '*':
108             zhongbie=15;
109             linshi[0]=ch;
110             break;
111         case '/':
112             zhongbie=16;
113             linshi[0]=ch;
114             break;
115         case '=':
116             zhongbie=25;
117             linshi[0]=ch;
118             break;
119         case ';':
120             zhongbie=26;
121             linshi[0]=ch;
122             break;
123         case '(':
124             zhongbie=27;
125             linshi[0]=ch;
126             break;
127         case ')':
128             zhongbie=28;
129             linshi[0]=ch;
130             break;
131         case '#':
132             zhongbie=0;
133             linshi[0]=ch;
134             break;
135         case'\n':
136             zhongbie=-2;
137             break;
138         default:
139             zhongbie=-1;
140             break;
141         }
142     }
143 }

 

 

4. 运行结果及分析

 

实验总结

这是编译原理的第一次实验报告作业,刚开始做比较困难,因为没写过这类型的程序,后来上网查了些资料后才逐渐有了整体的思路,并最终完成程序。

过程中有些小细节的处理不够细腻导致最终程序出现错误,在不断的处理这些错误的过程进一步巩固了自己的学到的知识。

心得:学会了使用全局变量处理问题  

实验问题:1.关键字不知道怎么整理成一个数组

              2.字符如何判断是关键字还是标识符  

解决方案:1.使用指针数组char *guanjianzi[6]

              2.用strcmp(临时存放字符的数组,guanjianzi[])==0得出是关键字还是标识符

 

 

 

 

 

 

 

 

 

posted @ 2016-10-13 10:51  196陈文豪  阅读(138)  评论(3编辑  收藏  举报