JS词法分析器实验报告

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'
}

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript实验报告全文共5页,当前为第1页。JavaScript实验报告全文共5页,当前为第1页。第一次JavaScript实验 JavaScript实验报告全文共5页,当前为第1页。 JavaScript实验报告全文共5页,当前为第1页。 实验主题:内置对象(1) 实验内容: 1. 熟悉JavaScript常见内置对象及其关系; 2. 熟练应用String对象和Array对象; 3. 动手操作: 数组的升序与降序排列练习 1 升序排列代码 <html> <head> <title>数组数字大小排序</title> </head> <body> <p>让数组按照升序降序排列</p> <p>这里写个数组 var array=[89,28,49,654,6758,5768];</p> <p>升序输出:</p> <script type="text/javascript"> var array=[89,28,49,654,6758,5768]; array.sort(function (x,y) { return x-y; }); document.writeln(array); </script> </body> </html> JavaScript实验报告全文共5页,当前为第2页。JavaScript实验报告全文共5页,当前为第2页。 JavaScript实验报告全文共5页,当前为第2页。 JavaScript实验报告全文共5页,当前为第2页。 2降序排列 <html> <head> <title>数组数字大小排序</title> </head> <body> <p>降序排列:</p> <p>这里写个数组 var array=[59,689,62,92,68,10];</p> <p>降序输出</p> <script type="text/javascript"> var array=[59,689,62,92,68,10]; array.sort(function (x,y) { return y-x; }); document.writeln(array); </script> </body> </html> JavaScript实验报告全文共5页,当前为第3页。JavaScript实验报告全文共5页,当前为第3页。 字符串的交叉合并练习 JavaScript实验报告全文共5页,当前为第3页。 JavaScript实验报告全文共5页,当前为第3页。 <html> <head> <title>交叉合并字符串</title> <style> #form{ margin: 0 auto; width:500px; top:100px; height:300px; } </style> <script type="text/javascript"> var reg = "^[A-Za-z0-9]+$"; function check(){ var str1 =document.all.str1.value; var str2 =document.all.str2.value; if(str1==""){ alert("字符串一不允许为空!"); document.all.str1.focus(); return; }else if(!/^[A-Za-z0-9]+$/.test(str1)){ alert("字符串一只能是数字和字母的组合"); document.all.str1.focus(); return; }else if(str2==""){ alert("字符串二不允许为空!"); document.all.str2.focus(); return; }else if(!/^[A-Za-z0-9]+$/.test(str2)){ alert("字符串二只能是数字和字母的组合"); document.all.str2.focus(); return; } var string=""; var font1 = "<font style='color:red;'>"; var font2 = "<font style='color:blue;'>"; var fontend = "</font>"; if(str1.length>=str2.length){ for(var i =0;i<str1.length;i++){ if(i< str2.length){ string += font1+str1[i]+fontend+ font2+ str2[i]+fontend; JavaScript实验报告全文共5页,当前为第4页。JavaScript实验报告全文共5页,当前为第4页。 }else{ JavaScript实验

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值