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

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

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

2020-01-26 14:40:27
字體:
來源:轉載
供稿:網友

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

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

結構圖:

2016316110227128.jpg (450×242)

實例:

音樂解釋器

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
大胆人体色综合| 欧美综合国产精品久久丁香| 91视频8mav| 亚洲一区二区三区sesese| 91色琪琪电影亚洲精品久久| 伊人一区二区三区久久精品| 欧美老女人在线视频| 欧美小视频在线观看| 日韩中文字幕国产| 8x海外华人永久免费日韩内陆视频| 日韩亚洲国产中文字幕| 亚洲午夜未删减在线观看| 亚洲精品自产拍| 亚洲国产精久久久久久| 亚洲欧美精品一区| 亚洲国产成人精品久久| 亚洲国产精品推荐| 91精品久久久久久久久久入口| 国产精品视频yy9099| 国产美女直播视频一区| 欧美激情一区二区三区高清视频| 国产精品久久久久久久一区探花| 欧美在线性爱视频| 国产精品久久久久久久久久久久久久| 97久久超碰福利国产精品…| 秋霞av国产精品一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 精品免费在线视频| 日韩电影中文 亚洲精品乱码| 国产精品日韩欧美大师| 97超级碰碰人国产在线观看| www日韩中文字幕在线看| 日本精品久久中文字幕佐佐木| 久久精品影视伊人网| 97在线视频观看| 国产成人综合精品在线| 热久久视久久精品18亚洲精品| 九九热这里只有精品免费看| 日韩成人久久久| 久久久久久久久久久成人| 久久综合伊人77777蜜臀| 欧美午夜精品伦理| 国产精品女人网站| 国产日韩在线看片| 欧美中文字幕在线观看| 久久久91精品| 日韩欧美视频一区二区三区| 91福利视频网| 日韩成人中文电影| 国产一区二区三区久久精品| 亚洲精品福利视频| 日韩精品视频在线免费观看| 国产精品91视频| 国产精品一区二区久久精品| 亚洲乱亚洲乱妇无码| 久久国产精品视频| 一区二区在线免费视频| 日本精品免费一区二区三区| 亚洲欧美日韩一区二区在线| 日韩中文字幕在线免费观看| 国产精品爱久久久久久久| 57pao成人永久免费视频| 欧美—级a级欧美特级ar全黄| 亚洲小视频在线观看| 91欧美日韩一区| 国内精品久久久久| 日韩中文字幕av| 精品无人区太爽高潮在线播放| 国产精品久久精品| 91精品国产亚洲| 狠狠久久亚洲欧美专区| 日韩国产中文字幕| 国产日韩精品在线| 欧美乱大交xxxxx另类电影| 黑人巨大精品欧美一区二区一视频| 亚洲欧美国产一区二区三区| 91色视频在线导航| 26uuu另类亚洲欧美日本一| 欧美综合一区第一页| 一区二区三区视频观看| 亚洲xxxx视频| 国产精品白丝jk喷水视频一区| 亚洲免费人成在线视频观看| 日韩精品在线观看视频| 日韩av手机在线看| 国产精品久久久久高潮| 97国产一区二区精品久久呦| 欧美国产日产韩国视频| 日韩中文在线中文网在线观看| 欧美日韩加勒比精品一区| 国产精品爽爽ⅴa在线观看| 97在线观看视频| 国产精品丝袜久久久久久不卡| 91精品在线观看视频| 日韩在线精品视频| 超薄丝袜一区二区| 色偷偷av一区二区三区| 亚洲少妇中文在线| 日韩亚洲精品电影| 亚洲成在人线av| 精品久久中文字幕久久av| 国产精品日韩在线播放| 97精品伊人久久久大香线蕉| 久久噜噜噜精品国产亚洲综合| 亚洲天堂av在线免费| 久久久电影免费观看完整版| 欧美激情精品久久久久久蜜臀| 91久久久亚洲精品| 欧美日韩国产精品一区| 日本韩国欧美精品大片卡二| 久久精品亚洲94久久精品| 51视频国产精品一区二区| 久久久久久香蕉网| 精品久久久香蕉免费精品视频| 成人h猎奇视频网站| 久久久精品在线观看| 2021久久精品国产99国产精品| 欧美精品videos另类日本| 日韩hd视频在线观看| 成人亚洲综合色就1024| 久久这里只有精品视频首页| 九九精品在线视频| 国产精品草莓在线免费观看| 国产精品久久久久久亚洲影视| 国产精品久久久久一区二区| 超碰97人人做人人爱少妇| 亚洲性日韩精品一区二区| 亚洲精品国偷自产在线99热| 国产成人啪精品视频免费网| 国产成人自拍视频在线观看| 日韩av在线免费观看| 欧美大片免费看| 久久久久久com| 欧美日韩一区免费| 欧美黑人巨大精品一区二区| 国产成人精品视频在线观看| 九九久久精品一区| 亚洲白拍色综合图区| 97碰在线观看| 精品亚洲aⅴ在线观看| 亚洲欧美日韩中文在线制服| 国产日韩精品在线播放| 久久天天躁日日躁| 亚洲国语精品自产拍在线观看| 欧美极度另类性三渗透| 98视频在线噜噜噜国产| 国产99久久精品一区二区| 日韩精品视频在线免费观看| 2019中文在线观看| 亚洲欧美三级在线| 亚洲电影免费观看高清完整版在线| 一区二区欧美在线| 国产美女高潮久久白浆| 午夜美女久久久久爽久久| 亚洲美女av网站| 欧美在线免费观看| 欧美性猛交xxxx乱大交3| 国产精品人成电影在线观看| 91免费高清视频| 成人啪啪免费看| 亚洲精品久久久久久久久久久| 日韩中文字幕视频在线观看| 91人人爽人人爽人人精88v| 亚洲国产欧美一区二区三区久久|