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

总结

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

相关推荐
爱吃生蚝的于勒40 分钟前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
冰芒猓4 小时前
SpringMVC数据校验、数据格式化处理、国际化设置
开发语言·maven
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
杜杜的man4 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
java小吕布5 小时前
Java中Properties的使用详解
java·开发语言·后端
versatile_zpc5 小时前
C++初阶:类和对象(上)
开发语言·c++
尘浮生5 小时前
Java项目实战II基于微信小程序的移动学习平台的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·学习·微信小程序·小程序
小鱼仙官5 小时前
MFC IDC_STATIC控件嵌入一个DIALOG界面
c++·mfc