工具

编程语言: Node.JS

工具包: XSLT

SNL程序示例

program p
type t1 = integer;
var integer v1, v2;
procedureq(integer i);
var integer a;
begina := i;write(a)
end
beginread(v1);if v1 < 10then v1 := v1 + 10else v1 := v1 - 10fi;q(v1)
end.

具体分析流程

1.将源代码读入为字符流

2.通过状态机进行分词,状态转换图如下所示

                                             识别SNL单词的DFA表示

3.对从状态机中读出来的单词进一步处理,形成token列表,放在数组中,供下一步语法分析使用

示例如下:

{ lex: 'PROGRAM', sem: 'program', row: 1 },
{ lex: 'ID', sem: 'p', row: 1 },
{ lex: 'TYPE', sem: 'type', row: 2 },
{ lex: 'ID', sem: 't1', row: 2 },
{ lex: '=', sem: null, row: 2 },
{ lex: 'INTEGER', sem: 'integer', row: 2 },
{ lex: ';', sem: null, row: 2 },
{ lex: 'VAR', sem: 'var', row: 3 },
{ lex: 'INTEGER', sem: 'integer', row: 3 },
{ lex: 'ID', sem: 'v1', row: 3 },
{ lex: ',', sem: null, row: 3 },
{ lex: 'ID', sem: 'v2', row: 3 },
{ lex: ';', sem: null, row: 3 },
{ lex: 'PROCEDURE', sem: 'procedure', row: 4 },
{ lex: 'ID', sem: 'q', row: 5 },
{ lex: '(', sem: null, row: 5 },
{ lex: 'INTEGER', sem: 'integer', row: 5 },
{ lex: 'ID', sem: 'i', row: 5 },
{ lex: ')', sem: null, row: 5 },
{ lex: ';', sem: null, row: 5 },
{ lex: 'VAR', sem: 'var', row: 6 },
{ lex: 'INTEGER', sem: 'integer', row: 6 },
{ lex: 'ID', sem: 'a', row: 6 },
{ lex: ';', sem: null, row: 6 },
{ lex: 'BEGIN', sem: 'begin', row: 7 },
{ lex: 'ID', sem: 'a', row: 8 },
{ lex: ':=', sem: null, row: 8 },
{ lex: 'ID', sem: 'i', row: 8 },
{ lex: ';', sem: null, row: 8 },
{ lex: 'WRITE', sem: 'write', row: 9 },
{ lex: '(', sem: null, row: 9 },
{ lex: 'ID', sem: 'a', row: 9 },
{ lex: ')', sem: null, row: 9 },
{ lex: 'END', sem: 'end', row: 10 },
{ lex: 'BEGIN', sem: 'begin', row: 11 },
{ lex: 'READ', sem: 'read', row: 12 },
{ lex: '(', sem: null, row: 12 },
{ lex: 'ID', sem: 'v1', row: 12 },
{ lex: ')', sem: null, row: 12 },
{ lex: ';', sem: null, row: 12 },
{ lex: 'IF', sem: 'if', row: 13 },
{ lex: 'ID', sem: 'v1', row: 13 },
{ lex: '<', sem: null, row: 13 },
{ lex: 'INTC', sem: '10', row: 13 },
{ lex: 'THEN', sem: 'then', row: 14 },
{ lex: 'ID', sem: 'v1', row: 14 },
{ lex: ':=', sem: null, row: 14 },
{ lex: 'ID', sem: 'v1', row: 14 },
{ lex: '+', sem: null, row: 14 },
{ lex: 'INTC', sem: '10', row: 14 },
{ lex: 'ELSE', sem: 'else', row: 15 },
{ lex: 'ID', sem: 'v1', row: 15 },
{ lex: ':=', sem: null, row: 15 },
{ lex: 'ID', sem: 'v1', row: 15 },
{ lex: '-', sem: null, row: 15 },
{ lex: 'INTC', sem: '10', row: 15 },
{ lex: 'FI', sem: 'fi', row: 16 },
{ lex: ';', sem: null, row: 16 },
{ lex: 'ID', sem: 'q', row: 17 },
{ lex: '(', sem: null, row: 17 },
{ lex: 'ID', sem: 'v1', row: 17 },
{ lex: ')', sem: null, row: 17 },
{ lex: 'END', sem: 'end', row: 18 } ]

