11 嵌套过程调用 | 《Let’s Build A Simple Interpreter》笔记

本系列是《Let’s Build A Simple Interpreter》的阅读笔记。

在当前的代码实现中,过程对应的嵌套层级被写死成了 2,对于嵌套过程调用并不适配,需要做出修改。

首先需要为符号增加表示作用域层级的成员:

1
2
3
4
class Symbol:
def __init__(self, name, type=None):
...
self.scope_level = 0

然后当符号被添加到符号表时为其记录作用域层级:

1
2
3
4
5
6
7
8
class ScopedSymbolTable:
...
def insert(self, symbol):
self.log(f'Insert: {symbol.name}')

symbol.scope_level = self.scope_level

self._symbols[symbol.name] = symbol

这样,当在 visit_ProcedureCall 方法中为过程调用创建活动记录时,就可以访问过程符号的作用域层级。剩下要做的就是使用过程符号的作用域层级作为 nesting_level 参数的值:

1
2
3
4
5
6
7
8
9
10
11
class Interpreter(NodeVisitor):
...
def visit_ProcedureCall(self, node):
proc_name = node.proc_name
proc_symbol = node.proc_symbol

ar = ActivationRecord(
name=proc_name,
type=ARType.PROCEDURE,
nesting_level=proc_symbol.scope_level + 1,
)

11 嵌套过程调用 | 《Let’s Build A Simple Interpreter》笔记

http://www.zh0ngtian.tech/posts/73da3b47.html

作者

zhongtian

发布于

2021-08-28

更新于

2023-12-16

许可协议

评论