实验一
实验一、词法分析实验
专业:商业软件1班 姓名:简智濠 学号:201506100029
一、 实验目的
设计,编制,调试一个词法分析程序,用来识别单词,加深对词法分析原理的理解
二、 实验内容和要求
该程序要实现的是一个单词过程,从输入的源程序中,识别出各个独立意义的单词,即基本保留字,、标识符、常数、运算符、分界符五大类。并依次输出各个单词的内部编码及单词符号的自身值。
三、 实验方法、步骤及结果测试
- 源程序名:Compile.java
- 原理分析及流程图
词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等
(1) 关键字:是由程序语言定义的具有固定意义的标识符。例如,Pascal 中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。
(2) 标识符:用来表示各种名字,如变量名,数组名,过程名等等。
(3) 常数:常数的类型一般有整型、实型、布尔型、文字型等。
(4) 运算符:如+、-、*、/等等。
(5) 界符: 如逗号、分号、括号、等等。
(6)保留字:begin、end、if、while、var等
(7)运算符:3、25、3.1515、true等
- 主要程序段及其解释:
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 }
- 运行结果及分析
四、 实验总结
通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如java语言)直接编写此法分析程序。另外,也让我重新熟悉了java语言的相关内容,加深了对java语言的用途的理解。