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;
}

总结

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

相关推荐
zzzsde17 分钟前
【c++】深入理解string类(4)
开发语言·c++
少许极端1 小时前
算法奇妙屋(五)-链表
数据结构·算法·链表
郝学胜-神的一滴1 小时前
Effective Python 第44条:用纯属性与修饰器取代旧式的 setter 与 getter 方法
开发语言·python·程序人生·软件工程
XISHI_TIANLAN1 小时前
【多模态学习】Q&A6: 什么是MOE架构?Router Z Loss函数是指什么?负载均衡损失(Load Balancing Loss)又是什么?
学习·算法·语言模型
木子.李3471 小时前
数据结构-算法C++(额外问题汇总)
数据结构·c++·算法
yolo_guo1 小时前
sqlite 使用: 03-问题记录:在使用 sqlite3_bind_text 中设置 SQLITE_STATIC 参数时,处理不当造成的字符乱码
linux·c++·sqlite
花心蝴蝶.2 小时前
API签名认证算法全解析
算法
兮山与2 小时前
算法6.0
算法
代码对我眨眼睛2 小时前
739. 每日温度 LeetCode 热题 HOT 100
算法·leetcode
程序员莫小特2 小时前
老题新解|计算2的N次方
开发语言·数据结构·算法·青少年编程·信息学奥赛一本通