這個(gè)星期,項(xiàng)目中要使用C++或C語言解析JSON格式的數(shù)據(jù),,把解析的結(jié)果放到一個(gè)通用的數(shù)據(jù)結(jié)構(gòu),。這個(gè)通用的數(shù)據(jù)結(jié)構(gòu),實(shí)際上是作為web服務(wù)層(這一層大家可以認(rèn)為是類似于PHP服務(wù)器或webpy的服務(wù)器容器)到web頁(yè)面層(這一層是語法類似PHP腳本或者tornardo模板)的數(shù)據(jù)傳輸?shù)膮f(xié)議,。 之所以要這樣處理,, 主要是因?yàn)檫@個(gè)web類的項(xiàng)目(一般的web類項(xiàng)目也是如此)需求變化較快,而web的服務(wù)層使用是采用C++進(jìn)行開發(fā)的,,為了使當(dāng)web服務(wù)層的數(shù)據(jù)格式變化不影響web頁(yè)面層,,所以雙方使用統(tǒng)一的通用的數(shù)據(jù)結(jié)構(gòu)。而之所以交代這么多的背景是,, 為了讓大家了解為什么我們不使用類似rapidjson或jsoncpp來實(shí)現(xiàn)json的解析而需要手寫解析器,。 因?yàn)槭褂妙愃苧apidJson或者是jsoncpp之類的Json解析器,相當(dāng)于我們要做:
JSON文檔 -> json DOM -> 通用數(shù)據(jù)結(jié)構(gòu),。
而如果手寫解析器,,只需要做:
JSON文檔 -> 通用數(shù)據(jù)結(jié)構(gòu),。
少一層轉(zhuǎn)換能換來很多效率的提升。
說了這么多,,下面開始進(jìn)入正題,。 以前學(xué)編譯原理的時(shí)候,老師推薦過LEX /YACC來寫編譯器,,其實(shí)這是古老的UNIX軟件,。 LINUX上有他們的GNU版本 FLEX、BISON,。 這兩個(gè)東西一個(gè)是詞法分析器,,一個(gè)是語法分析器。詞法分析器的作用是把字符解析成單詞,。一般的把單詞稱為token, 而語法分析器則是把單詞解析成語法樹,。
|