Json解析器
初衷
編寫Json解析器目的是為了拓展自己的知識廣度,并且通過簡單的手寫實踐,能夠深入了解一些技術細節(AST、DFA&NFA、LL(1)文法),以及便于了解目前主流的前端架構設計。
那麼就通過Json,切入正題
Json
Json一共定義了四種資料類型:數值類型、字元串類型、數組、對象。
其中,前兩者可以歸納為基本類型,後兩個可以歸納為複合類型。
不過,還有一種特殊的值:
true,false,null,undefined
,這些值統一歸類為關鍵字(keyword)
參考一下Json官方定義
何為解析?
将源字元串轉換成我們預先定義的資料結構(本文專指Json)的過程。
其中,轉換的過程可以稱之為”詞法/文法分析”
解析器
解析器類似于我們常見的加工處理器,處理資料的結果,就是我們得到的最終形式。
解析的過程分為兩步:
- 詞法分析器(将字元流轉換為Token流)
- 文法分析器(把Token流轉換為Json對象)
詞法分析(Tokenization)
負責将源字元串分析,篩選為一個個具有單獨含義的單詞(詞法單元:Token)。
而這些單詞就是我們預先定義的資料結構(Json)中的資料類型。
首先,定義一組Token,用來描述我們的資料類型
關鍵字
- true
- false
- null
- undefined
這四個是最簡單也是最基本的資料結構,很容易描述。隻要通過進行簡單的字元比對,就可以進行識别。
數值類型
參考MDN對數值類型的描述
- 有符号
- 整型
- 浮點型
- 指數型(-10e2)
- 無窮數值
- 無符号
- 整型
- 浮點型
- 指數型
- 無窮數值
字元串類型
定義: 以’ “ ‘起始,并以’ “ ‘成對比對結尾的資料結構,即判定為字元串。
對象類型
定義: 以’ { ‘起始,并以’ } ‘成對比對結尾的資料結構,并且以key-value的形式存在,key為基本字元串類型,即判定為對象。
數組類型
定義: 以’ [ ‘起始,并以’ ] ‘成對比對結尾的資料結構,并且資料單元之間以’ , ‘進行分割,即判定為數組。
文法分析
得到Token流之後,接下來就是文法分析了。
JSON文法是遵循LL(1)(即文法無左遞歸),這就可以是遞歸構造我們的文法解析器了。
什麼是Json解析器
Json解析器,就是實作将源字元串轉換為Json對象的工具。
在JS中,可以參考
JSON.parse(str)
(MDN文檔)
手寫Json解析器
通過了解了Json解析器的工作原理之後,那麼在下一節将通過純原生JS手寫一個簡單的JSON.parse功能。
參考資料
自己實作JSON、XML的解析:https://juejin.im/post/5a46e174518825698e726486
實作簡單的JSON解析器:https://segmentfault.com/a/1190000010998941
解析器編寫思路:https://www.zhihu.com/question/24640264/answer/80500016