编译原理的计算器设计与实现.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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 如上所示,这个计算器的功能非常简单: 1. 用 set 命令设置上下文中的变量。 2. 用 calc 命令计算一个表达式的值。 3. 用 exit 命令退出计算器。 我们把编译的重点放在 calc 命令后面的计算表达式的解读,其它的部分我们可以简单 处理(如 set 命令可以这样简单处理:先按分号分隔得到多个赋值处理,再按等号分隔就 可以在上下文中设置变量了,并不需要复杂的编译过程)。 矚慫润厲钐瘗睞枥庑赖。 如上的演示例子中,我们使用编译技术处理的部分是 (10 + pow(b, c)) * sqrt(4) - 1 ,其它 部分我们只使用简单的文本处理。 聞創沟燴鐺險爱氇谴净。 麻雀虽小,但五脏俱全,这个计算器包含编译技术中最必要的部分。虽然这次我们只 是实现了一个计算器,但所使用的技术足以实现一个简单的脚本语言的解释器了。 残骛楼諍 锩瀨濟溆塹籟。 这个计算器分为如下几个部分: 词法分析:把表达式的文本,解读成词法元素列表 (tokenList) 。 语法分析:把 tokenList 解读成语法树 (syntaxTree)。 语义分析:把语法树转成汇编语言的代码 (asm) 汇编器:把汇编代码翻译为机器码(字节码)。 虚拟机:执行字节码。 一般的编译步聚中不包含 “汇编器 ”和 “虚拟机 ”,而这里之所以包含这两个部分是因 为: 通常编译器会直接由中间代码生成机器码,而不是生成汇编代码,而这里我之所以要 生成汇编代码的原因是 “调试的时候汇编的可读性很好 ”,如果直接生成目标代码,则会非 常难用肉眼来阅读。 酽锕极額閉镇桧猪訣锥。 自己实现虚拟机的原因是:现有的机器(包括物理机和虚拟机以及模拟器)的指令虽 然也很丰富,但似乎都没有直接计算 “乘方 ”或 “开方 ”的指令,自已实现虚拟机可以任意设 计计算指令,这样可以降低整个程序的复杂度。 彈贸摄尔霁毙攬砖卤庑。 因汇编器与虚拟机并不是编译原理的部分,所以下文中并不会描述其实现细节,但因 为计算器代码编译后的目标代码就是汇编代码,所以需要把汇编指令做一下说明(以下把 这个汇编语言简称为 ASM )。 謀荞抟箧飆鐸怼类蒋薔。 ASM 指令介绍 指 令 操 指命说明 助记符 作数 nu store 把 number 放入栈顶 mber add 从栈顶取出两个数相加,并把结果压回栈中 从栈顶取出一个数做为被减数,再取一个做为减数,相减之后的 sub 结果入栈 mul 从栈顶取出两个数相乘,并把结果入栈 从栈顶取出一个数做为除法的分子,再取出一个做为除法的分 div 母,相除的结果入栈 pow 从栈顶取出一个数做为底,再取出一个做为幂,计算结果入栈 sqrt 从栈顶取出一个数,把这个数开平方后的结果入栈 print 在控制台打印栈顶的数字 这个虚拟机是基于栈来设计的,所有的计算指令的操作数都从栈中取,

文档评论(0)

yanmei520 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档