面試題|手寫JSON解析器
阿新 • • 發佈:2020-02-23
這周的 Cassidoo 的每週簡訊有這麼一個面試題::
寫一個函式,這個函式接收一個正確的 JSON 字串並將其轉化為一個物件(或字典,對映等,這取決於你選擇的語言)。示例輸入:
fakeParseJSON('{ "data": { "fish": "cake", "array": [1,2,3], "children": [ { "something": "else" }, { "candy": "cane" }, { "sponge": "bob" } ] } } ')
當時,我想這麼寫:
const fakeParseJSON = JSON.parse;
但是,我想起之前寫了一些關於AST的文章,
- 用Babel實現自定義JavaScript語法
- 一步步教你實現一個Babel轉換器
- 使用JavaScript操作AST
其中涵蓋了編譯器管道的概述以及如何操作AST,但是我沒有過多介紹如何實現解析器。因為實現JavaScript編譯器對我來說是一項艱鉅的任務。
那就沒必要擔心。 JSON也是一種語言,有自己的語法,可以參考規範。 根據編寫JSON解析器所需的知識和技術轉移到編寫JS解析器中。
好了,那就開始編寫一個JSON解析器吧。
語法
檢視規範文件頁面,可以看到以下兩個圖。
- 左測的語法圖(或者叫鐵路圖)
- 右側的McKeeman Form,巴克斯-諾爾正規化(BNF)的一種變體。
json
element
value
object
array
string
number
"true"
"false"
"null"
object
'{' ws '}'
'{' members '}'
兩個圖其實是等價的。
一個基於視覺,一個基於文字。基於文字語法的語法 —— 巴科斯-諾爾正規化,通常被提供給另一個解析這種語法併為其生成解析器的解析器,終於說到解析器了!