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.pswp.cn/news/896105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896105.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 Openpyxl 操作 Excel 文件詳解

文章目錄 安裝安裝Python3安裝 openpyxl 基礎操作1. 引入2. 創建工作簿和工作表3. 寫入數據4. 保存工作簿5. 加載已存在的Excel6. 讀取單元格的值7. 選擇工作表 樣式和格式化1. 引入2. 設置字體3. 設置邊框4. 填充5. 設置數字格式6. 數據驗證7. 公式操作 性能優化1. read_only/…

nigix面試常見問題(2025)

一、Nginx基礎概念 1. 什么是Nginx? Nginx是一款高性能的HTTP/反向代理服務器及IMAP/POP3/SMTP代理服務器,由俄羅斯工程師Igor Sysoev開發。其核心優勢在于事件驅動架構與異步非阻塞處理模型,能夠高效處理高并發請求(如C10K問題),廣泛應用于負載均衡、靜態資源服務、AP…

002 SpringCloudAlibaba整合 - Feign遠程調用、Loadbalancer負載均衡

前文地址&#xff1a; 001 SpringCloudAlibaba整合 - Nacos注冊配置中心、Sentinel流控、Zipkin鏈路追蹤、Admin監控 文章目錄 8.Feign遠程調用、loadbalancer負載均衡整合1.OpenFeign整合1.引入依賴2.啟動類添加EnableFeignClients注解3.yml配置4.日志配置5.遠程調用測試6.服務…

代碼審計入門學習之sql注入

路由規則 入口文件&#xff1a;index.php <?php // ---------------------------------------------------------------------- // | wuzhicms [ 五指互聯網站內容管理系統 ] // | Copyright (c) 2014-2015 http://www.wuzhicms.com All rights reserved. // | Licensed …

React實現自定義圖表(線狀+柱狀)

要使用 React 繪制一個結合線狀圖和柱狀圖的圖表&#xff0c;你可以使用 react-chartjs-2 庫&#xff0c;它是基于 Chart.js 的 React 封裝。以下是一個示例代碼&#xff0c;展示如何實現這個需求&#xff1a; 1. 安裝依賴 首先&#xff0c;你需要安裝 react-chartjs-2 和 ch…

線程與進程的深入解析及 Linux 線程編程

在操作系統中&#xff0c;進程和線程是進行并發執行的兩種基本單位。理解它們的區別和各自的特點&#xff0c;能夠幫助開發者更好地進行多任務編程&#xff0c;提高程序的并發性能。本文將探討進程和線程的基礎概念&#xff0c;及其在 Linux 系統中的實現方式&#xff0c;并介紹…

全面指南:使用JMeter進行性能壓測與性能優化(中間件壓測、數據庫壓測、分布式集群壓測、調優)

目錄 一、性能測試的指標 1、并發量 2、響應時間 3、錯誤率 4、吞吐量 5、資源使用率 二、壓測全流程 三、其他注意點 1、并發和吞吐量的關系 2、并發和線程的關系 四、調優及分布式集群壓測&#xff08;待仔細學習&#xff09; 1.線程數量超過單機承載能力時的解決…

springboot整合mybatis-plus【詳細版】

目錄 一&#xff0c;簡介 1. 什么是mybatis-plus2.mybatis-plus特點 二&#xff0c;搭建基本環境 1. 導入基本依賴&#xff1a;2. 編寫配置文件3. 創建實體類4. 編寫controller層5. 編寫service接口6. 編寫service層7. 編寫mapper層 三&#xff0c;基本知識介紹 1. 基本注解 T…

HTTP 常見狀態碼技術解析(應用層)

引言 HTTP 狀態碼是服務器對客戶端請求的標準化響應標識&#xff0c;屬于應用層協議的核心機制。其采用三位數字編碼&#xff0c;首位數字定義狀態類別&#xff0c;后兩位細化具體場景。 狀態碼不僅是服務端行為的聲明&#xff0c;更是客戶端處理響應的關鍵依據。本文將從協議規…

Unity中的鍵位KeyCode

