解释器模式

【1】什么是解释器模式?

解释器模式:拟定一种 “语言”,定义该语言文法的一种表示,并定义一种解释器,这个解释器使用该表示文法来解释语言中的句子。

【2】解释器模式代码示例:

(1)代码示例1:

复制代码
 1 #include <iostream>
 2 #include <list>
 3 #include <string>
 4 using namespace std;
 5 
 6 class Context;
 7 
 8 class AbstractExpression
 9 {
10 public:
11     virtual void interpret(Context *) = 0;
12 };
13 
14 class TerminalExpression : public AbstractExpression
15 {
16 public:
17     void interpret(Context *context)
18     {
19         cout << "终端解释器" << endl;
20     }
21 };
22 
23 class NonterminalExpression : public AbstractExpression
24 {
25 public:
26     void interpret(Context *context)
27     {
28         cout << "非终端解释器" << endl;
29     }
30 };
31 
32 class Context
33 {
34 public:
35     string input, output;
36 };
37 
38 int main()
39 {
40     Context *context = new Context(); 
41     list<AbstractExpression*>  lt;
42     lt.push_back(new TerminalExpression());
43     lt.push_back(new NonterminalExpression());
44     lt.push_back(new TerminalExpression());
45     lt.push_back(new TerminalExpression());
46     
47     for (list<AbstractExpression*>::iterator iter = lt.begin(); iter != lt.end(); iter++)
48     {
49         (*iter)->interpret(context);
50     }
51     
52     return 0;
53 }
54 // Result:
55 /*
56 终端解释器
57 非终端解释器
58 终端解释器
59 终端解释器
60 */
View Code
复制代码

(2)代码示例2:

复制代码
  1 #include <iostream>  
  2 #include <map>  
  3 #include <string>  
  4  
  5 using namespace std;  
  6 
  7 class Context
  8 {
  9 private:
 10     map<string, int> valueMap;
 11 
 12 public:
 13     void addValue(string key,int value)
 14     {       
 15         valueMap.insert(std::pair<string, int>(key, value));   // 插入构建项
 16     }
 17 
 18     int getValue(string key)
 19     {
 20         return valueMap[key]; // 解析值
 21     }
 22 };
 23 
 24 class AbstractExpression
 25 {
 26 public :
 27      virtual int interpreter(Context context) = 0;
 28 };
 29 
 30 class AddNonterminalExpression : public AbstractExpression
 31 {
 32 private :
 33     AbstractExpression *left;
 34     AbstractExpression *right;
 35 
 36 public:
 37     AddNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
 38         : left(left)
 39         , right(right)
 40     {
 41     }
 42 
 43     int interpreter(Context context)
 44     {
 45         return (left->interpreter(context)) + (right->interpreter(context));
 46     }
 47 };
 48 
 49 class SubtractNonterminalExpression : public AbstractExpression
 50 {
 51 private :
 52     AbstractExpression *left;
 53     AbstractExpression *right;
 54 
 55 public:
 56     SubtractNonterminalExpression(AbstractExpression *left, AbstractExpression *right)
 57         : left(left)
 58         , right(right)
 59     {
 60     }
 61 
 62     int interpreter(Context context)
 63     {
 64         return (left->interpreter(context)) - (right->interpreter(context));
 65     }
 66 };
 67 
 68 class TerminalExpression : public AbstractExpression
 69 {
 70 private :
 71     int i;
 72 public :
 73     TerminalExpression(int i) : i(i)
 74     {
 75     }
 76 
 77     int interpreter(Context context)
 78     {
 79         return i;
 80     }
 81 };
 82 
 83 int main()
 84 {  
 85     // a - b + c
 86     Context context;
 87     context.addValue("a", 10);
 88     context.addValue("b", 8);
 89     context.addValue("c", 2);
 90 
 91     SubtractNonterminalExpression *subtractValue = 
 92         new SubtractNonterminalExpression(new TerminalExpression(context.getValue("a")), new TerminalExpression(context.getValue("b")));
 93 
 94     AddNonterminalExpression *addValue = new AddNonterminalExpression(subtractValue, new TerminalExpression(context.getValue("c")));
 95 
 96     cout << subtractValue->interpreter(context);  // 10 - 8 = 2
 97     cout << addValue->interpreter(context);  // 2 + 2 = 4
 98     
 99     return 0;  
100 }  
View Code
复制代码

 【3】应用

通常当一个语言需要解释执行,并且你可以将语言中的句子表示成为一个抽象的语法树时,可以使用解释器模式。

 

Good   Good   Study,  Day   Day  Up.

顺序   选择  循环  总结

posted @   kaizenly  阅读(271)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
历史上的今天:
2013-09-04 资源共享型智能指针实现方式
打赏

喜欢请打赏

扫描二维码打赏

微信打赏

点击右上角即可分享
微信分享提示