设计模式15之c++解释器模式(含示例代码)

解释器模式是一种行为型设计模式,它定义了一种语言文法,并且定义了一个解释器,用来解释这种语言中的表达式。解释器模式可以用于实现编译器、数学公式计算器等应用。

下面是一个使用 C++ 实现解释器模式的示例代码:

#include <iostream>
#include <map>
#include <stack>
#include <string>
#include <vector>
// 表达式抽象类
class Expression {
public:
    virtual ~Expression() {}
    virtual int Interpret(std::map<std::string, int>& context) = 0;
};
// 终结符表达式类:变量表达式
class VariableExpression : public Expression {
public:
    VariableExpression(std::string name) : name_(name) {}
    int Interpret(std::map<std::string, int>& context) override {
        if (context.find(name_) != context.end()) {
            return context[name_];
        } else {
            return 0;
        }
    }
private:
    std::string name_;
};
// 终结符表达式类:常量表达式
class ConstantExpression : public Expression {
public:
    ConstantExpression(int value) : value_(value) {}
    int Interpret(std::map<std::string, int>& context) override {
        return value_;
    }
private:
    int value_;
};
// 非终结符表达式类:加法表达式
class AddExpression : public Expression {
public:
    AddExpression(Expression* left, Expression* right) : left_(left), right_(right) {}
    ~AddExpression() {
        delete left_;
        delete right_;
    }
    int Interpret(std::map<std::string, int>& context) override {
        return left_->Interpret(context) + right_->Interpret(context);
    }
private:
    Expression* left_;
    Expression* right_;
};
// 非终结符表达式类:减法表达式
class SubExpression : public Expression {
public:
    SubExpression(Expression* left, Expression* right) : left_(left), right_(right) {}
    ~SubExpression() {
        delete left_;
        delete right_;
    }
    int Interpret(std::map<std::string, int>& context) override {
        return left_->Interpret(context) - right_->Interpret(context);
    }
private:
    Expression* left_;
    Expression* right_;
};
// 解释器类
class Interpreter {
public:
    Interpreter(std::string expression) {
        std::vector<std::string> tokens = Split(expression);
        for (auto token : tokens) {
            if (token == "+") {
                Expression* right = stack_.top();
                stack_.pop();
                Expression* left = stack_.top();
                stack_.pop();
                Expression* add_expression = new AddExpression(left, right);
                stack_.push(add_expression);
            } else if (token == "-") {
                Expression* right = stack_.top();
                stack_.pop();
                Expression* left = stack_.top();
                stack_.pop();
                Expression* sub_expression = new SubExpression(left, right);
                stack_.push(sub_expression);
            } else {
                Expression* variable_expression = new VariableExpression(token);
                stack_.push(variable_expression);
            }
        }
        syntax_tree_ = stack_.top();
    }
    ~Interpreter() {
        delete syntax_tree_;
    }
    int Interpret(std::map<std::string, int>& context) {
        return syntax_tree_->Interpret(context);
    }
private:
    std::vector<std::string> Split(std::string str) {
        std::vector<std::string> tokens;
        std::string token;
        for (auto ch : str) {
            if (ch == '+' || ch == '-') {
                if (token != "") {
                    tokens.push_back(token);
                    token = "";
                }
                tokens.push_back(std::string(1, ch));
            } else {
                token += ch;
            }
        }
        if (token != "") {
            tokens.push_back(token);
        }
        return tokens;
    }
private:
    std::stack<Expression*> stack_;
    Expression* syntax_tree_;
};
int main() {
    // 构建语法树
    std::string expression = "a+b-c";
    Interpreter interpreter(expression);
    // 构建环境
    std::map<std::string, int> context;
    context["a"] = 1;
    context["b"] = 2;
    context["c"] = 3;
    // 计算表达式
    int result = interpreter.Interpret(context);
    std::cout << expression << " = " << result << std::endl;
    return 0;
}

在上面的代码中,我们首先定义了一个 Expression 抽象类,其中包含了一个 Interpret() 纯虚函数。终结符表达式类 VariableExpression 和 ConstantExpression 实现了 Interpret() 函数,以完成变量和常量的解释。非终结符表达式类 AddExpression 和 SubExpression 实现了 Interpret() 函数,以完成加法和减法的解释。

Interpreter 类是解释器类,它将输入的表达式转化为语法树,并提供 Interpret() 函数用于解释表达式。在 main() 函数中,我们首先构建了一个语法树,然后构建了一个环境,并将环境传递给解释器,最后计算表达式并输出结果。

解释器模式的优点在于它可以灵活地扩展语言的文法,并且可以方便地实现编译器、数学公式计算器等应用。但是,由于解释器模式需要构建语法树,因此它的性能可能会受到一定的影响。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值