当前位置: 首页 > article >正文

23种设计模式 - 解释器模式

模式定义

解释器模式(Interpreter Pattern)是一种行为型设计模式,用于为特定语言(如数控系统的G代码)定义文法规则,并构建解释器来解析和执行该语言的语句。它通过将语法规则分解为多个类,实现复杂指令的逐层解析。


模式结构

抽象表达式(Abstract Expression)

  • 定义interpret()接口,声明解释操作的抽象方法(如void interpret(Context& context))。
    终结符表达式(Terminal Expression)
  • 实现文法中的基本元素(如G代码指令G00G01),直接处理具体操作。
    非终结符表达式(Non-terminal Expression)
  • 处理复合语法结构(如嵌套指令组合),通过递归调用子表达式实现复杂逻辑。
    上下文(Context)
  • 存储解释器所需的全局信息(如机床坐标、刀具状态)。

适用场景

数控系统G代码解析:将G00 X100 Y200等指令转换为机床运动控制。
数学公式计算:解析并执行如(3+5)*2的表达式。
自定义脚本引擎:实现简单控制逻辑的脚本语言。


C++示例(数控G代码解析)

场景说明:
设计一个解释器,解析数控系统的G代码指令(如G00快速定位、G01直线插补),并更新机床坐标。

#include 
#include 
#include 
#include 

// 上下文类:存储机床坐标
class Context {
public:
    float x, y;
    Context() : x(0), y(0) {}
};

// 抽象表达式
class Expression {
public:
    virtual void interpret(Context& context) = 0;
    virtual ~Expression() = default;
};

// 终结符表达式:G00指令(快速移动)
class G00Command : public Expression {
private:
    float targetX, targetY;
public:
    G00Command(float x, float y) : targetX(x), targetY(y) {}
    void interpret(Context& context) override {
        context.x = targetX;
        context.y = targetY;
        std::cout << "快速定位至 (" << context.x << ", " << context.y << ")\n";
    }
};

// 终结符表达式:G01指令(直线插补)
class G01Command : public Expression {
private:
    float targetX, targetY;
public:
    G01Command(float x, float y) : targetX(x), targetY(y) {}
    void interpret(Context& context) override {
        context.x = targetX;
        context.y = targetY;
        std::cout << "直线插补至 (" << context.x << ", " << context.y << ")\n";
    }
};

// 解析器:将字符串指令转换为表达式对象
Expression* parseCommand(const std::string& input) {
    std::istringstream iss(input);
    std::string cmd;
    float x, y;
    iss >> cmd >> x >> y;

    if (cmd == "G00") return new G00Command(x, y);
    else if (cmd == "G01") return new G01Command(x, y);
    return nullptr;
}

// 客户端使用
int main() {
    Context context;
    std::string code = "G00 100 200\nG01 300 150";  // 模拟G代码输入

    std::istringstream stream(code);
    std::string line;
    while (std::getline(stream, line)) {
        Expression* expr = parseCommand(line);
        if (expr) {
            expr->interpret(context);
            delete expr;
        }
    }
    return 0;
}

代码解析
上下文类:存储机床的当前坐标xy
表达式类:

  • G00CommandG01Command为终结符表达式,直接修改坐标并输出动作。
    解析逻辑:parseCommand将输入字符串拆解为指令和参数,生成对应表达式对象。
    执行过程:逐行解析G代码,调用interpret()更新坐标状态。

http://www.kler.cn/a/554884.html

相关文章:

  • 哈希表(概念)c++
  • 【黑马点评】——相关文章汇总(包括实现,优化,测试和面经总结)
  • 树莓派 4B:AI 物联网完整部署方案
  • AI工具讲解
  • 【YOLO系列】YOLOv8理论
  • 深入解析 sudo -l 命令的输出内容
  • 解锁Linux“故障宝藏”:Core Dump分析秘籍(转)
  • openharmony中HDF驱动框架关键流程说明-观察者模式
  • 芯谷D2761:为扬声器保护而生的音频限幅器
  • 雷龙CS SD NAND(贴片式TF卡)测评体验
  • 利用PHP爬虫精准获取淘宝分类详情:实战案例指南
  • 广西壮族自治区园区投促中心党委书记陶德文率团到访深兰科技
  • conda和conda-forge区别?怎么选用?
  • 第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)
  • Linux多版本管理工具介绍
  • 嵌入式开发岗位认识
  • 【数学】数论干货(疑似密码学基础)
  • uniapp manifest.json国际化配置,使用 %app.name% 占位,应用名称不会跟随系统语言改变
  • Jenkins 节点 Node 概念
  • 装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住