亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入解析C++設計模式編程中解釋器模式的運用

2020-05-23 14:06:36
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++設計模式編程中解釋器模式的運用,解釋器模式給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子,需要的朋友可以參考下
 

解釋器模式(interpreter),給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

解釋器模式需要解決的是,如果一種特定類型的問題發生的頻率足夠高,那么可能就值得將該問題的各個實例表述為一個簡單語言中的句子。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題。當有一個語言需要解釋執行,并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。用了解釋器模式,就意味著可以很容易地改變和擴展文法,因為該模式使用類來表示文法規則,你可使用繼承來改變或擴展該文法。也比較容易實現文法,因為定義抽象語法樹中各個節點的類的實現大體類似,這些類都易于直接編寫。

結構圖:

C++,設計模式編程,解釋器模式

 

實例:

音樂解釋器

playContext.h

/************************************************************************  * description: 演奏內容  * remark:    ************************************************************************/ #ifndef _PLAY_CONTEXT_H_ #define _PLAY_CONTEXT_H_ #include <string> #include <iostream> using namespace std; class playContext { public:   string getPlayText()   {     return m_strText;   }   void setPlayText(const string& strText)   {     m_strText = strText;   } private:   string m_strText; }; #endif// _PLAY_CONTEXT_H_ 

 

expression.h

/************************************************************************  * description: 表達式類  * remark:    ************************************************************************/ #ifndef _EXPRESSION_H_ #define _EXPRESSION_H_ #include "playContext.h" class expression { public:   // 解釋器   void interpret(playContext& PlayContext)   {     if (PlayContext.getPlayText().empty())     {       return;     }     else     {       string strPlayKey = PlayContext.getPlayText().substr(0, 1);       string strtemp = PlayContext.getPlayText().substr(2);       PlayContext.setPlayText(strtemp);              size_t nPos = PlayContext.getPlayText().find(" ");       string strPlayValue = PlayContext.getPlayText().substr(0, nPos);       int  nPlayValue = atoi(strPlayValue.c_str());       nPos = PlayContext.getPlayText().find(" ");       PlayContext.setPlayText(PlayContext.getPlayText().substr(nPos + 1));       excute(strPlayKey, nPlayValue);     }   }   // 執行   virtual void excute(string& strKey, const int nValue) = 0; private: }; #endif// _EXPRESSION_H_  

 

note.h

/************************************************************************  * description: 音符類  * remark:    ************************************************************************/ #ifndef _NOTE_H_ #define _NOTE_H_ #include "expression.h" class note : public expression { public:   virtual void excute(string& strKey, const int nValue)   {     char szKey[2];     strncpy(szKey, strKey.c_str(), strKey.length());     string strNote;     switch (szKey[0])     {     case 'C':       strNote = "1";       break;     case 'D':       strNote = "2";       break;     case 'E':       strNote = "3";       break;     case 'F':       strNote = "4";       break;     case 'G':       strNote = "5";       break;     case 'A':       strNote = "6";       break;     case 'B':       strNote = "7";       break;     default:       strNote = "error";       break;     }     cout << strNote << " ";   } }; #endif// _NOTE_H_ 

 

scale.h

/************************************************************************  * description: 音階類  * remark:    ************************************************************************/ #ifndef _SCALE_H_ #define _SCALE_H_ #include "expression.h" class scale : public expression { public:   virtual void excute(string& strKey, const int nValue)   {     string strScale;     switch (nValue)     {     case 1:       strScale = "低音";       break;     case 2:       strScale = "中音";       break;     case 3:       strScale = "高音";       break;     default:       strScale = "error";       break;     }     cout << strScale << " ";   } private: }; #endif// _SCALE_H_ 


speed.h

#ifndef _SPEED_H_ #define _SPEED_H_ #include "expression.h" class speed : public expression { public:   virtual void excute(string& strKey, const int nValue)   {     string strSpeed;     if (nValue < 3)     {       strSpeed = "快速";     }     else if (nValue >= 6)     {       strSpeed = "慢速";     }     else     {       strSpeed = "中速";     }     cout << strSpeed << " ";   } }; #endif// _SPEED_H_  

客戶端: InterpreterApp.cpp

// InterpreterApp.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include "note.h" #include "scale.h" #include "speed.h" #include "playContext.h" int _tmain(int argc, _TCHAR* argv[]) {   playContext context;   cout << "Music:";      context.setPlayText("T 2 O 2 E 3 G 5 G 5 ");   expression* expressObj = NULL;      while (!context.getPlayText().empty())   {     string strSep = context.getPlayText().substr(0, 1);     char szKey[2];     strncpy(szKey, strSep.c_str(), strSep.length());     switch (szKey[0])     {     case 'O':       expressObj = new scale();       break;     case 'T':       expressObj = new speed();       break;     case 'C':     case 'D':     case 'E':     case 'F':     case 'G':     case 'A':     case 'B':     case 'P':       expressObj = new note();       break;     default:       break;     }     if (NULL != expressObj)     {       expressObj->interpret(context);     }   }   system("pause");   return 0; } 

不足之處
解釋器模式不足的是,解釋器模式為文法中的每一條規則至少定義了一個類,因此包含許多規則的文法可能難以管理和維護。建議當文法非常復雜時,使用其他的技術如語法分析程序或編譯器生成器來處理。

