全国论坛网站建设,公司网站怎么申请,快递网站域名更换,建设网站要先给钱才能做作者#xff1a;翟天保Steven 版权声明#xff1a;著作权归作者所有#xff0c;商业转载请联系作者获得授权#xff0c;非商业转载请注明出处 一、解释器模式是什么#xff1f; 解释器模式是一种行为型的软件设计模式#xff0c;定义了一个解释器#xff0c;来解释给定语…作者翟天保Steven 版权声明著作权归作者所有商业转载请联系作者获得授权非商业转载请注明出处 一、解释器模式是什么 解释器模式是一种行为型的软件设计模式定义了一个解释器来解释给定语言和文法的句子。也可以理解为翻译吧比如11翻译为一加上一等于二这样就做成了一个简单的加法计算器。 解释器模式的优点
良好扩展性。语法的翻译通过类来实现扩展类可以扩展其解释能力。易实现。语法树中每个表达式节点类具备一定相似性实现起来相对容易。 解释器模式的缺点
执行效率低。解释器中通常有大量循环和递归语句当被解释句子较复杂时程序的性能受到较大影响。类膨胀。规则较多时类数量也膨胀。 二、解释器模式
2.1 结构图 客户端即Main主函数客户端通过解释器来解析表达式内容表达式又分为终结型和非终结型。就拿计算器举例11,1就是终结符类型表达式可以用它结尾而就是非终结符类型出现了就意味着它前后还有别的表达式字符自然不能作终结。 2.2 代码示例 场景描述实现简单的加减法计算器。
//Interpreter.h
/****************************************************/
#pragma once
#include iostream
#include vector
#include string
#include algorithm
#include stackusing namespace std;// 抽象表达式类
class Expression
{
public:// 解释virtual int interpret() 0;};// 数字表达式类
class NumberExpression : public Expression
{
public:// 构造函数NumberExpression(int num) : number(num) {}// 解释virtual int interpret() { return number; }private:int number;
};// 加法表达式类
class AddExpression : public Expression
{
public:// 构造函数AddExpression(Expression* left, Expression* right) : left(left), right(right) {}// 解释virtual int interpret() { return left-interpret() right-interpret(); }private:Expression* left;Expression* right;
};// 减法表达式类
class SubExpression : public Expression
{
public:// 构造函数SubExpression(Expression* left, Expression* right) : left(left), right(right) {}// 解释virtual int interpret() { return left-interpret() - right-interpret(); }private:Expression* left;Expression* right;
};// 解释器类
class Interpreter
{
public:// 构造函数Interpreter(string exp) : expression(exp) {}// 解释int interpret() {stackExpression* s;// 遍历表达式字符for (int i 0; i expression.length(); i) {if (isdigit(expression[i])) {// 识别数字int j i;while (j expression.length() isdigit(expression[j])) {j;}int num stoi(expression.substr(i, j - i));s.push(new NumberExpression(num));i j - 1;}else if (expression[i] ) {// 把左数提取出来Expression* left s.top();s.pop();// 识别右数int j i 1;while (j expression.length() isdigit(expression[j])) {j;}Expression* right new NumberExpression(stoi(expression.substr(i 1, j - (i 1))));// 左数右数的表达式放入栈中s.push(new AddExpression(left, right));i j - 1;}else if (expression[i] -) {// 把左数提取出来Expression* left s.top();s.pop();// 识别右数int j i 1;while (j expression.length() isdigit(expression[j])) {j;}Expression* right new NumberExpression(stoi(expression.substr(i 1, j - (i 1))));// 左数-右数的表达式放入栈中s.push(new SubExpression(left, right));i j - 1;}}return s.top()-interpret();}private:string expression;
};
//main.cpp
/****************************************************/
#include iostream
#include string
#include unordered_map
#include Interpreter.husing namespace std;int main()
{unordered_mapstring, int variables;string input;while (getline(cin, input)) {cout input: input endl;Interpreter interpreter(input);variables[input] interpreter.interpret();cout result: variables[input] endl;}return 0;
}程序结果如下。 上述实现的简易计算器也是许多大学C/C课程中的大作业记得以前用MFC实现了一款计算器开心了老半天哈哈梦回大学。感兴趣的同学也可以试试复杂计算器比如引入了括号还有各类运算符。 三、总结 我尽可能用较通俗的话语和直观的代码例程来表述我对解释器模式的理解或许有考虑不周到的地方如果你有不同看法欢迎评论区交流希望我举的例子能帮助你更好地理解解释器模式。 如果文章帮助到你了可以点个赞让我知道我会很快乐~加油