当前位置:   article > 正文

C++设计模式-解释器模式_c++解释器

c++解释器

目录

 

基本概念

代码与实例


 

基本概念

解释器模式(interpreter):给定一个语言,定义他的文法的一种表示,并定义一个解释器,这个解释器应该使用该表示来解释语言中的句子。

如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种实例表述为一个简单语言中的句子。这样的就可以构建成一个解释器,该解释器通过解释这些句子来解决问题。

UML图如下(此图来源于大话设计模式

 

 

代码与实例

程序运行截图如下:

Head.h

  1. #ifndef HEAD_H
  2. #define HEAD_H
  3. #include <iostream>
  4. #include <string>
  5. using namespace std;
  6. class Context;
  7. //AbstractExpression作为接口为抽象语法树的所有结点共享
  8. class AbstractExpression{
  9. public:
  10. virtual void interpret(Context *context) = 0;
  11. virtual ~AbstractExpression(){}
  12. };
  13. //TerminalExpression(终结符号表达式)实现与文法中的终结符号相关联的解释操作。实现抽象表达式中所要求的接口,
  14. //主要是一个interpret()方法,文法中每一个终结符号都有一个具体终结表达式与之对应
  15. class TerminalExpression: public AbstractExpression{
  16. public:
  17. void interpret(Context *context);
  18. ~TerminalExpression();
  19. };
  20. //NonterminalExpression非终结符号表达式
  21. class NonterminalExpression: public AbstractExpression{
  22. public:
  23. void interpret(Context *context);
  24. ~NonterminalExpression();
  25. };
  26. class Context{
  27. public:
  28. string getInput();
  29. string getOutput();
  30. void setInput(const string &input);
  31. void setOutput(const string &output);
  32. ~Context();
  33. private:
  34. string m_input;
  35. string m_output;
  36. };
  37. #endif // HEAD_H

Head.cpp

  1. #include "Head.h"
  2. void TerminalExpression::interpret(Context *context)
  3. {
  4. cout << "终端解释器" << endl;
  5. }
  6. TerminalExpression::~TerminalExpression()
  7. {
  8. cout << "TerminalExpression::~TerminalExpression()" << endl;
  9. }
  10. void NonterminalExpression::interpret(Context *context)
  11. {
  12. cout << "非终端解释器" << endl;
  13. }
  14. NonterminalExpression::~NonterminalExpression()
  15. {
  16. cout << "NonterminalExpression::~NonterminalExpression()" << endl;
  17. }
  18. std::string Context::getInput()
  19. {
  20. return m_input;
  21. }
  22. std::string Context::getOutput()
  23. {
  24. return m_output;
  25. }
  26. void Context::setInput(const string &input)
  27. {
  28. m_input = input;
  29. }
  30. void Context::setOutput(const string &output)
  31. {
  32. m_output = output;
  33. }
  34. Context::~Context()
  35. {
  36. cout << "Context::~Context()" << endl;
  37. }

main.cpp

  1. #include "Head.h"
  2. #include <list>
  3. #include <algorithm>
  4. void deleteExpress(AbstractExpression *expression){
  5. delete expression;
  6. }
  7. int main(int *argc, int *argv){
  8. Context *context = new Context;
  9. list<AbstractExpression*> listExpress;
  10. listExpress.push_back(new TerminalExpression);
  11. listExpress.push_back(new NonterminalExpression);
  12. listExpress.push_back(new TerminalExpression);
  13. listExpress.push_back(new NonterminalExpression);
  14. for(list<AbstractExpression*>::iterator it = listExpress.begin(); it != listExpress.end(); it++){
  15. (*it)->interpret(context);
  16. }
  17. for_each(listExpress.begin(), listExpress.end(), deleteExpress);
  18. listExpress.clear();
  19. delete context;
  20. getchar();
  21. return 0;
  22. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/733804
推荐阅读
相关标签
  

闽ICP备14008679号