4.进行语法分析,采用的方法为LL(1)分析法

5.录入原始形式的生成式,存放在对象(哈希表)中,如下所示:

  Program: 'ProgramHead DeclarePart ProgramBody',ProgramHead: 'PROGRAM ProgramName',ProgramName: 'ID',DeclarePart: 'TypeDecpart VarDecpart ProcDecpart',TypeDecpart: 'ε | TypeDec',TypeDec: 'TYPE TypeDecList',TypeDecList: 'TypeId = TypeDef ; TypeDecMore',TypeDecMore: 'ε | TypeDecList',TypeId: 'ID',TypeDef: 'BaseType | StructureType | ID',BaseType: 'INTEGER | CHAR',StructureType: 'ArrayType | RecType',ArrayType: 'ARRAY [ Low .. Top ] OF BaseType',Low: 'INTC',Top: 'INTC',RecType: 'RECORD FieldDecList END',FieldDecList: 'BaseType IdList ; FieldDecMore | ArrayType IdList ; FieldDecMore',FieldDecMore: 'ε | FieldDecList',IdList: 'ID IdMore',IdMore: 'ε | , IdList',VarDecpart: 'ε | VarDec',VarDec: 'VAR VarDecList',VarDecList: 'TypeDef VarIdList ; VarDecMore',VarDecMore: 'ε | VarDecList',VarIdList: 'ID VarIdMore',VarIdMore: 'ε | , VarIdList',ProcDecpart: 'ε | ProcDec',ProcDec: 'PROCEDURE ProcName ( ParamList ) ; ProcDecPart ProcBody ProcDecMore',ProcDecMore: 'ε | ProcDec',ProcName: 'ID',ParamList: 'ε | ParamDecList',ParamDecList: 'Param ParamMore',ParamMore: 'ε | ; ParamDecList',Param: 'TypeDef FormList | VAR TypeDef FormList',FormList: 'ID FidMore',FidMore: 'ε | , FormList',ProcDecPart: 'DeclarePart',ProcBody: 'ProgramBody',ProgramBody: 'BEGIN StmList END',StmList: 'Stm StmMore',StmMore: 'ε | ; StmList',Stm: 'ConditionalStm | LoopStm | InputStm | OutputStm | ReturnStm | ID AssCall',AssCall: 'AssignmentRest | CallStmRest',AssignmentRest: 'VariMore := Exp',ConditionalStm: 'IF RelExp THEN StmList ELSE StmList FI',LoopStm: 'WHILE RelExp DO StmList ENDWH',InputStm: 'READ ( Invar ) ',Invar: 'ID',OutputStm: 'WRITE ( Exp ) ',ReturnStm: 'RETURN',CallStmRest: '( ActParamList )',ActParamList: 'ε | Exp ActParamMore',ActParamMore: 'ε | ,ActParamList',RelExp: 'Exp OtherRelE',OtherRelE: 'CmpOp Exp',Exp: 'Term OtherTerm',OtherTerm: 'ε | AddOp Exp',Term: 'Factor OtherFactor',OtherFactor: 'ε | MultOp Term',Factor: '( Exp ) | INTC | Variable',Variable: 'ID VariMore',VariMore: 'ε | [ Exp ] | . FieldVar',FieldVar: 'ID FieldVarMore',FieldVarMore: 'ε | [ Exp ]',CmpOp: '< | =',AddOp: '+ | -',MultOp: '* | /'

6.构建LL1分析表,如下所示

7.根据LL1的分析方法,构建相应的符号栈,输入流栈,终极符列表,非终极符列表,生成式列表,LL1分析表对象,按照LL1的分析流程进行分析,如果出错,则抛出错误,告诉用户分析失败,同时给出出错的行数,此时分析栈中的具体内容,如果分析通过,则显示分析通过。

成功的运行结果

失败的运行结果

结论

此程序实现了SNL的词法分析和语法分析的基本功能,可以通过用例产生预期效果。在程序编写的过程中借鉴了教材《编译程序的设计与实现》。此次编写程序使我更加了解到编译器的重要性,并且提高了自己编程能力,希望以后自己有时间多多学习一下这方面。

