zoukankan      html  css  js  c++  java
  • 实验一

    实验一、词法分析实验

    专业:商业软件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语言的用途的理解。

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    函数参数太多的一种简化方法
    laravel 获取所有表名
    使用 laravel 的 queue 必须知道的一些事
    git "refusing to merge unrelated histories" 解决方法
    使用 xhprof 进行 php 的性能分析
    php 性能优化
    js原生实现轮播图效果(面向对象编程)
    nextSibling 和nextElementSibling
    如何在页面中使用svg图标
    svg动画 animate
  • 原文地址:https://www.cnblogs.com/jianzhihao/p/5961948.html
Copyright © 2011-2022 走看看