源码: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,则将上一个动态链的内容填到新的静态链中,否则将上一个静态链中的内容填入。