2017-04-08 91 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