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,
)
评论系统采用 utterances ,加载有延迟,请稍等片刻。