1. 程式人生 > >面試題|手寫JSON解析器

面試題|手寫JSON解析器

這周的 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 '}'

兩個圖其實是等價的。

一個基於視覺,一個基於文字。基於文字語法的語法 —— 巴科斯-諾爾正規化,通常被提供給另一個解析這種語法併為其生成解析器的解析器,終於說到解析器了!