目錄 主要用途 檢測按鍵事件&#xff1a; 處理鍵盤輸入&#xff1a; 基本鍵位 常用鍵&#xff1a; 字母鍵&#xff1a; 數字鍵&#xff1a; 功能鍵&#xff1a; 方向鍵&#xff1a; 控制鍵&#xff1a; 鼠標鍵&#xff1a; 其他特殊鍵&#xff1a; 代碼示例 按下…

高考或者單招考試需要考物理這科目

問題&#xff1a;幫忙搜索一下以上學校哪些高考或者單招考試需要考物理這科目的 回答&#xff1a; 根據目前獲取的資料&#xff0c;明確提及高考或單招考試需考物理的學校為湖南工業職業技術學院&#xff0c;在部分專業單招時要求選考物理&#xff1b;其他學校暫未發現明確提…

【設計模式】 代理模式(靜態代理、動態代理{JDK動態代理、JDK動態代理與CGLIB動態代理的區別})

代理模式 代理模式是一種結構型設計模式&#xff0c;它提供了一種替代訪問的方法&#xff0c;即通過代理對象來間接訪問目標對象。代理模式可以在不改變原始類代碼的情況下&#xff0c;增加額外的功能&#xff0c;如權限控制、日志記錄等。 靜態代理 靜態代理是指創建的或特…

Redis 限流

Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface AccessLimit {/*** 限制次數*/int count() default 15;/*** 時間窗口&#xff0c;單位為秒*/int seconds() default 60; }Aspect Component public class AccessLimitAspect {private static …

Android Coil3縮略圖、默認占位圖placeholder、error加載錯誤顯示,Kotlin(1)

Android Coil3縮略圖、默認占位圖placeholder、error加載錯誤顯示&#xff0c;Kotlin&#xff08;1&#xff09; implementation("io.coil-kt.coil3:coil-core:3.1.0")implementation("io.coil-kt.coil3:coil-network-okhttp:3.1.0") <uses-permission …

DeepSeek 助力 Vue 開發:打造絲滑的 鍵盤快捷鍵(Keyboard Shortcuts)

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

uniapp引入uview組件庫(可以引用多個組件)

第一步安裝 npm install uview-ui2.0.31 第二步更新uview npm update uview-ui 第三步在main.js中引入uview組件庫 第四步在uni.scss中引入import "uview-ui/theme.scss"樣式 第五步在文件中使用組件

Jmeter進階篇(34)如何解決jmeter.save.saveservice.timestamp_format=ms報錯?

問題描述 今天使用Jmeter完成壓測執行,然后使用命令將jtl文件轉換成html報告時,遇到了報錯! 大致就是說jmeter里定義了一個jmeter.save.saveservice.timestamp_format=ms的時間格式,但是jtl文件中的時間格式不是標準的這個ms格式,導致無法正常解析。對于這個問題,有如下…

React 低代碼項目:網絡請求與問卷基礎實現

&#x1f35e;吐司問卷&#xff1a;網絡請求與問卷基礎實現 Date: February 10, 2025 Log 技術要點&#xff1a; HTTP協議XMLHttpRequest、fetch、axiosmock.js、postmanWebpack devServer 代理、craco.js 擴展 webpackRestful API 開發要點&#xff1a; 搭建 mock 服務 …

安裝海康威視相機SDK后,catkin_make其他項目時,出現“libusb_set_option”錯誤的解決方法

硬件&#xff1a;雷神MIX G139H047LD 工控機 系統&#xff1a;ubuntu20.04 之前運行某項目時&#xff0c;處于正常狀態。后來由于要使用海康威視工業相機&#xff08;型號&#xff1a;MV-CA013-21UC&#xff09;&#xff0c;便下載了并安裝了該相機的SDK&#xff0c;之后運行…

人工智能之自動駕駛技術體系

自動駕駛技術體系 自動駕駛技術是人工智能在交通領域的重要應用&#xff0c;旨在通過計算機視覺、傳感器融合、路徑規劃等技術實現車輛的自主駕駛。自動駕駛不僅能夠提高交通效率&#xff0c;還能減少交通事故和環境污染。本文將深入探討自動駕駛的技術體系&#xff0c;包括感…