行为型 - 解释器(Interpreter)

Interpreter 模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释器来解释语言中的句子。

概念

Interpreter 模式提供了这样的一个实现语法解释器的框架, Interpreter 模式典型的结构图为:

Interpreter 模式中,提供了 TerminalExpression 和 NonterminalExpression 两种表达式的解释方式,Context 类用于为解释过程提供一些附加的信息(例如全局的信息)

代码实现

模型代码实现

#ifndef _CONTEXT_H_
#define _CONTEXT_H_
class Context
{
public:
	Context();
	~Context();

protected:
private:
};
#endif //~_CONTEXT_H_
1
2
3
4
5
6
7
8
9
10
11
#include "Context.h"
Context::Context()
{
}
Context::~Context()
{
}
1
2
3
4
5
6
#ifndef _INTERPRET_H_
#define _INTERPRET_H_

#include "Context.h"
#include <string>
using namespace std;

class AbstractExpression
{
public:
    virtual ~AbstractExpression();
    virtual void Interpret(const Context &c);

protected:
    AbstractExpression();

private:
};

class TerminalExpression : public AbstractExpression
{
public:
    TerminalExpression(const string &statement);
    ~TerminalExpression();
    void Interpret(const Context &c);

protected:
private:
    string _statement;
};

class NonterminalExpression : public AbstractExpression
{
public:
    NonterminalExpression(AbstractExpression *expression, int times);
    ~NonterminalExpression();
    void Interpret(const Context &c);

protected:
private:
    AbstractExpression *_expression;
    int _times;
};
#endif //~_INTERPRET_H_
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "Interpreter.h"
#include <iostream>
using namespace std;

AbstractExpression::AbstractExpression()
{
}

AbstractExpression::~AbstractExpression()
{
}

void AbstractExpression::Interpret(const Context &c)
{
}

TerminalExpression::TerminalExpression(const string &statement)
{
    this->_statement = statement;
}

TerminalExpression::~TerminalExpression()
{
}

void TerminalExpression::Interpret(const Context &c)
{
    cout << this->_statement << "TerminalExpression " << endl;
}

NonterminalExpression::NonterminalExpression(AbstractExpression *expression, int times)
{
    this->_expression = expression;
    this->_times = times;
}

NonterminalExpression::~NonterminalExpression()
{
}

void NonterminalExpression::Interpret(const Context &c)
{
    for (int i = 0; i < _times; i++)
    {
        this->_expression->Interpret(c);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "Context.h"
#include "Interpreter.h"
#include <iostream>

using namespace std;
int main(int argc, char *argv[])
{
	Context *c = new Context();
	AbstractExpression *te = new TerminalExpression("hello");
	te->Interpret(*c);

	AbstractExpression *nte = new NonterminalExpression(te, 2);
	nte->Interpret(*c);
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

符号运算实现

#include <iostream>
#include <map>
#include <stack>
using namespace std;

class Expression
{
public:
	virtual int interpreter(map<char, int> var) = 0;
	virtual ~Expression() {}
};

//变量表达式
class VarExpression : public Expression
{
	char key;

public:
	VarExpression(const char &key)
	{
		this->key = key;
	}
	int interpreter(map<char, int> var) override
	{
		return var[key];
	}
};
//符号表达式
class SymbolExpression : public Expression
{
	// 运算符左右两个参数
protected:
	Expression *left;
	Expression *right;

public:
	SymbolExpression(Expression *left, Expression *right) : left(left), right(right)
	{
	}
};
//加法运算
class AddExpression : public SymbolExpression
{
public:
	AddExpression(Expression *left, Expression *right) : SymbolExpression(left, right)
	{
	}
	int interpreter(map<char, int> var) override
	{
		return left->interpreter(var) + right->interpreter(var);
	}
};

//减法运算
class SubExpression : public SymbolExpression
{

public:
	SubExpression(Expression *left, Expression *right) : SymbolExpression(left, right)
	{
	}
	int interpreter(map<char, int> var) override
	{
		return left->interpreter(var) - right->interpreter(var);
	}
};

Expression *analyse(const string &expStr)
{
	stack<Expression *> expStack;
	Expression *left = nullptr;
	Expression *right = nullptr;
	for (int i = 0; i < expStr.size(); i++)
	{
		switch (expStr[i])
		{
		case '+':
			// 加法运算
			left = expStack.top();
			right = new VarExpression(expStr[++i]);
			expStack.push(new AddExpression(left, right));
			break;
		case '-':
			// 减法运算
			left = expStack.top();
			right = new VarExpression(expStr[++i]);
			expStack.push(new SubExpression(left, right));
			break;
		default:
			// 变量表达式
			expStack.push(new VarExpression(expStr[i]));
		}
	}
	Expression *expression = expStack.top();
	return expression;
}

int main()
{
	string expStr = "a+b-c+d-e";
	map<char, int> var;
	var.insert(make_pair('a', 1));
	var.insert(make_pair('b', 2));
	var.insert(make_pair('c', 3));
	var.insert(make_pair('d', 4));
	var.insert(make_pair('e', 5));

	Expression *expression = analyse(expStr);
	int result = expression->interpreter(var);
	cout << result << endl;
	return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112