基于Node.JS的SNL词法分析和语法分析
工具
编程语言: 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词法分析和语法分析相关推荐
- 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具...
认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...
- 一个基于Node.js的本地快速测试服务器
local-web-test 一个本地的基于node.js的测试服务器 支持快速的启动web容器服务 支持快速的发送get,post请求,并记录在/log文件夹下,并在控制台输出 支持一个函数完成co ...
- 大文件分片上传前端框架_基于Node.js的大文件分片上传
基于Node.js的大文件分片上传 我们在做文件上传的时候,如果文件过大,可能会导致请求超时的情况.所以,在遇到需要对大文件进行上传的时候,就需要对文件进行分片上传的操作.同时如果文件过大,在网络不佳 ...
- 基于Node.js实现压缩和解压缩的方法
本篇文章主要介绍了基于Node.js实现压缩和解压缩的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 压缩格式 zip 和 gzip 是两种我们最常见到的压缩格式,当 ...
- NGINX配置基于Node.js服务的负载均衡服务器
NGINX配置基于Node.js服务的负载均衡服务器 本部署指南说明了如何使用NGINX开源和NGINX Plus在Node.js应用程序服务器池之间平衡HTTP和HTTPS通信.本指南中的详细说明适 ...
- 一个基于Node.js的本地快速测试服务器 1
local-web-test 一个本地的基于node.js的测试服务器 支持快速的启动web容器服务 支持快速的发送get,post请求,并记录在/log文件夹下,并在控制台输出 支持一个函数完成co ...
- 基于Node.js + WebSocket 的简易聊天室
代码地址如下: http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.j ...
- Pomelo:网易开源基于 Node.js 的游戏服务端框架
Pomelo 是基于 Node.js 的高性能.分布式游戏服务器框架.它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助你省去游戏开发枯燥中的重复劳动和底层逻辑的开发.Pomelo 不但适用 ...
- node ajax crud,基于node.js和rethinkdb的CRUD(增删改查)Web服务
基于node.js和rethinkdb的CRUD(增删改查)Web服务 这是一个简单的REST web服务演示案例源码,使用Node.JS和Express 和RethinkDB,后者持久化JSON数据 ...
最新文章
- 最后3天,BDTC 2019早鸟票即将售罄,超强阵容及议题抢先曝光!
- 吴恩达新书《Machine Learning Yearning》完整中文版 PDF 下载!
- sidhu眼中的CoordinatorLayout.Behavior(二)
- 文本分类入门(三)统计学习方法
- boost实用工具:创建一个禁止复制的类 noncopyable
- Robotframework集成jenkins执行用例
- 管理角色认知-工程师到管理者角色发生了哪些变化?
- r软件时间序列分析论文_高度比较的时间序列分析-一篇论文评论
- android10新功能,Android10(Api 29)新特性
- JDOM与DOM的相互转换
- 多线程join方法解析
- 【报告分享】2021新茶饮研究报告.pdf(附下载链接)
- 人脸方向学习(十六):Face Detection-BlazeFace解读
- 企业 IT 治理沙龙·北京站:业务优先?治理优先?您的企业是哪种上云姿势?...
- web项目移动端在线预览(excel在线预览)
- Android开发之连接夜神模拟器
- uni-app 生成邀请二维码海报
- 游戏受计算机限制,玩游戏的时候突然电脑显示本地连接受限制或无连接怎么处理...
- Tomcat11——Tomat集群
- 动态页面静态化之页面静态化方案