【发布时间】:2017-04-08 16:52:27
【问题描述】:
用 JavaScript 编写解析器,对于任何语言,显然都使用 Map 来存储名称到变量的映射。
大多数语言都允许以某种方式或另一个变量在内部范围内隐藏外部范围内的变量。实现这一点的理想数据结构是功能映射。如果没有这个,似乎有两种选择。
将 Map 视为功能映射,创建外部映射的副本,将内部变量添加到副本中,当内部范围结束时将其作为垃圾回收。这很优雅,但每次都花费 O(N) 时间复制现有变量,因此如果在给定点存在许多变量,则可能会很慢。
采用完整的命令式样式,只需使用单个映射,保存旧绑定并在内部范围的末尾恢复它。这速度很快,但不优雅且容易出错。
还有更好的选择吗?是否就哪个选项最好达成共识?
【问题讨论】:
-
"显然使用 Map 来存储名称到变量的映射。" - 为什么?
-
你在写解析器还是解释器?解析器不需要存储实际变量。
-
@Bergi 好吧,现在我正在为 TPTP 文件格式编写一个解析器,它确实需要存储实际变量。
标签: javascript dictionary lexical-scope