基于Node.JS的SNL词法分析和语法分析相关推荐

  1. 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具...

    认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...

  2. 一个基于Node.js的本地快速测试服务器

    local-web-test 一个本地的基于node.js的测试服务器 支持快速的启动web容器服务 支持快速的发送get,post请求,并记录在/log文件夹下,并在控制台输出 支持一个函数完成co ...

  3. 大文件分片上传前端框架_基于Node.js的大文件分片上传

    基于Node.js的大文件分片上传 我们在做文件上传的时候,如果文件过大,可能会导致请求超时的情况.所以,在遇到需要对大文件进行上传的时候,就需要对文件进行分片上传的操作.同时如果文件过大,在网络不佳 ...

  4. 基于Node.js实现压缩和解压缩的方法

    本篇文章主要介绍了基于Node.js实现压缩和解压缩的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 压缩格式 zip 和 gzip 是两种我们最常见到的压缩格式,当 ...

  5. NGINX配置基于Node.js服务的负载均衡服务器

    NGINX配置基于Node.js服务的负载均衡服务器 本部署指南说明了如何使用NGINX开源和NGINX Plus在Node.js应用程序服务器池之间平衡HTTP和HTTPS通信.本指南中的详细说明适 ...

  6. 一个基于Node.js的本地快速测试服务器 1

    local-web-test 一个本地的基于node.js的测试服务器 支持快速的启动web容器服务 支持快速的发送get,post请求,并记录在/log文件夹下,并在控制台输出 支持一个函数完成co ...

  7. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下: http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.j ...

  8. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo 是基于 Node.js 的高性能.分布式游戏服务器框架.它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助你省去游戏开发枯燥中的重复劳动和底层逻辑的开发.Pomelo 不但适用 ...

  9. node ajax crud,基于node.js和rethinkdb的CRUD(增删改查)Web服务

    基于node.js和rethinkdb的CRUD(增删改查)Web服务 这是一个简单的REST web服务演示案例源码,使用Node.JS和Express 和RethinkDB,后者持久化JSON数据 ...

最新文章

  1. 最后3天,BDTC 2019早鸟票即将售罄,超强阵容及议题抢先曝光!
  2. 吴恩达新书《Machine Learning Yearning》完整中文版 PDF 下载!
  3. sidhu眼中的CoordinatorLayout.Behavior(二)
  4. 文本分类入门(三)统计学习方法
  5. boost实用工具:创建一个禁止复制的类 noncopyable
  6. Robotframework集成jenkins执行用例
  7. 管理角色认知-工程师到管理者角色发生了哪些变化?
  8. r软件时间序列分析论文_高度比较的时间序列分析-一篇论文评论
  9. android10新功能,Android10(Api 29)新特性
  10. JDOM与DOM的相互转换
  11. 多线程join方法解析
  12. 【报告分享】2021新茶饮研究报告.pdf(附下载链接)
  13. 人脸方向学习(十六):Face Detection-BlazeFace解读
  14. 企业 IT 治理沙龙·北京站:业务优先?治理优先?您的企业是哪种上云姿势?...
  15. web项目移动端在线预览(excel在线预览)
  16. Android开发之连接夜神模拟器
  17. uni-app 生成邀请二维码海报
  18. 游戏受计算机限制,玩游戏的时候突然电脑显示本地连接受限制或无连接怎么处理...
  19. Tomcat11——Tomat集群
  20. 动态页面静态化之页面静态化方案

热门文章

  1. aspx文件中CodeFile与CodeBehind的区别
  2. 现在,你可以在以太坊 Layer 2 上做的 7 件事!
  3. 实验4-EXCEL回归分析
  4. 主动降噪蓝牙耳机怎么选才不踩雷?推荐这五款高性价比蓝牙耳机
  5. bzoj 3262: 陌上花开
  6. 大前端面试经验技巧通用模板
  7. 为什么计算机关机慢,为什么我的电脑关机很慢都要3.4分钟(win7系统)
  8. 手机电脑同步库存软件怎么实现
  9. delphi WinExec CMD调用
  10. java executebatch_executeBatch()相关操作汇总