1.实验环境
Linux系统 WebStorm环境
2.实验目的
设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解
3.单词分类表
4.单词状态表
5.算法描述
用Javascipt实现词法分析器,首先是读取文件,然后把读入的字符转为数组形式,遍历数组。
如果读到字母,就读完余下连续的字母或数字,然后以此与关键字表中元素进行对比,如果是关键字输出该关键字的序列号与关键字,如果不是关键字再与标示符中的元素对比,如果标示符中存在则输出该标示符的序列号与标示符,如果不存在则加入标示符数组且输出序列号与该字符。
如果读到是数字则读完余下的数字,输出num与该数字。
读到的若是符号则与符号数组对比输出该符号的序列号与符号。
若不在以上的范围内则输出0。
6.程序结构
8.运行结果
9.调试情况
开始的时候在读文件时,读到里文件可是后面的代码调用文件为undefine,后来调试里很长时间才明白是出现异步情况,所以就修改了代码的整体结构,读完文件直接调用,都放在了一个循环里面。
10.设计技巧及体会
设计技巧:读到数据直接输出更为方便,放在数组里最后统一输出反而更麻烦而且容易出错。
体会:写了很久的词法分析器,从开始的懵懵懂懂到现在已经彻底明白,写代码的过程中遇到了很多麻烦,从开始的读文件到遍历以及最后的输出都不是很顺利,一边边的测试打断点,最后总算完成,很开心。
11.源程序清单
代码文件:
var fs = require('fs'); function allNames() { var ch = ''; var text; var sertID = ['var', 'function', 'if', 'else', 'return', 'true', 'false']; var dotID = [',', '(', ')', '{', '}','\'',':'] var sertConst = []; fs.readFile('input.js', 'UTF-8', function (err, data) { text = data.toString().split(''); for (var i = 0; i < text.length;) { var strToken = ''; ch = text[i]; var tag = 0; if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { while ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { strToken += ch; i += 1; ch = text[i]; } for (var j = 0; j < sertID.length; j++) { if (sertID[j] === strToken && tag === 0) { console.log(strToken, 'sertID' + j) tag = 1; } } if (sertConst.length === 0 && tag === 0) { sertConst.push(strToken); console.log(strToken, 'sertConst' + 0) tag = 1; } if (sertConst.length != 0 && tag === 0) { for (var t = 0; t < sertConst.length; t++) { if (sertConst[t] === strToken && tag === 0) { tag = 1; console.log(strToken, 'sertConst' + t) break; } else { sertConst.push(strToken); tag = 1; var put = sertConst.length - 1 console.log(strToken, 'sertConst' + put) break; } } } } else if (ch >= '0' && ch <= '9') { while (ch >= '0' && ch <= '9') { strToken += ch; i += 1; ch = text[i]; } console.log(strToken, 'num') tag = 1; } for (var d = 0; d < dotID.length; d++) { if (dotID[d] === ch) { console.log(ch, 'dotID' + d) i++; tag = 1; break; } } if (tag === 0) { console.log('0'); i++; } } } ) } allNames()
被读文件:
function put(){ return 'hello' }