2017-04-08 47 views
1

用JavaScript编写解析器,对于任何语言,显然都使用Map来存储名称映射到变量。JavaScript Map shadowing

大多数语言都允许某种方式或其他变量在内部作用域中映射到外部作用域中的一个变量。实现这一功能的理想数据结构是功能图。如果没有这一点,似乎有两种选择。

  1. 款待地图就好像它是一个功能图,创建外映射的副本,内变量添加到复制,让它成为当内范围结束垃圾收集。这是优雅的,但每次花费O(N)时间复制现有变量,因此如果在给定点处存在许多变量,则可能会变得很慢。

  2. 进入完整的命令风格,只需使用单个映射,保存旧的绑定并将其恢复到内部作用域的末尾。这很快,但不雅,且容易出错。

有没有更好的选择我错过了?关于哪种选择最好,是否有共识?

+0

“*明显使用Map来存储名称映射到变量。*” - 为什么? – Bergi

+0

你在编写解析器还是解释器?解析器不需要存储实际变量。 – Bergi

+0

@Bergi那么,现在我正在为TPTP文件格式编写一个解析器,它确实需要存储实际变量。 – rwallace

回答

2

使用Map对象的链表来表示范围。如果在第一个链接中找不到标识符,则递归遍历剩下的全局范围。

+0

对,这是一个选项;它相当于用线性时间查找来创建一个简单的功能性地图类,如果有很多变量,它又有可能变慢。 – rwallace

+1

是的,它基本上就是这样。但是,对于具有多个变量的作用域,它的确处理得比线性更好,并且链接的链接数量通常是有限的,因为没有在编写完好的程序中无限制地嵌套(范围)块。总的来说,我仍然期望'O(1)'访问。 – Bergi

+1

为了以防万一,如果您需要更好的性能,您可以通过在查看结果时将查找结果(假设范围是静态的,并且存储变量引用,而不是值) (即懒惰地复制条目),同时保持数据结构透明。 – Bergi