- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于编译原理的计算器
首先看一下这个计算器的功能:
CALC set a = 1; b = 2
CALC set c = 3
CALC calc (10 + pow(b, c)) * sqrt(4) - 1
35.0
CALC exit
如上所示,这个计算器的功能非常简单:
用set命令设置上下文中的变量。
用calc命令计算一个表达式的值。
用exit命令退出计算器。
我们把编译的重点放在calc命令后面的计算表达式的解析,其它的部分我们可以简单处理(如set命令可以这样简单处理:先按分号分隔得到多个赋值处理,再按等号分隔就可以在上下文中设置变量了,并不需要复杂的编译过程)。
如上的演示例子中,我们使用编译技术处理的部分是(10 + pow(b, c)) * sqrt(4) - 1,其它部分我们只使用简单的文本处理。
麻雀虽小,但五脏俱全,这个计算器包含编译技术中最必要的部分。虽然这次我们只是实现了一个计算器,但所使用的技术足以实现一个简单的脚本语言的解释器了。
这个计算器分为如下几个部分:
词法分析:把表达式的文本,解析成词法元素列表(tokenList)。
语法分析:把tokenList解析成语法树(syntaxTree)。
语义分析:把语法树转成汇编语言的代码(asm)
汇编器:把汇编代码翻译为机器码(字节码)。
虚拟机:执行字节码。
一般的编译步聚中不包含“汇编器”和“虚拟机”,而这里之所以包含这两个部分是因为:
通常编译器会直接由中间代码生成机器码,而不是生成汇编代码,而这里我之所以要生成汇编代码的原因是“调试的时候汇编的可读性很好”,如果直接生成目标代码,则会非常难用肉眼来阅读。
自己实现虚拟机的原因是:现有的机器(包括物理机和虚拟机以及模拟器)的指令虽然也很丰富,但似乎都没有直接计算“乘方”或“开方”的指令,自已实现虚拟机可以任意设计计算指令,这样可以降低整个程序的复杂度。
因汇编器与虚拟机并不是编译原理的部分,所以下文中并不会描述其实现细节,但因为计算器代码编译后的目标代码就是汇编代码,所以需要把汇编指令做一下说明(以下把这个汇编语言简称为ASM)。
ASM指令介绍
指令助记符 操作数 指命说明 store number 把number放入栈顶 add 从栈顶取出两个数相加,并把结果压回栈中 sub 从栈顶取出一个数做为被减数,再取一个做为减数,相减之后的结果入栈 mul 从栈顶取出两个数相乘,并把结果入栈 div 从栈顶取出一个数做为除法的分子,再取出一个做为除法的分母,相除的结果入栈 pow 从栈顶取出一个数做为底,再取出一个做为幂,计算结果入栈 sqrt 从栈顶取出一个数,把这个数开平方后的结果入栈 print 在控制台打印栈顶的数字 这个虚拟机是基于栈来设计的,所有的计算指令的操作数都从栈中取,store命令向栈顶添加数据。
print指令用于打印当前栈顶的数据,在我们编译的汇编代码要做到:正确计算出结果,且计算完成之后的结果要刚好在栈顶,这样最后调用一个print指令即可以控制台看到计算结果。
ASM举例:
例1,如果我们要计算1-2*3,则我们写出的汇编代码如下(行号是为下文解释代码方便而放上去的,不是代码的一部分):
点击(此处)折叠或打开
store 3
store 2
mul
store 1
sub
print
对这段代码的说明如下:
前两行向栈顶添加两个数字,先压入3再压入2,这样栈顶的数字是2,第二个数字是3。
第三行mul会从栈顶弹出两个数字(2和3)计算乘法,并把结果(6)再压入栈中,此时栈中只有一个数字6。
第四行向栈顶压入一个数字1,此时栈顶为1,第二个数字是6。
第五行sub指令从栈顶取出两个数字,第一个数字1做为被减数,第二个数字6做为减数,即计算1-6,并把结果压入栈中,此时栈中只有一个数字-5。
最后一行print指令不对栈做写操作,只读取栈顶的数字,并打印出来。
在这里,我们用到两个运算,mul和sub,这两个运算都是二元运算,因我在设计指令的时候,先取出来的数字是第一个操作数,所以先压入的应该是第二个操作数,这也是为什么代码中先压入的是3,之后是2,最后才是1。
例2,如果我们要计算(10 + pow(2, 3)) * sqrt(4) - 1,则我们写出的汇编代码如下(行号是为下文解释代码方便而放上去的,不是代码的一部分):
点击(此处)折叠或打开
store 1
store 4
sqrt
store 3
store 2
pow
store 10
add
mul
sub
print
对这段代码的说明如下:
这段代码稍有点复杂,但有前一段代码的经验,我们可以看到,所有的操作数的先后顺序是
您可能关注的文档
- 基于合作共营小学语文作业编制与实践研究基于合作共营小学语文作业编制与实践研究.doc
- 基于品牌形象的标志设计研究---新阳生态农场为例基于品牌形象的标志设计研究---新阳生态农场为例.doc
- 基于哈密大枣的枣醋酿造工艺研究基于哈密大枣的枣醋酿造工艺研究.doc
- 基于地铁保护的专项施工方案基于地铁保护的专项施工方案.docx
- 基于多媒体的体验式教学激活英语语法教学动)基于多媒体的体验式教学激活英语语法教学动).doc
- 基于学习设计的研究性学习实施策略基于学习设计的研究性学习实施策略.doc
- 基于学情分析的有效数学教学基于学情分析的有效数学教学.doc
- 基于安卓坦克大战游戏毕业论文基于安卓坦克大战游戏毕业论文.doc
- 基于学科综合理念的中职学校音乐欣赏教学研究基于学科综合理念的中职学校音乐欣赏教学研究.doc
- 基于对话教学理论的课堂学习共同体研究与设计应用基于对话教学理论的课堂学习共同体研究与设计应用.docx
- 深度解析(2026)《ISO 22002-12025食品安全前提方案—第1部分:食品制造》.pptx
- 深度解析(2026)《ISO 22002-52025食品安全前提方案—第5部分:运输和储存》.pptx
- 深度解析(2026)《ISO 22002-42025 食品安全前提方案 — 第4部分:食品包装制造》.pptx
- 徒步活动策划方案.doc
- 深度解析(2026)《ISO 22002-62025食品安全前提方案—第6部分:饲料及动物食品生产》.pptx
- 2026年新版郯城期末真题卷.doc
- 深度解析(2026)《ISO 22476-72012岩土工程勘察与测试 — 现场测试 — 第7部分:钻孔千斤顶试验》.pptx
- 深度解析(2026)《ISO 22090-22014 船舶与海洋技术 — 航向传送装置(THD) — 第2部分:地磁原理》.pptx
- 深度解析(2026)《ISO 23584-22012 光学和光子学 — 参考字典规范 — 第 2 部分:类与特性定义》:构建智能制造数据基石的专家视角与未来展望.pptx
- 深度解析(2026)《ISO 22932-92025 Mining — Vocabulary — Part 9 Drainage》:构建未来矿山“水脉”治理与可持续发展的新语言体系.pptx
最近下载
- 江苏省2022年高中学业水平合格考生物试卷真题(精校打印).docx VIP
- 湖南女子学院《高等数学A》2025-2026学年期末考试试卷(A)卷.docx VIP
- Q∕GDW 13236.10-2019 导、地线采购标准 第10部分:钢芯耐热铝合金绞线专用技术规范.docx VIP
- 2024国家广播电视总局无线电台管理局招聘职位表下载.xls『180人』笔试备考题库及答案解析.docx VIP
- 城市排水管网雨污分流效果评价技术导则.pdf VIP
- Q∕GDW 13236.9-2019 导、地线采购标准 第9部分:铝合金绞线专用技术规范.docx VIP
- 2025年民族地区数字经济基础设施建设分析及未来五年发展趋势报告.docx
- 图文制作服务 投标方案(技术方案).doc VIP
- 西华大学《MATLAB与系统仿真》2023-2024学年第一学期期末试卷.doc VIP
- J502-2内装修-室内吊顶.pdf VIP
原创力文档


文档评论(0)