C++中的解释器模式

目录

[解释器模式(Interpreter Pattern)](#解释器模式(Interpreter Pattern))

实际应用

算术表达式解释器

布尔表达式解释器

总结


解释器模式(Interpreter Pattern)

解释器模式是一种行为设计模式,它定义了一种语言的文法表示,并使用解释器来解释这些文法。该模式适用于那些有特定语法规则的场景,比如编译器、正则表达式引擎和计算器。

实际应用

算术表达式解释器

算术表达式解释器 -- 可以解析和计算包含加法和减法的算术表达式。

cpp 复制代码
#include <iostream>
#include <string>
#include <stack>
#include <memory>
#include <unordered_map>

// 抽象表达式
class Expression {
public:
    virtual ~Expression() = default;
    virtual int interpret(const std::unordered_map<char, int>& context) = 0;
};

// 终结符表达式(变量)
class VariableExpression : public Expression {
private:
    char name;
public:
    VariableExpression(char name) : name(name) {}
    int interpret(const std::unordered_map<char, int>& context) override {
        return context.at(name);
    }
};

// 非终结符表达式(加法)
class AddExpression : public Expression {
private:
    std::shared_ptr<Expression> left, right;
public:
    AddExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right) 
        : left(left), right(right) {}
    int interpret(const std::unordered_map<char, int>& context) override {
        return left->interpret(context) + right->interpret(context);
    }
};

// 非终结符表达式(减法)
class SubtractExpression : public Expression {
private:
    std::shared_ptr<Expression> left, right;
public:
    SubtractExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right) 
        : left(left), right(right) {}
    int interpret(const std::unordered_map<char, int>& context) override {
        return left->interpret(context) - right->interpret(context);
    }
};

// 客户端代码:解析并计算表达式
int main() {
    std::string expr = "a+b-c";
    std::unordered_map<char, int> context = {{'a', 5}, {'b', 3}, {'c', 2}};

    std::stack<std::shared_ptr<Expression>> stack;
    for (char token : expr) {
        if (isalpha(token)) {
            stack.push(std::make_shared<VariableExpression>(token));
        } else if (token == '+') {
            auto right = stack.top(); stack.pop();
            auto left = stack.top(); stack.pop();
            stack.push(std::make_shared<AddExpression>(left, right));
        } else if (token == '-') {
            auto right = stack.top(); stack.pop();
            auto left = stack.top(); stack.pop();
            stack.push(std::make_shared<SubtractExpression>(left, right));
        }
    }

    auto expression = stack.top();
    int result = expression->interpret(context);
    std::cout << "Result: " << result << std::endl;

    return 0;
}

布尔表达式解释器

布尔表达式解释器 -- 可以解析和计算包含与(AND )和或(OR)的布尔表达式。

cpp 复制代码
#include <iostream>
#include <string>
#include <stack>
#include <memory>
#include <unordered_map>

// 抽象表达式
class Expression {
public:
    virtual ~Expression() = default;
    virtual bool interpret(const std::unordered_map<std::string, bool>& context) = 0;
};

// 终结符表达式(变量)
class VariableExpression : public Expression {
private:
    std::string name;
public:
    VariableExpression(const std::string& name) : name(name) {}
    bool interpret(const std::unordered_map<std::string, bool>& context) override {
        return context.at(name);
    }
};

// 非终结符表达式(与操作)
class AndExpression : public Expression {
private:
    std::shared_ptr<Expression> left, right;
public:
    AndExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right) 
        : left(left), right(right) {}
    bool interpret(const std::unordered_map<std::string, bool>& context) override {
        return left->interpret(context) && right->interpret(context);
    }
};

// 非终结符表达式(或操作)
class OrExpression : public Expression {
private:
    std::shared_ptr<Expression> left, right;
public:
    OrExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right) 
        : left(left), right(right) {}
    bool interpret(const std::unordered_map<std::string, bool>& context) override {
        return left->interpret(context) || right->interpret(context);
    }
};

// 客户端代码:解析并计算布尔表达式
int main() {
    std::string expr = "a AND b OR c";
    std::unordered_map<std::string, bool> context = {{"a", true}, {"b", false}, {"c", true}};

    std::stack<std::shared_ptr<Expression>> stack;
    std::istringstream iss(expr);
    std::string token;
    while (iss >> token) {
        if (token == "a" || token == "b" || token == "c") {
            stack.push(std::make_shared<VariableExpression>(token));
        } else if (token == "AND") {
            auto right = stack.top(); stack.pop();
            auto left = stack.top(); stack.pop();
            stack.push(std::make_shared<AndExpression>(left, right));
        } else if (token == "OR") {
            auto right = stack.top(); stack.pop();
            auto left = stack.top(); stack.pop();
            stack.push(std::make_shared<OrExpression>(left, right));
        }
    }

    auto expression = stack.top();
    bool result = expression->interpret(context);
    std::cout << "Result: " << std::boolalpha << result << std::endl;

    return 0;
}

总结

解释器模式可以帮助我们定义和解释特定语言的语法规则,并将这些规则应用于不同的上下文。

相关推荐
我爱cope3 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python4 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
南宫萧幕4 小时前
自控PID+MATLAB仿真+混动P0/P1/P2/P3/P4构型
算法·机器学习·matlab·simulink·控制·pid
浪浪小洋5 小时前
c++ qt课设定制
开发语言·c++
charlie1145141915 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler015 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
故事和你915 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
我叫黑大帅5 小时前
为什么map查找时间复杂度是O(1)?
后端·算法·面试
炽烈小老头6 小时前
【每天学习一点算法 2026/04/20】除自身以外数组的乘积
学习·算法
程序猿编码6 小时前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核