適用場景

  • 當有一個語言需要解釋執行, 并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當存在以下情況時該模式效果最好:
  • 該文法簡單對于復雜的文法, 文法的類層次變得龐大而無法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構建抽象語法樹即可解釋表達式, 這樣可以節省空間而且還可能節省時間。
  • 效率不是一個關鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現的, 而是首先將它們轉換成另一種形式。例如,正則表達式通常被轉換成狀態機。但即使在這種情況下, 轉換器仍可用解釋器模式實現, 該模式仍是有用的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九九久久国产精品| 欧美最近摘花xxxx摘花| 国产亚洲成av人片在线观看桃| 国产一区二区三区在线视频| 国产亚洲欧洲在线| 亚洲有声小说3d| 中文一区二区视频| 国产69精品久久久久99| 亚洲男人天堂网站| 国产综合香蕉五月婷在线| 国产精自产拍久久久久久蜜| 欧美一级视频在线观看| 成人精品视频久久久久| 欧美精品久久久久久久久| 国产精品久久久亚洲| 精品香蕉在线观看视频一| 亚洲精品一区二区久| 日韩av理论片| 日韩电影大全免费观看2023年上| 国产一区二区三区视频在线观看| 岛国av午夜精品| 欧美激情一区二区久久久| 亚洲男子天堂网| 久久久精品影院| 国产精品午夜国产小视频| 久久国产精品99国产精| 欧美激情视频网址| 美女999久久久精品视频| 人妖精品videosex性欧美| 欧美一区二区色| 在线观看国产欧美| 国内精品一区二区三区| 欧美国产日韩中文字幕在线| 91精品免费看| 中文国产成人精品久久一| 91高潮精品免费porn| 日韩国产欧美精品一区二区三区| 国产精品久久久久久久美男| 国产视频在线观看一区二区| 精品国产31久久久久久| 亚洲三级 欧美三级| 色综合色综合久久综合频道88| 亚洲美女动态图120秒| 亚洲国产成人久久综合一区| 欧美激情视频网址| 日韩欧美国产免费播放| 日韩专区在线播放| 97精品视频在线播放| 久久人人爽人人爽人人片亚洲| 欧美大肥婆大肥bbbbb| 欧美日韩国产在线看| xxx欧美精品| 日韩av一区二区在线| 日韩精品在线私人| 午夜精品久久久久久99热软件| 成人免费看片视频| 国产欧美精品久久久| 国产欧美日韩专区发布| 在线播放日韩av| 狠狠爱在线视频一区| 欧美性生交xxxxxdddd| 欧美极品少妇xxxxⅹ免费视频| 亚洲女人天堂av| 日韩女优在线播放| 国产视频福利一区| 欧美日韩国产一区二区三区| 日韩精品视频观看| 狠狠躁夜夜躁人人爽天天天天97| 国产成人高清激情视频在线观看| 热久久美女精品天天吊色| www高清在线视频日韩欧美| 日韩一区二区三区国产| 国产精品一二区| 91亚洲国产成人久久精品网站| 亚洲激情视频在线播放| 91在线视频精品| 国产中文字幕91| 精品久久久久久久久久| 亚洲欧洲国产伦综合| 国产91精品久久久| 国产91露脸中文字幕在线| 国产精品一区二区三区免费视频| 国产a∨精品一区二区三区不卡| 国产视频精品在线| 热久久美女精品天天吊色| 在线成人激情黄色| 亚洲综合中文字幕68页| 亚洲国产欧美一区二区三区同亚洲| 日韩美女在线播放| 久久久亚洲影院你懂的| 免费91在线视频| 亚洲精品日韩久久久| 色哟哟入口国产精品| 国内外成人免费激情在线视频网站| 日韩美女视频免费在线观看| 97国产suv精品一区二区62| 久久精品成人动漫| 在线成人免费网站| 欧美又大粗又爽又黄大片视频| 日韩av电影免费观看高清| 欧美乱大交做爰xxxⅹ性3| 91精品国产乱码久久久久久久久| 久久精品这里热有精品| 国产丝袜一区视频在线观看| 日韩不卡在线观看| 色妞久久福利网| 国产精品video| 欧美尺度大的性做爰视频| www.久久久久久.com| 久久色精品视频| 欧美在线精品免播放器视频| 最近更新的2019中文字幕| 国产精品综合网站| 欧美最猛性xxxxx亚洲精品| 欧美精品在线观看91| 中文在线资源观看视频网站免费不卡| 精品国产乱码久久久久久婷婷| 欧美成人精品一区二区三区| 美女福利视频一区| 57pao国产精品一区| 97视频在线观看免费| 欧美午夜xxx| 亚洲自拍偷拍福利| 国产视频999| 午夜精品国产精品大乳美女| 色综合久久天天综线观看| 一区二区三区国产视频| 麻豆国产精品va在线观看不卡| 亚洲精品美女久久久久| 欧美激情欧美激情在线五月| 成人黄色免费在线观看| 亚洲美女中文字幕| 奇门遁甲1982国语版免费观看高清| 永久免费看mv网站入口亚洲| 亚洲偷熟乱区亚洲香蕉av| 久久久久国色av免费观看性色| 欧美成人激情视频| 欧美一级bbbbb性bbbb喷潮片| 国产精品成熟老女人| 国产欧美久久一区二区| 亚洲free性xxxx护士白浆| 久久久久中文字幕2018| 久久理论片午夜琪琪电影网| 国产一区二区久久精品| 欧美专区第一页| 人人做人人澡人人爽欧美| 伊人一区二区三区久久精品| 久久免费观看视频| 视频在线观看一区二区| 国产精品中文字幕在线| 国产69精品久久久久9999| 亚洲一区二区三区四区视频| 草民午夜欧美限制a级福利片| 欧美日韩另类字幕中文| 伊人精品在线观看| 日本精品一区二区三区在线| 久久精品男人天堂| 欧美在线视频在线播放完整版免费观看| 久久99国产精品自在自在app| 日韩欧美在线看| 欧美做受高潮电影o| 热99久久精品| 国产精品丝袜久久久久久不卡| 热re99久久精品国产66热|