实验报告一:词法分析
实验一、词法分析实验
专业:商业软件工程 姓名:覃伟业 学号;201506110233
一、 实验目的
编写一个关于词法分析的程序,
二、 实验内容和要求
要求:
-输入:源程序字符串
-输出:二元组(种别,单词符号本身)
三、 实验方法、步骤及结果测试
- 源程序名:压缩包文件(rar或zip)中源程序名 词法分析.c
可执行程序名:词法分析.exe
- 原理分析及流程图
#include <stdio.h>
2 #include <string.h>
3
4 char wsym[100],token[8],ch;
5 int syn,word,i,j,sum;
6 char *keyword[6]={"begin","if","then","while","do","end"};
7
8 void scaner(void);
9
10 main()
11 {
12 word=0;
13 printf("\n 在下方输入你的字符串(按回车结束输入):\n");
14
15 do{
16 scanf("%c",&ch);
17 wsym[word++]=ch;
18 }while(ch!='\n');
19
20 word=0;
21 do{
22 scaner();
23 switch(syn)
24 {
25 case 11:
26 printf("( %-10d%5d )\n",sum,syn);
27 break;
28
29 case -1:
30 printf("you have input a wrong string\n");
31 return 0;
32 break;
33
34 default:
35 printf("( %-10s%5d )\n",token,syn);
36 break;
37 }
38 }while(syn!=0);
39
40 }
41
42 void scaner(void)
43 {
44 sum=0;
45
46 for(i=0;i<8;i++)
47 token[i++]= NULL;
48
49 ch=wsym[word++];
50 i=0;
51
52 while((ch==' ')||(ch=='\n'))
53 ch=wsym[word++];
54
55 if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
56 {
57 while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
58 {
59 token[i++]=ch;
60 ch=wsym[word++];
61 }
62
63 word--;
64 syn=10;
65
66 for(j=0;j<6;j++)
67 if(strcmp(token,keyword[n])==0)
68 {
69 syn=j+1;
70 break;
71 }
72 }
73 else if((ch>='0')&&(ch<='9'))
74 {
75 while((ch>='0')&&(ch<='9'))
76 {
77 sum=sum*10+ch-'0';
78 ch=wsym[word++];
79 }
80 word--;
81 syn=11;
82 }
83 else
84 {
85 switch(ch)
86 {
87 case '<':
88 token[i++]=ch;
89 ch=wsym[word++];
90 if(ch=='=')
91 {
92 syn=21;
93 token[i++]=ch;
94 }
95 else
96 {
97 syn=20;
98 word--;
99 }
100 break;
101
102 case '>':
103 token[i++]=ch;
104 ch=wsym[word++];
105 if(ch=='=')
106 {
107 syn=24;
108 token[i++]=ch;
109 }
110 else
111 {
112 syn=23;
113 word--;
114 }
115 break;
116
117 case '+':
118 syn=13;
119 token[i++]=ch;
120 break;
121
122 case '-':
123 syn=14;
124 token[i++]=ch;
125 break;
126
127 case '=':
128 syn=25;
129 token[i++]=ch;
130 break;
131
132 case '*':
133 syn=15;
134 token[i++]=ch;
135 break;
136
137 case '/':
138 syn=16;
139 token[i++]=ch;
140 break;
141
142 case '(':
143 syn=27;
144 token[i++]=ch;
145 break;
146
147 case ')':
148 syn=28;
149 token[i++]=ch;
150 break;
151
152 case '<>':
153 syn=22;
154 token[i++]=ch;
155 break;
156
157 case ';':
158 syn=26;
159 token[i++]=ch;
160 break;
161
162 case '#':
163 syn=0;
164 token[i++]=ch;
165 break;
166
167 case ':':
168 token[i++]=ch;
169 ch=wsym[word++];
170 if(ch=='=')
171 {
172 syn=18;
173 token[i++]=ch;
174 }
175 else
176 {
177 syn=17;
178 token[i++]=ch;
179 }
180 break;
181
182 default:
183 syn=-1;
184 break;
185 }
186 }
187 token[i++]='\0';
188 }
- 主要程序段及其解释:
66-188行
解释:识别标识符,给标识符赋值(就是书本中的标识符所代表的数值),
- 运行结果及分析
简单的识别标识符
四、 实验总结
我觉得还是比较难理解的,还是不太会,更多的要去问舍友