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

本文最后更新于:2021年9月8日

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

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

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

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

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 参数的值:

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,
        )