编译原理之解释执行

源码:https://github.com/yanguojun123/Compile生成目标代码后就可进行解释执行了。整体思路:1.具体实现: 扫描目标代码表,根据每条代码在的作用进行相应的实现。在这个实验中,我用了一个int数组来记录活动,用了一个栈来进行计算。有着指向代码的指针sp,当sp的值指向最后一条代码时则结束。每条代码的具体实现:1.1 jmp:直接...
摘要由CSDN通过智能技术生成

源码:https://github.com/yanguojun123/Compile

生成目标代码后就可进行解释执行了。

整体思路:

1.具体实现:

     扫描目标代码表,根据每条代码在的作用进行相应的实现。在这个实验中,我用了一个int数组来记录活动,用了一个栈来进行计算。有着指向代码的指针sp,当sp的值指向最后一条代码时则结束。

每条代码的具体实现:

1.1 jmp:

直接将代码指针更改为a域里的值,如果此时代码指针为0,则把主过程的动态链,返回地址和静态链填到活动记录数组里。

1.2 opr

根据a域里的值进行相应的计算,例如如果为1,则将栈顶和次栈顶的数相加,然后将其结果保存到栈顶。如果为0,表示退出此过程,则将其活动记录数组的指针指向前一个过程的动态链,然后修改当前的返回地址和静态链。

1.3 lit

将其a域的值放到栈顶。

1.4 lod

   先根据层差找到其变量所在的动态链,如果层差为0,则为当前过程的动态链,如果不为0,则先取出静态链的中地址,找到上一层的动态链,并在循环中多次进行层差次数次,再根据a域的相对地址将对应的值放到栈顶。

1.5 sto

   跟lod类似,不过是修改这个变量的值为栈顶的值。

1.6 cal

   根据过程的层差填写要调用过程的动态链,返回地址和静态链。动态链的内容即为当前活动记录指针的值,而返回地址为当前代码指针的下一位,如果层差为0,则将上一个动态链的内容填到新的静态链中,否则将上一个静态链中的内容填入。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值