編寫示例程式,解析json格式資料。
像我們程式設計師日常使用的json解析、正規表示式、更甚者編譯器編譯**,這些其實都是一種制定了規則,將一些符號進行翻譯,解釋成特定的功能,其實這些都用了直譯器模式的思想。
json資料示例
,
]}
interpreter.h
在該檔案中,實現了解析基類iinterpreter、及其子類ccurlybraces(大括號{}內內容解析)、cbrackets(中括號內內容解析)、cgetvaluebykey(根據key獲取value)。對於json格式資料解析,解析這3種情況即可。{}之間的內容可能有{}或者,之間的內容可能有{}或者,可通過不斷的遞迴解析,知道能夠通過cgetvaluebykey(根據key獲取value)得到最終的值。
#pragma once
#include #include //取出{}之間的內容
//取出之間的內容
//根據key解析出value
//解析基類
class iinterpreter
virtual ~iinterpreter()
virtual void getvalue(std::string strdata) = 0;
};//大括號{}內內容解析
class ccurlybraces : public iinterpreter
//取出{}之間的內容
void getvalue(std::string strdata)
之間的內容" << std::endl;
}};//中括號內內容解析
class cbrackets : public iinterpreter
virtual ~cbrackets()
//取出之間的內容
void getvalue(std::string strdata) };
//根據key獲取value
class cgetvaluebykey : public iinterpreter
virtual ~cgetvaluebykey()
//根據key取出value
void getvalue(std::string strdata)
};
直譯器模式:給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。
直譯器模式需要解決的是,如果乙個特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。
直譯器模式,包括非終結符表示式和終結符表示式。上面示例中的子類ccurlybraces(大括號{}內內容解析)、cbrackets(中括號內內容解析)為非終結符表示式,可通過不斷的遞迴呼叫,最終使用終結符表示式得到解釋的結果。子類cgetvaluebykey(根據key獲取value)為終結符表示式,可通過該表示式直接解發布最終的結果。
直譯器模式,就意味著可以很容易地改變或者擴充套件文法,因為該模式使用類來表示文法規則,可以使用繼承來改變或者擴充套件該文法。也比較容易實現文法,因為抽象語法樹中各個節點的類的實現大體類似,這些類都易於直接編寫。
正規表示式就是直譯器模式的一種應用,直譯器為正規表示式定義了乙個文法,如何表示乙個特定的正規表示式,以及如何解釋這個正規表示式。
如果乙個特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。
直譯器模式的不足:直譯器模式為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理和維護。建議當文法非常複雜時,使用其他的技術如語法分析程式或者編譯器生成器來處理。
返回目錄:設計模式(c++實現)(總)
大話設計模式筆記(二十四) 直譯器模式
給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。容易改變和擴充套件文法,因為該模式使用類...
設計模式 二十 直譯器模式 C
直譯器模式需要解決的是,如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。當有乙個語言需要解釋執行,並且你可將該語言中的句子表示為乙個抽象語法樹時,可使用直譯器模式。include in...
設計模式(二十四) 訪問者模式
訪問者模式,表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。1.如下 using system namespace visitor using system namespace visitor using system namespace v...