首页 > 编程语言 >C++ 设计模式之解释器模式

C++ 设计模式之解释器模式

时间:2023-07-07 13:55:25浏览次数:40  
标签:std 解释器 文法 C++ 模式 Context 设计模式 Expression

设计模式之解释器模式
  解释器模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式解决的问题是,如果一种特定类型的问题发生的频率足够高,那么可能就只得将该问题的各个示例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决问题。

其UML图如下:

在解释器模式中每一种表达式对应一种表达式解释类,比如TerminalExpression和NonterminalExpression。Context类种是表达式内容,在客户端中决定是那种类型的表达式,从而创建不同的表达式独享来解释该语句。

示例代码如下:

 1 // InterpreterModel.h文件
 2 #pragma once
 3 #include <iostream>
 4 #include <string>
 5 
 6 class Context
 7 {
 8 private:
 9     std::string m_strInput;
10     std::string m_strOutput;
11 public:
12     void setExpression(std::string str)
13     {
14         m_strInput = str;
15     }
16 };
17 
18 class Expression
19 {
20 public:
21     virtual void Interpret(Context * context) = 0;
22 };
23 
24 class TerminalExpression : public Expression
25 {
26 public:
27     void Interpret(Context * context)
28     {
29         std::cout << "TerminalExpression!" << std::endl;
30     }
31 };
32 
33 class NonterminalExpression : public Expression
34 {
35 public:
36     void Interpret(Context * context)
37     {
38         std::cout << "NonterminalExpression!" << std::endl;
39     }
40 };

测试代码如下:

 1 #include <iostream>
 2 #include "InterpreterModel.h"
 3 
 4 int main()
 5 {
 6     using namespace std;
 7     // 解释器模式
 8     Context * pContext = new Context();
 9     pContext->setExpression("Expression......");
10     Expression * pNon = new NonterminalExpression();
11     Expression * p = new TerminalExpression();
12     // 根据Expression中的内容判断采用那种表达式解析
13     pNon->Interpret(pContext);
14     p->Interpret(pContext);
15     delete p;
16     delete pNon;
17     delete pContext;
18 
19     getchar();
20     return 0;
21 }

测试结果如下图:

  使用解释器模式,就意味着可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树种各个节点的类的实现大体类似,这些类都易于直接编写。

  解释器模式的不足之处在于,解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。

标签:std,解释器,文法,C++,模式,Context,设计模式,Expression
From: https://www.cnblogs.com/ybqjymy/p/17534770.html

相关文章

  • C/C++数据结构与算法课程设计[2023-07-06]
    C/C++数据结构与算法课程设计[2023-07-06]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......
  • C++ 设计模式之简单工厂模式
    设计模式之简单工厂模式(C++)简单工厂模式,主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来根据输入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。优点:适用于不同情况创建不同的类时。缺点:客户端必须要知道基类和工厂类,耦合性差......
  • C++ 设计模式之组合模式
    设计模式之组合模式组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。......
  • C++ 设计模式之单例模式
    设计模式之单例模式保证一个类仅有一个实例,并提供一个访问他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且可以提供一个访问该实例......
  • C++学生健康信息收集系统[2023-07-06]
    C++学生健康信息收集系统[2023-07-06]学生健康信息收集系统简介一、 问题描述为了应对新型冠状病毒疫情,学校需要开发一个能够每天收集全校学生健康信息的系统,便于学校管理。不同学院以及学校的管理员,需要能方便地查看和导出健康状况异常的学生列表,并能对各类信息进行查看和统计......
  • C/C++学生通讯录管理系统[2023-07-06]
    C/C++学生通讯录管理系统[2023-07-06]一、设计要求1、题目利用C++语言实现一个学生通讯录管理系统,系统中需要实现的功能如下:(1)添加学生信息:向通讯录中添加新人,信息包括(学生姓名、性别、年龄、联系电话、家庭住址等),最多记录100人。(2)显示学生信息:显示通讯录中所有学生信息。(3)删......
  • C++ 设计模式之桥接模式
    设计模式之桥接模式桥接模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。这里说的实现分离,并不是说然抽象类与派生类分离,这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。其UML图如下: 结合上图理解一下其定义。抽象部分指的是Abstraction......
  • C/C++订餐管理系统[2023-07-07]
    C/C++订餐管理系统[2023-07-07]1、订餐管理系统要求实现饭店的订餐信息管理,包括菜单管理、订单管理、统计分析。实现菜单信息(菜号、菜名、价格、成本)的增删改查;实现订单管理(订单号、就餐人数、下单时间、订单总价、订单包含的所有菜品(菜号、数量))。系统功能包括以下方面:A、菜......
  • 学习C++这一篇就够了(进阶篇)
    ​内存模型C++在执行程序的时候,将内存方向划分为4个区域:代码区:存放二进制代码,由操作系统进行管理全局区:存放全局变量、静态变量、常量,程序结束后由操作系统释放栈区:存放函数参数、局部变量,由编译器自动分配和释放堆区:由开发者申请分配和释放,若程序员不释放,程序结束由......
  • C++ 中的函数重载
     在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。https://www.121mu.com/bkjq211/......