实验报告一 词法分析程序

实验一、词法分析程序实验

 

一、        实验目的

编制一个词法分析程序。

二、        实验内容和要求

1.输入:源程序字符串。

2.输出:二元组(种别,单词本身)

3.待分析语言的词法规则

主要是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析

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

1.     源程序名:压缩包文件(rarzip)中源程序名 cifafenxi.c

可执行程序名:cifafenxi.exe

2.     原理分析及流程图

 

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

  1 #include<stdio.h>
  2 
  3 #include<string.h>
  4 
  5 char one[9][10]={"begin","if","then","while","do","end","main","int","char"};
  6 
  7 int number;
  8 
  9  
 10 
 11 int fenxi(char a[],int p)
 12 
 13 {
 14 
 15     char b[10];
 16 
 17     int i=0,j=1,q;
 18 
 19     b[0]=a[0];
 20 
 21     printf("\n");
 22 
 23     if((b[0]>='a'&&b[0]<='z')||(b[0]>='A'&&b[0]<='Z'))
 24 
 25     {
 26 
 27         for(j=1;j<10;j++)
 28 
 29             {
 30 
 31                 b[j]=a[j];
 32 
 33                 if(b[j]==' ')
 34 
 35                 {
 36 
 37                     b[j]='\0';
 38 
 39                     p=j;
 40 
 41                     break;
 42 
 43                 }
 44 
 45             }
 46 
 47             for(j=0;j<9;j++)
 48 
 49                 if(strcmp(b,one[j])==0)
 50 
 51                 {
 52 
 53                     printf("(%d,%s)",j+1,b);
 54 
 55                     q=0;
 56 
 57                     return p;
 58 
 59                 }
 60 
 61                 else
 62 
 63                     q=1;
 64 
 65             if(q==1)
 66 
 67             {
 68 
 69                 printf("(10,%s)",b);
 70 
 71                 return p;
 72 
 73             }
 74 
 75  
 76 
 77         }
 78 
 79         if((b[0]>=48)&&(b[0]<=57))
 80 
 81         {
 82 
 83             for(j=1;j<10;j++)
 84 
 85             {
 86 
 87                 b[j]=a[j];
 88 
 89                 if(b[j]==' ')
 90 
 91                 {
 92 
 93                     b[j]='\0';
 94 
 95                     p=j;
 96 
 97                     printf("(11,%s)",b);
 98 
 99                     return p;
100 
101                 }
102 
103             }
104 
105         }
106 
107         if((b[0]=='+')||(b[0]=='-')||(b[0]=='*')||(b[0]=='/')||(b[0]=='=')||(b[0]=='(')||(b[0]==')')||(b[0]=='#'))
108 
109         {
110 
111             b[1]=a[1];
112 
113             if(b[1]==' ')
114 
115             {
116 
117                  p=1;
118 
119                  b[1]='\0';
120 
121             }
122 
123             switch(b[0])
124 
125             {
126 
127             case '+':j=13;break;
128 
129             case '-':j=14;break;
130 
131             case '*':j=15;break;
132 
133             case '/':j=16;break;
134 
135             case '=':j=25;break;
136 
137             case ';':j=26;break;
138 
139             case '(':j=27;break;
140 
141             case ')':j=28;break;
142 
143             case '#':j=0;break;
144 
145             }
146 
147             printf("(%d,%s)",j,b);
148 
149             return p;
150 
151         }
152 
153         if((b[0]==':')||(b[0]=='>')||(b[0]=='<'))
154 
155         {
156 
157             b[1]=a[1];
158 
159             if((b[1]!='=')&&(b[1]!='>')&&(b[1]!='<')&&(b[1]==' '))
160 
161             {
162 
163  
164 
165                 p=1;
166 
167                 b[1]='\0';
168 
169                 switch(b[0])
170 
171                 {
172 
173                 case ':':j=17;break;
174 
175                 case '<':j=20;break;
176 
177                 case '>':j=23;break;
178 
179                 }
180 
181                 printf("(%d,%s)",j,b);
182 
183                 return p;
184 
185             }
186 
187             else
188 
189             {
190 
191                 b[1]=a[1];
192 
193                 b[2]='\0';
194 
195                 p=2;
196 
197                 if((b[0]==':')&&(b[1]=='='))j=18;
198 
199                 else if((b[0]=='<')&&(b[1]=='='))j=21;
200 
201                 else if((b[0]=='>')&&(b[1]=='='))j=24;
202 
203                 else if((b[0]=='<')&&(b[1]=='>'))j=22;
204 
205                 printf("(%d,%s)",j,b);
206 
207                 return p;
208 
209             }
210 
211         }
212 
213  
214 
215 }
216 
217  
218 
219 void maopao(char a[],int p)
220 
221 {
222 
223     int i;
224 
225     for(i=0;a[i]!='\0';i++)
226 
227         a[i]=a[p+i+1];
228 
229 }
230 
231  
232 
233 main()
234 
235 {
236 
237     char a[100];
238 
239     int p;
240 
241     printf("请输入一段程序(空格后回车结尾):");
242 
243  
244 
245     gets(a);
246 
247     do
248 
249     {
250 
251         p=fenxi(a,p);
252 
253         maopao(a,p);
254 
255     }while(a[0]!='\0');
256 
257 }

 

4.     运行结果及分析

四、        实验总结

这是编译原理这门课的开始程序,讲真看这门课真的跟天书一样,很多东西都是很难理解的,很抽象,像这个词法编译器,是老师讲了很久才懂得原理,很多功能还不是很完善,有许多要改进的地方,也有很多的BUG,想了很久也很难解决问题,不过最后还是完成了这个程序,学到了很多知识,也复习了大一所学的c语言许多语法。

 

实验问题:

       1.不知道该如何判断每一个单元的词法。

       2.如何不断地进行词法分析,如何结束。

解决方案:

       1.定义一个新的数组,并将原字符串读到空格后赋值给这个新的数组,然后对这个新数组中存储的字符串进行判断。

       2.利用循环,每判断一次,就将之前判断的单元删除,另后面的字符串浮到上面来继续进行判断,直到原字符串剩下‘\0’,退出循环。

posted @ 2016-10-12 20:20  风丶轻轻  阅读(366)  评论(5编辑  收藏  举报