基于编译原理的计算器设计与实现

基于编译原理的计算器设计与实现

ID:41724279

大小:226.81 KB

页数:12页

时间:2019-08-30

基于编译原理的计算器设计与实现_第1页
基于编译原理的计算器设计与实现_第2页
基于编译原理的计算器设计与实现_第3页
基于编译原理的计算器设计与实现_第4页
基于编译原理的计算器设计与实现_第5页
资源描述:

《基于编译原理的计算器设计与实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、基于编译原理的计算器设计与实现首先看一下这个计算器的功能:CALC>seta=1;b=2CALC>setc=3CALC>calc(10+pow(b,c))*sqrt(4)-135.0CALC>exit如上所示,这个计算器的功能非常简单:1.用set命令设置上下文中的变量。2.用calc命令计算一个表达式的值。3.用exit命令退出计算器。我们把编译的重点放在calc命令后面的计算表达式的解析,其它的部分我们可以简单处理(如set命令可以这样简单处理:先按分号分隔得到多个赋值处理,再按等号分隔就可以在上下文中设置变量了,并不需要复杂

2、的编译过程)。如上的演示例子中,我们使用编译技术处理的部分^(10+pow(b,c))*sqrt(4)・1,其它部分我们只使用简单的文本处理。麻雀虽小,但五脏俱全,这个计算器包含编译技术中最必要的部分。虽然这次我们只是实现了一个计算器,但所使用的技术足以实现一个简单的脚木语言的解释器了。这个计算器分为如下几个部分:词法分析:把表达式的文本,解析成词法元素列表(tokenUst)o语法分析:把tokenList解析成语法树(syntaxTree)o语义分析:把语法树转成汇编语言的代码(asm)汇编器:把汇编代码翻译为机器码(字节码)

3、。牌拟机:执行字节码。一般的编译步聚屮不包含"汇编器〃和“虚拟机〃,而这里之所以包含这两个部分是因为:通常编译器会直接山中间代码工成机器码,而不是牛成汇编代码,而这里我之所以要化成汇编代码的原因是“调试的吋候汇编的可读性很好〃,如果直接生成F1标代码,则会非常难用肉眼来阅读。自己实现虚拟机的原因是:现冇的机器(包括物理机和虚拟机以及模拟器)的指令虽然也很丰富,但似乎都没有直接计算“乘方〃或“开方〃的指令,口已实现虚拟机町以任意设计计算指令,这样可以降低整个程序的复杂度。因汇编器与虚拟机并不是编译原理的部分,所以下文中并不会描述其实

4、现细节,但因为计算器代码编译麻的目标代码就是汇编代码,所以需要把汇编指令做一下说明(以下把这个汇编语言简称为ASM)oASM指令介绍指令助记符操作数指命说明storenumber把number放入栈顶add从栈顶取出两个数相加,并把结果压回栈中sub从栈顶取出一•个数做为被减数,再取一个做为减数,相减Z后的结果入栈mul从栈顶取出两个数相乘,并把结果入栈div从栈顶取出一个数做为除法的分了,再取出一个做为除法的分母,相除的结果入栈pow从栈顶取出一个数做为底,再収出一个做为幕,计算结果入栈sqrt从栈顶取出一个数,把这个数开平方后

5、的结果入栈■print在控制台打印栈顶的数字jbM这个虚拟机是基于栈来设计的,所有的计算指令的操作数都从栈屮取,store命令向栈顶添加数据。print指令用于打印当前栈顶的数据,在我们编译的汇编代码耍做到:正确计算出结果,□计算完成之后的结果要刚好在栈顶,这样最后调用一个print指令即可以控制台看到计算结果。ASM举例:例1,如果我们要计算1-2*3,贝峨们写出的汇编代码如下(行号是为下文解释代码方便而放上去的,不是代码的一部分):点击(此处)折叠或打开store3store2mulstore1subprint对这段代码的说明

6、如下:前两行向栈顶添加两个数字,先压入3再压入2,这样栈顶的数字是2,第二个数字是3o第三行mul会从栈顶弹出两个数字(2和3)计算乘法,并把结果(6)再压入栈中,此时栈中只有一个数字6。第四行向栈顶压入一个数字1,此吋栈顶为1,第二个数字是6。第五行sub指令从栈顶取出两个数字,第一个数字1做为被减数,第二个数字6做为减数,即计算1・6,并把结果压入栈中,此时栈中只有一个数字・5。最后一行print指令不対栈做写操作,只读収栈顶的数字,并打印出來。在这里,我们用到两个运算,mul和sub,这两个运算都是二元运算,因我在设计指令的

7、时候,先取出来的数字是第一个操作数,所以先压入的M该是第二个操作数,这也是为什么代码中先压入的是3,Z后是2,最后才是例2,如果我们要计算(10+pow(2,3))*sqrt(4)-1,则我们写出的汇编代码如下(行号是为下文解释代码方便而放上去的,不是代码的一部分):点击(此处)折叠或打开store1store4sqrtstore3store2powstore10addmulsubprint对这段代码的说明如下:这段代码稍有点复杂,但有前一段代码的经验,我们可以看到,所有的操作数的先示顺序是从右向左store的,所以store指令

8、的顺序是固定下來的,剩下的关键是操作指令应该放在哪里。操作指令也是有一个规律的,即:当前栈顶的数据刚刚好满足某运算时,则操作指令就放在哪里,女Fhstore1的时候没有任何操作的操作数都在栈屮。store4的时候,刚刚好sqrt的操作数都在栈屮,则

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。