在JavaScript中编写解析器,对于任何语言,显然使用Map来存储名称到变量的映射。
大多数语言允许以某种方式或内部范围中的另一个变量在外部范围中遮蔽一个。实现这一目标的理想数据结构是功能映射。如果没有,似乎有两种选择。
将Map视为功能映射,创建外部映射的副本,将内部变量添加到副本,让内部作用域结束时进行垃圾回收。这很优雅,但每次花费O(N)时间复制现有变量,如果在给定点存在许多变量,可能会很慢。
使用完整的命令式样式,只需使用单个地图,保存旧的绑定并在内部范围的末尾恢复它。这很快,但不够优雅且容易出错。
我有没有更好的选择?对哪个选项最好有共识吗?
答案 0 :(得分:2)
使用Map
个对象的链接列表来表示范围链。如果在第一个链接中找不到标识符,则递归遍历其余的直到全局范围。