cpp: Interpreter Pattern
/*****************************************************************//** * \file DuSimple.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef DUSIMPLE_H #define DUSIMPLE_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include "DuExpression.h" #include "ActionDuExpression.h" #include "DirectionDuExpression.h" #include "DistanceDuExpression.h" #include "SentenceDuExpression.h" #include "AndDuExpression.h" #pragma warning(disable : 4996) using namespace std; namespace DuInterpreterPattern { /// <summary> /// /// </summary> class DuSimple { private: public: /// <summary> /// /// </summary> /// <param name="strExp"></param> /// <returns></returns> DuExpression* Analyse(string strExp); /// <summary> /// /// </summary> /// <param name="expression"></param> void Release(DuExpression* expression); }; } #endif /*****************************************************************//** * \file DuSimple.cpp * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #include "DuSimple.h" using namespace std; namespace DuInterpreterPattern { /// <summary> /// /// </summary> /// <param name="strExp"></param> /// <returns></returns> DuExpression* DuSimple::Analyse(string strExp) //strExp:要计算结果的表达式字符串,比如"left walk 15 and down run 20" { stack<DuExpression*> expStack; DuExpression* direction = nullptr; DuExpression* action = nullptr; DuExpression* distance = nullptr; DuExpression* left = nullptr; DuExpression* right = nullptr; //机器人运动控制命令之间是用空格来分隔的,所以用空格作为分隔字符来对整个字符串进行拆分 char* strc = new char[strlen(strExp.c_str()) + 1]; strcpy(strc, strExp.c_str()); //若本行编译报错提醒使用strcpy_s,则可以在文件头增加代码行:#pragma warning(disable : 4996) strcpy vector<string> resultVec; //#include <vector> char* tmpStr = strtok(strc, " "); //按空格来切割字符串 while (tmpStr != nullptr) { resultVec.push_back(string(tmpStr)); tmpStr = strtok(NULL, " "); } delete[] strc; for (auto iter = resultVec.begin(); iter != resultVec.end(); ++iter) { if ((*iter) == "and") //和 { left = expStack.top(); //返回栈顶元素(左操作数) ++iter; direction = new DistanceDuExpression(*iter); //运动方向 ++iter; action = new ActionDuExpression(*iter); //运动方式 ++iter; distance = new DistanceDuExpression(*iter); //运动距离 right = new SentenceDuExpression(direction, action, distance); expStack.push(new AndDuExpression(left, right)); } else { direction = new DirectionDuExpression(*iter); //运动方向 ++iter; action = new ActionDuExpression(*iter); //运动方式 ++iter; distance = new DistanceDuExpression(*iter); //运动距离 expStack.push(new SentenceDuExpression(direction, action, distance)); } } DuExpression* expression = expStack.top(); //返回栈顶元素 return expression; } /// <summary> /// /// </summary> /// <param name="expression"></param> void DuSimple::Release(DuExpression* expression) { //释放表达式树的节点内存 SentenceDuExpression* pSE = dynamic_cast<SentenceDuExpression*>(expression); if (pSE) { Release(pSE->getDirection()); Release(pSE->getAction()); Release(pSE->getDistance()); } else { AndDuExpression* pAE = dynamic_cast<AndDuExpression*>(expression); if (pAE) { Release(pAE->getLeft()); Release(pAE->getRight()); } } delete expression; } } /*****************************************************************//** * \file DuExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef DUEXPRESSION_H #define DUEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> using namespace std; namespace DuInterpreterPattern { /// <summary> /// 表达式父类 /// </summary> class DuExpression { public: /// <summary> /// 做父类时析构函数应该为虚函数 /// </summary> virtual ~DuExpression() {} // public: /// <summary> /// 解析语法树中的当前节点 /// </summary> /// <returns></returns> virtual string interpret() = 0; }; } #endif /*****************************************************************//** * \file DirectionDuExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef DIRECTIONDUEXPRESSION_H #define DIRECTIONDUEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "DuExpression.h" using namespace std; namespace DuInterpreterPattern { /// <summary> /// 运动方向表达式(终结符表达式) /// </summary> class DirectionDuExpression :public DuExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="direction"></param> DirectionDuExpression(const string& direction) { mDirection = direction; } /// <summary> /// /// </summary> /// <returns></returns> virtual string interpret() { if (mDirection == "up") { return "向上"; } else if (mDirection == "down") { return "向下"; } else if (mDirection == "left") { return "向左"; } else if (mDirection == "right") { return "向右"; } else { return "运动方向错"; } } private: /// <summary> /// 运动方向:up、down、left、right分别表示上、下、左、右 /// </summary> string mDirection; }; } #endif /*****************************************************************//** * \file ActionDuExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef ACTIONDUEXPRESSION_H #define ACTIONDUEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "DuExpression.h" using namespace std; namespace DuInterpreterPattern { /// <summary> /// 运动方式表达式(终结符表达式) /// </summary> class ActionDuExpression :public DuExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="action"></param> ActionDuExpression(const string& action) { mAction = action; } /// <summary> /// /// </summary> /// <returns></returns> virtual string interpret() { if (mAction == "walk") { return "行走"; } else if (mAction == "run") { return "奔跑"; } else { return "运动方式错"; } } private: /// <summary> /// 运动方式:walk、run分别表示行走、奔跑 /// </summary> string mAction; }; } #endif /*****************************************************************//** * \file DistanceDuExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef DISTANCEDUEXPRESSION_H #define DISTANCEDUEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "DuExpression.h" using namespace std; namespace DuInterpreterPattern { /// <summary> /// 运动距离表达式(终结符表达式) /// </summary> class DistanceDuExpression :public DuExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="distance"></param> DistanceDuExpression(const string& distance) { mDistance = distance; } /// <summary> /// /// </summary> /// <returns></returns> virtual string interpret() { return mDistance + "米"; } private: /// <summary> /// 运动距离,用字符串表示即可 /// </summary> string mDistance; }; } #endif /*****************************************************************//** * \file SentenceDuExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef SENTENCEDUEXPRESSION_H #define SENTENCEDUEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "DuExpression.h" using namespace std; namespace DuInterpreterPattern { /// <summary> /// “句子”表达式(非终结符表达式),“运动方向 运动方式 运动距离”构成 /// </summary> class SentenceDuExpression :public DuExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="direction"></param> /// <param name="action"></param> /// <param name="distance"></param> SentenceDuExpression(DuExpression* direction, DuExpression* action, DuExpression* distance) :mDirection(direction), mAction(action), mDistance(distance) {} /// <summary> /// /// </summary> /// <returns></returns> DuExpression* getDirection() { return mDirection; } /// <summary> /// /// </summary> /// <returns></returns> DuExpression* getAction() { return mAction; } /// <summary> /// /// </summary> /// <returns></returns> DuExpression* getDistance() { return mDistance; } /// <summary> /// /// </summary> /// <returns></returns> virtual string interpret() { return mDirection->interpret() + mAction->interpret() + mDistance->interpret(); } private: /// <summary> /// 运动方向 /// </summary> DuExpression* mDirection; /// <summary> /// 运动方式 /// </summary> DuExpression* mAction; /// <summary> /// 运动距离 /// </summary> DuExpression* mDistance; }; } #endif /*****************************************************************//** * \file AndDuExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef ANDDUEXPRESSION_H #define ANDDUEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "DuExpression.h" using namespace std; namespace DuInterpreterPattern { /// <summary> /// “和”表达式(非终结符表达式) /// </summary> class AndDuExpression :public DuExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="left"></param> /// <param name="right"></param> AndDuExpression(DuExpression* left, DuExpression* right) :mLeft(left), mRight(right) {} /// <summary> /// /// </summary> /// <returns></returns> DuExpression* getLeft() { return mLeft; } /// <summary> /// /// </summary> /// <returns></returns> DuExpression* getRight() { return mRight; } /// <summary> /// /// </summary> /// <returns></returns> virtual string interpret() { return mLeft->interpret() + "再" + mRight->interpret(); } private: //左右各有一个操作数 /// <summary> /// /// </summary> DuExpression* mLeft; /// <summary> /// /// </summary> DuExpression* mRight; }; } #endif /*****************************************************************//** * \file GoldExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GOLDEXPRESSION_H #define GOLDEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> using namespace std; namespace DuJewelryInterpreterPattern { /// <summary> /// 小表达式(节点)父类 /// </summary> class GoldExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="num"></param> /// <param name="sign"></param> GoldExpression(int num, char sign) :mNum(num), mSign(sign) {} /// <summary> /// 做父类时析构函数应该为虚函数 /// </summary> virtual ~GoldExpression() {} public: /// <summary> /// 解析语法树中的当前节点 /// </summary> /// <param name="var"></param> /// <returns></returns> virtual int interpret(map<char, int> var) = 0; //#include <map>,map容器中的键值对用于保存变量名及对应的值 public: //以下两个成员变量是为程序跟踪调试时观察某些数据方便而引入 /// <summary> /// 创建该对象时的一个编号,用于记录本对象是第几个创建的 /// </summary> int mNum; /// <summary> /// 标记本对象的类型,可能是个字符v代表变量(终结符表达式),也可能是个加减号(非终结符表达式) /// </summary> char mSign; }; } #endif /*****************************************************************//** * \file VarGoldExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef VARGOLDEXPRESSION_H #define VARGOLDEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "GoldExpression.h" using namespace std; namespace DuJewelryInterpreterPattern { /// <summary> /// 变量表达式(终结符表达式) /// </summary> class VarGoldExpression :public GoldExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="key"></param> /// <param name="num"></param> /// <param name="sign"></param> VarGoldExpression(const char& key, int num, char sign) :GoldExpression(num, sign) { mkey = key; } /// <summary> /// /// </summary> /// <param name="var"></param> /// <returns>返回变量名对应的数值</returns> virtual int interpret(map<char, int> var) { return var[mkey]; } private: /// <summary> /// 变量名,本范例中诸如a、b、c、d都是变量名 /// </summary> char mkey; }; } #endif /*****************************************************************//** * \file SymbolGoldExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef SYMBOLGOLDEXPRESSION_H #define SYMBOLGOLDEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "GoldExpression.h" using namespace std; namespace DuJewelryInterpreterPattern { /// <summary> /// 运算符表达式(非终结符表达式)父类 /// </summary> class SymbolGoldExpression :public GoldExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <param name="num"></param> /// <param name="sign"></param> SymbolGoldExpression(GoldExpression* left, GoldExpression* right, int num, char sign) :mLeft(left), mRight(right), GoldExpression(num, sign) {} /// <summary> /// /// </summary> /// <returns></returns> GoldExpression* getLeft() { return mLeft; } /// <summary> /// /// </summary> /// <returns></returns> GoldExpression* getRight() { return mRight; } protected: //左右各有一个操作数 /// <summary> /// /// </summary> GoldExpression* mLeft; /// <summary> /// /// </summary> GoldExpression* mRight; }; } #endif /*****************************************************************//** * \file AddGoldExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef ADDGOLDEXPRESSION_H #define ADDGOLDEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "GoldExpression.h" #include "SymbolGoldExpression.h" using namespace std; namespace DuJewelryInterpreterPattern { /// <summary> /// 加法运算符表达式(非终结符表达式) /// </summary> class AddGoldExpression :public SymbolGoldExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <param name="num"></param> /// <param name="sign"></param> AddGoldExpression(GoldExpression* left, GoldExpression* right, int num, char sign) :SymbolGoldExpression(left, right, num, sign) {} /// <summary> /// /// </summary> /// <param name="var"></param> /// <returns>返回两个变量相加的结果</returns> virtual int interpret(map<char, int> var) { //分步骤拆开写,方便理解和观察 int value1 = mLeft->interpret(var); //递归调用左操作数的interpret方法 int value2 = mRight->interpret(var); //递归调用右操作数的interpret方法 int result = value1 + value2; return result; } }; } #endif /*****************************************************************//** * \file SubGoldExpression.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef SUBGOLDEXPRESSION_H #define SUBGOLDEXPRESSION_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <vector> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include "GoldExpression.h" #include "SymbolGoldExpression.h" using namespace std; namespace DuJewelryInterpreterPattern { /// <summary> /// 减法运算符表达式(非终结符表达式) /// </summary> class SubGoldExpression :public SymbolGoldExpression { public: /// <summary> /// 构造函数 /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <param name="num"></param> /// <param name="sign"></param> SubGoldExpression(GoldExpression* left, GoldExpression* right, int num, char sign) :SymbolGoldExpression(left, right, num, sign) {} /// <summary> /// /// </summary> /// <param name="var"></param> /// <returns>返回两个变量相减的结果</returns> virtual int interpret(map<char, int> var) { int value1 = mLeft->interpret(var); int value2 = mRight->interpret(var); int result = value1 - value2; return result; // } }; } #endif /*****************************************************************//** * \file GoldSimple.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GOLDSIMPLE_H #define GOLDSIMPLE_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include "GoldExpression.h" #include "SymbolGoldExpression.h" #include "AddGoldExpression.h" #include "SubGoldExpression.h" #include "SymbolGoldExpression.h" #include "VarGoldExpression.h" using namespace std; namespace DuJewelryInterpreterPattern { /// <summary> /// /// </summary> class GoldSimple { private: public: /// <summary> /// /// </summary> /// <param name="expression"></param> void Release(GoldExpression* expression); /// <summary> /// /// </summary> /// <param name="strExp"></param> /// <returns></returns> GoldExpression* Analyse(string strExp); }; } #endif /*****************************************************************//** * \file GoldSimple.cpp * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #include "GoldSimple.h" using namespace std; namespace DuJewelryInterpreterPattern { //分析—创建语法树(表达式树) GoldExpression* GoldSimple::Analyse(string strExp) //strExp:要计算结果的表达式字符串,比如"a-b+c+d" { stack<GoldExpression*> expStack;//#include <stack>,这里用到了栈这种顺序容器 GoldExpression* left = nullptr; GoldExpression* right = nullptr; int icount = 1; for (size_t i = 0; i < strExp.size(); ++i)//循环遍历表达式字符串中的每个字符 { switch (strExp[i]) { case '+': //加法运算符表达式(非终结符表达式) left = expStack.top(); //返回栈顶元素(左操作数) ++i; right = new VarGoldExpression(strExp[i], icount++, 'v'); //v代表是个变量节点 //在栈顶增加元素 expStack.push(new AddGoldExpression(left, right, icount++, '+')); //'+'代表是个减法运算符节点 break; case '-': //减法运算符表达式(非终结符表达式) left = expStack.top(); //返回栈顶元素 ++i; right = new VarGoldExpression(strExp[i], icount++, 'v'); expStack.push(new SubGoldExpression(left, right, icount++, '-')); //'-'代表是个减法运算符节点 break; default: //变量表达式(终结符表达式) expStack.push(new VarGoldExpression(strExp[i], icount++, 'v')); break; } //end switch } //end for GoldExpression* expression = expStack.top(); //返回栈顶元素 return expression; } /// <summary> /// /// </summary> /// <param name="expression"></param> void GoldSimple::Release(GoldExpression* expression) { //释放表达式树的节点内存 SymbolGoldExpression* pSE = dynamic_cast<SymbolGoldExpression*>(expression); //此处代码有优化空间(不使用dynamic_cast),留给读者思考 if (pSE) { Release(pSE->getLeft()); Release(pSE->getRight()); } delete expression; } } /*****************************************************************//** * \file GeovinDu.h * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #pragma once #ifndef GEOVINDU_H #define GEOVINDU_H #include<cstring> #include<stdbool.h> #include<stdlib.h> #include<iostream> #include<malloc.h> #include<cmath> #include <iostream> #include <sstream> #include <algorithm> #include <array> #include <functional> #include <list> #include <string> #include <string.h> #include <vector> #include <map> #include <stack> #include "GoldExpression.h" #include "SymbolGoldExpression.h" #include "AddGoldExpression.h" #include "SubGoldExpression.h" #include "SymbolGoldExpression.h" #include "VarGoldExpression.h" #include "GoldSimple.h" #include "DuExpression.h" #include "ActionDuExpression.h" #include "DirectionDuExpression.h" #include "DistanceDuExpression.h" #include "SentenceDuExpression.h" #include "AndDuExpression.h" #include "DuSimple.h" using namespace std; using namespace DuInterpreterPattern; namespace DuJewelryInterpreterPattern { /// <summary> /// /// </summary> class GeovinDu { private: public: /// <summary> /// /// </summary> void displaySimple(); /// <summary> /// /// </summary> void displayDuSimple(); }; } #endif /*****************************************************************//** * \file GeovinDu.cpp * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit. * \author geovindu * \date June 2023 *********************************************************************/ #include "GeovinDu.h" using namespace std; namespace DuJewelryInterpreterPattern { /// <summary> /// /// </summary> void GeovinDu::displaySimple() { string strExp = "a-b+c+d"; //将要求值的字符串表达式 map<char, int> varmap; //下面是给字符串表达式中所有参与运算的变量一个对应的数值 varmap.insert(make_pair('a', 7)); //类似于赋值语句a = 7 varmap.insert(make_pair('b', 9)); //类似于赋值语句b = 9 varmap.insert(make_pair('c', 3)); //类似于赋值语句c = 3 varmap.insert(make_pair('d', 2)); //类似于赋值语句d = 2 GoldSimple simple; DuJewelryInterpreterPattern::GoldExpression* expression = simple.Analyse(strExp); //调用analyse函数创建语法树 int result = expression->interpret(varmap); //调用interpret接口求解字符串表达式的结果 cout << "字符串表达式\"a - b + c + d\"的计算结果为:" << result << endl; //输出字符串表达式结果 //释放内存 simple.Release(expression); } /// <summary> /// /// </summary> void GeovinDu::displayDuSimple() { string strExp = "left walk 15 and down run 20"; DuSimple simple; DuInterpreterPattern::DuExpression* expression = simple.Analyse(strExp); //调用analyse函数创建语法树 cout << expression->interpret() << endl; //释放内存 simple.Release(expression); } }
调用:
/*****************************************************************//** * \file ConsoleDuInterpreterPattern.cpp * \brief Interpreter Pattern 解释器模式 C++ 14 * 2023年6月10日 涂聚文 Geovin Du Visual Studio 2022 edit.文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 * \author geovindu * \date June 2023 *********************************************************************/ // ConsoleDuInterpreterPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #define _UNICODE #include <iostream> #include "GeovinDu.h" using namespace std; using namespace DuJewelryInterpreterPattern; #pragma warning(disable : 4996) #ifdef _DEBUG //只在Debug(调试)模式下 #ifndef DEBUG_NEW #define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符 #define new DEBUG_NEW #endif #endif int main() { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口 std::cout << "Hello World!涂聚文 Geovin Du\n"; GeovinDu geovindu; geovindu.displaySimple(); cout << "*************" << endl; geovindu.displayDuSimple(); system("pause"); return 0; } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 #define UNICODE
输出:
Hello World!涂聚文 Geovin Du 字符串表达式"a - b + c + d"的计算结果为:3 ************* 向左行走15米再down米奔跑20米 请按任意键继续. . .
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)