实验一

实验一、词法分析实验

专业:商业软件1   姓名:简智濠  学号:201506100029

一、 实验目的

     设计,编制,调试一个词法分析程序,用来识别单词,加深对词法分析原理的理解

二、 实验内容和要求

     该程序要实现的是一个单词过程,从输入的源程序中,识别出各个独立意义的单词,即基本保留字,、标识符、常数、运算符、分界符五大类。并依次输出各个单词的内部编码及单词符号的自身值。

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

  1. 源程序名:Compile.java
  2. 原理分析及流程图

 

词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等

(1) 关键字:是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。

(2) 标识符:用来表示各种名字,如变量名,数组名,过程名等等。

(3) 常数:常数的类型一般有整型、实型、布尔型、文字型等。

(4) 运算符:如+、-、*、/等等。

(5) 界符: 如逗号、分号、括号、等等。

(6)保留字:beginendifwhilevar

(7)运算符:3253.1515true

 

  1. 主要程序段及其解释:
  1 Public static List extactCharacters(char temp, char[] analyseDate, String[] keywords, String uString, int index,
  2 
  3 String compareStr) {
  4 
  5  
  6 
  7 int keyID = -1, m = 0;
  8 
  9  
 10 
 11 List list = new List();
 12 
 13 // 1.判断下一个读入的字符是否为空格,用while作为大循环,若读取到空格则跳出方法,提取下一个字符进行判断
 14 
 15 while (temp != ' ') {
 16 
 17 // 2.判断当前字符是字母或者数字和字母的组合
 18 
 19 if (temp >= 'a' && temp <= 'z') {
 20 
 21 m = 0;
 22 
 23  
 24 
 25 // 当读取到不是大小写字母或者数字时候判断为一个单词读取完成
 26 
 27 while (temp >= 'a' && temp <= 'z' || temp >= 'A' && temp <= 'Z' || temp >= '0' && temp <= '9') {
 28 
 29 analyseDate[m++] = temp;
 30 
 31 compareStr += temp + "";
 32 
 33 temp = uString.charAt(++index);
 34 
 35 }
 36 
 37  
 38 
 39 compareStr = compareStr.substring(4);
 40 
 41 // 与读取出来的字符判断是否为关键字
 42 
 43 for (int i = 0; i < 6; i++) {
 44 
 45 if (compareStr.equals(keywords[i])) {
 46 
 47 keyID = i + 1;
 48 
 49 list.add(index + "");
 50 
 51 list.add(keyID + "");
 52 
 53 list.add(compareStr);
 54 
 55 return list;
 56 
 57 }
 58 
 59 }
 60 
 61 // 不是关键字就当作为标识符
 62 
 63 keyID = 10;
 64 
 65 list.add(index + "");
 66 
 67 list.add(keyID + "");
 68 
 69 list.add(compareStr);
 70 
 71 return list;
 72 
 73 }
 74 
 75 // 3,判断当前字符是数字?
 76 
 77 else if (temp >= '0' && temp <= '9') {
 78 
 79 m = 0;
 80 
 81 String tempTokens = null;
 82 
 83 // 对后面的字符进行判断是否为数字
 84 
 85 while (temp >= '0' && temp <= '9') {
 86 
 87 analyseDate[m++] = temp;
 88 
 89 tempTokens += temp;
 90 
 91 temp = uString.charAt(++index);
 92 
 93 }
 94 
 95 // 不是数字则返回种别码,结束当前方法
 96 
 97 keyID = 11;
 98 
 99 tempTokens = tempTokens.substring(4);
100 
101 list.add(index + "");
102 
103 list.add(keyID + "");
104 
105 list.add(tempTokens + "");
106 
107 return list;
108 
109 }
110 
111 m = 0;
112 
113 // 4.判断当前字符是其他关系运算符
114 
115 String token = null;
116 
117 switch (temp) {
118 
119 case '<':
120 
121 // String token = null;
122 
123 analyseDate[m++] = temp;
124 
125 token += temp;
126 
127 if (uString.charAt(++index) == '=') {
128 
129 analyseDate[m++] = temp;
130 
131 keyID = 22;
132 
133 token += uString.charAt(index++);
134 
135 } else if (uString.charAt(++index) == '>') {
136 
137 analyseDate[m++] = temp;
138 
139 keyID = 21;
140 
141 token += uString.charAt(index++);
142 
143 } else {
144 
145 keyID = 23;
146 
147 }
148 
149 list.add(index + "");
150 
151 list.add(keyID + "");
152 
153 token = token.substring(4);
154 
155 list.add(token);
156 
157 return list;
158 
159 case '>':
160 
161 // String tokens = null;
162 
163 analyseDate[m++] = temp;
164 
165 token += temp;
166 
167 if (uString.charAt(++index) == '=') {
168 
169 keyID = 24;
170 
171 analyseDate[m++] = temp;
172 
173 token += uString.charAt(index++);
174 
175 } else {
176 
177 keyID = 20;
178 
179 }
180 
181 list.add(index + "");
182 
183 list.add(keyID + "");
184 
185 token = token.substring(4);
186 
187 list.add(token);
188 
189 return list;
190 
191 case ':':
192 
193  
194 
195 analyseDate[m++] = temp;
196 
197 token += temp;
198 
199 if (uString.charAt(++index) == '=') {
200 
201 keyID = 18;
202 
203 // analyseDate[m++] = temp;
204 
205 analyseDate[m++] = uString.charAt(index);
206 
207 token += uString.charAt(index++);
208 
209 } else {
210 
211 keyID = 17;
212 
213 }
214 
215 list.add(index + "");
216 
217 list.add(keyID + "");
218 
219 token = token.substring(4);
220 
221 list.add(token);
222 
223 return list;
224 
225 case '*':
226 
227 keyID = 13;
228 
229 break;
230 
231 case '/':
232 
233 keyID = 14;
234 
235 break;
236 
237 case '+':
238 
239 keyID = 15;
240 
241 break;
242 
243 case '-':
244 
245 keyID = 16;
246 
247 break;
248 
249 case '=':
250 
251 keyID = 25;
252 
253 break;
254 
255 case ';':
256 
257 keyID = 26;
258 
259 break;
260 
261 case '(':
262 
263 keyID = 27;
264 
265 break;
266 
267 case ')':
268 
269 keyID = 28;
270 
271 break;
272 
273 case '#':
274 
275 keyID = 0;
276 
277 break;
278 
279 default:
280 
281 keyID = -1;
282 
283 break;
284 
285 }
286 
287 analyseDate[m++] = temp;
288 
289 list.add(++index + "");
290 
291 list.add(keyID + "");
292 
293 list.add(temp + "");
294 
295 return list;
296 
297 }
298 
299 return list;
300 
301 }
  1. 运行结果及分析

 

 

 

四、 实验总结

 通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如java语言)直接编写此法分析程序。另外,也让我重新熟悉了java语言的相关内容,加深了对java语言的用途的理解。

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/jianzhihao/p/5961948.html