設計模式之解釋器模式詳解及實例

1、解釋器設計模式概述:

解釋器模式(Interpreter Pattern)是一種設計模式,它主要用于描述如何構建一個解釋器以解釋特定的語言或表達式。該模式定義了一個文法表示和解釋器的類結構,用于解釋符合該文法規則的語句。解釋器模式通常用于實現編程語言解釋器、自定義腳本引擎等場景。

在解釋器模式中,有以下幾個關鍵角色:

  • 抽象表達式(Abstract Expression):定義一個接口,用于表示不同類型的表達式。

  • 終結符表達式(Terminal Expression):實現抽象表達式接口的具體類,用于解釋終結符表達式。

  • 非終結符表達式(Non-Terminal Expression):實現抽象表達式接口的具體類,用于解釋非終結符表達式。

  • 上下文(Context):包含解釋器需要的全局信息以及待解釋的表達式。

  • 客戶端(Client):構建解釋器并調用解釋方法。

2、解釋器設計模式的適用場景:

  • 當需要開發一個解釋器,用于解釋特定的語言或表達式時。

  • 當需要表示一個復雜的語法規則,并且希望易于擴展和維護時。

  • 當需要解釋一些固定的文法,如數學表達式、邏輯表達式等場景。

3、解釋器設計模式的優點:

  • 易于擴展:當需要增加新的文法規則時,只需增加新的非終結符表達式類,無需修改原有代碼,符合開閉原則。

  • 解耦:將文法規則的表示和解釋過程分離,使得代碼結構更清晰。

  • 易于維護:每個文法規則對應一個非終結符表達式類,當需要修改或維護某個規則時,只需修改對應的類即可。

舉例說明:假設我們需要實現一個簡單的計算器,支持加法和減法運算。我們可以通過解釋器模式構建表達式類,分別表示加法和減法運算,以便能夠解析和計算輸入的表達式。

4、解釋器設計模式的缺點:

  • 執行效率較低:解釋器模式通常需要遞歸調用,導致執行效率較低。

  • 難以應對復雜的文法規則:當文法規則非常復雜時,解釋器模式的類結構可能變得非常復雜,難以維護。

5、用C++實現一個解釋器設計模式例子:

#include <iostream>
#include <string>
#include <memory>
#include <stdexcept>class Expression {
public:virtual ~Expression() = default;virtual int interpret() const = 0;
};class AddExpression : public Expression {
private:std::shared_ptr<Expression> leftExpression;std::shared_ptr<Expression> rightExpression;public:AddExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right): leftExpression(left), rightExpression(right) {}int interpret() const override {return leftExpression->interpret() + rightExpression->interpret();}
};class SubtractExpression : public Expression {
private:std::shared_ptr<Expression> leftExpression;std::shared_ptr<Expression> rightExpression;public:SubtractExpression(std::shared_ptr<Expression> left, std::shared_ptr<Expression> right): leftExpression(left), rightExpression(right) {}int interpret() const override {return leftExpression->interpret() - rightExpression->interpret();}
};class NumberExpression : public Expression {
private:int number;public:explicit NumberExpression(int number) : number(number) {}int interpret() const override {return number;}
};std::shared_ptr<Expression> parseExpression(const std::string& expression) {size_t pos = expression.find_first_of("+-");if (pos == std::string::npos) {throw std::invalid_argument("Invalid expression");}std::shared_ptr<Expression> left = std::make_shared<NumberExpression>(std::stoi(expression.substr(0, pos)));std::shared_ptr<Expression> right = std::make_shared<NumberExpression>(std::stoi(expression.substr(pos + 1)));if (expression[pos] == '+') {return std::make_shared<AddExpression>(left, right);} else {return std::make_shared<SubtractExpression>(left, right);}
}int main() {std::string input;std::cout << "Enter an expression (e.g., 3+2 or 7-4): ";std::cin >> input;try {auto expression = parseExpression(input);std::cout << "Result: " << expression->interpret() << std::endl;} catch (const std::exception& e) {std::cerr << "Error: " << e.what() << std::endl;}return 0;
}

????????在這個例子中,我們定義了一個Expression接口,它包含一個純虛函數interpret,用于計算表達式的值。我們實現了三個具體的表達式類:AddExpression(用于表示加法表達式),SubtractExpression(用于表示減法表達式)和NumberExpression(用于表示數字)。

????????parseExpression函數接受一個字符串參數,它解析輸入的字符串并根據運算符構建對應的Expression對象。main函數從用戶獲取輸入的表達式,調用parseExpression函數構建表達式對象,并計算結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41114.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41114.shtml

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

相關文章

擴散模型實戰(四):從零構建擴散模型

推薦閱讀列表&#xff1a; 擴散模型實戰&#xff08;一&#xff09;&#xff1a;基本原理介紹 擴散模型實戰&#xff08;二&#xff09;&#xff1a;擴散模型的發展 擴散模型實戰&#xff08;三&#xff09;&#xff1a;擴散模型的應用 本文以MNIST數據集為例&#xff0c;從…

智能樓宇綜合布線實訓室建設方案

一、樓宇智能綜合布線實訓室方案概述 樓宇智能綜合布線實訓室方案旨在為學生提供一個真實的學習和實踐環境&#xff0c;以培養他們在樓宇智能綜合布線領域的實際操作能力和技能。以下是一個概述&#xff1a; 1. 培養目標&#xff1a;培養學生在樓宇智能綜合布線方面的綜合能力…

Shader學習(三)(片元著色器)

1、在片元著色器處理漫反射 // Upgrade NOTE: replaced _World2Object with unity_WorldToObjectShader "Custom/specularfragement" {properties{_sp("Specular",color) (1,1,1,1)_shiness("Shiness",range(1,64)) 8}SubShader{pass {tags{&…

深入理解設計模式-行為型之模板(和回調區別聯系)

概述 模板設計模式&#xff08;Template Design Pattern&#xff09;是一種行為型設計模式&#xff0c;它定義了一個算法的骨架&#xff0c;將算法的一些步驟延遲到子類中實現。模板設計模式允許子類在不改變算法結構的情況下重新定義算法的某些步驟。 模板設計模式的核心思想…

網絡通信原理應用層(第五十一課)

1)DNS:域名解析系統,端口號TCP或UDP的53 2)域名注冊網站 -新網 www.xinnet.com -萬網-阿里云 www.net.cn -中國互聯 hulian.top 配置通過域名訪問網站(NETBASE第七課)_IHOPEDREAM的博客-CSDN博客 2、FTP 1)FTP概述 -文件傳輸協議 -控制連接:TCP 21 <

對redis、redisson、springcache總結

<一> redis-緩存中間件 什么是redis redis是c語言開發的&#xff0c;一個高性能key-value鍵值對內存數據庫&#xff0c;可以用來做數據庫、緩存、消息中間件的一種非關系型數據庫。 redis數據存儲在哪里 內存和磁盤中&#xff0c;但是redis的讀寫都在內存中&#xff0c;…

leetcode-413. 等差數列劃分(java)

等差數列劃分 leetcode-413. 等差數列劃分題目描述雙指針 上期經典算法 leetcode-413. 等差數列劃分 難度 - 中等 原題鏈接 - 等差數列劃分 題目描述 如果一個數列 至少有三個元素 &#xff0c;并且任意兩個相鄰元素之差相同&#xff0c;則稱該數列為等差數列。 例如&#xff0…

16 腦洞大開:GUI測試還能這么玩

頁面對象自動生成技術 頁面對象自動生成技術&#xff0c;屬于典型的“自動化你的自動化”的應用場景。它的基本思路是&#xff0c;你不用再手工維護 Page Class 了&#xff0c;只需要提供 Web 的 URL&#xff0c;它就會自動幫你生成這個頁面上所有控件的定位信息&#xff0c;并…

JMeter接口測試數據分離驅動應用

步驟&#xff1a; 創建csv文件&#xff0c;編寫接口測試用例 新建線程組——創建循環控制器&#xff08;循環次數填用例總數&#xff09; 創建CSV數據文件設置&#xff0c;設置參數。&#xff08;注意&#xff1a;是否允許帶引號&#xff1f;&#xff1a;一定要設置為true&a…

深度學習實戰48-【未來的專家團隊】基于AutoCompany模型的自動化企業概念設計與設想

大家好,我是微學AI,今天給大家介紹一下深度學習實戰48-【未來的專家團隊】基于AutoCompany模型的自動化企業概念設計與設想,文本將介紹AutoCompany模型的概念設計,涵蓋了AI智能公司的各個角色,并結合了GPT-4接口來實現各個角色的功能,設置中央控制器,公司運作過程會生成…

【MFC常用問題記錄】

MFC 記錄 MFC的edit control控件顯示1.控件添加變量M_edit后&#xff1a;2.控件ID為IDC_EDIT1: 線程函數使用 MFC的edit control控件顯示 1.控件添加變量M_edit后&#xff1a; CString str; int x 10; str.Format(_T("%d"),x); M_edit.SetWindowText(str)2.控件ID…

JMM內存模型之happens-before闡述

文章目錄 一、happens-before的定義二、happens-before的規則1. 程序順序規則&#xff1a;2. 監視器鎖規則&#xff1a;3. volatile變量規則&#xff1a;4. 傳遞性&#xff1a;5. start()規則&#xff1a;6. join()規則&#xff1a; 一、happens-before的定義 如果一個操作hap…

【編程二三事】ES究竟是個啥?

在最近的項目中&#xff0c;總是或多或少接觸到了搜索的能力。而在這些項目之中&#xff0c;或多或少都離不開一個中間件 - ElasticSearch。 今天忙里偷閑&#xff0c;就來好好了解下這個中間件是用來干什么的。 ES是什么? ? ES全稱ElasticSearch&#xff0c;是個基于Lucen…

性能優化的重要性

性能優化的重要性 性能優化的重要性摘要引言注意事項代碼示例及注釋性能優化的重要性 性能優化的重要性在 Java 中的體現響應速度資源利用效率擴展性與可維護性并發性能合理的鎖策略線程安全的數據結構并發工具類的應用避免競態條件和死鎖 總結代碼示例 博主 默語帶您 Go to Ne…

一張圖看懂 USDT三種類型地址 Omni、ERC20、TRC20的區別

USDT是當前實用最廣泛&#xff0c;市值最高的穩定幣&#xff0c;它是中心化的公司Tether發行的。在今年的4月17日之前&#xff0c;市場上存在著2種不同類型的USDT。4月17日又多了一種波場TRC20協議發行的USDT&#xff0c;它們各自有什么區別呢?哪個轉賬最快到賬&#xff1f;哪…

谷歌推出首款量子彈性 FIDO2 安全密鑰

谷歌在本周二宣布推出首個量子彈性 FIDO2 安全密鑰&#xff0c;作為其 OpenSK 安全密鑰計劃的一部分。 Elie Bursztein和Fabian Kaczmarczyck表示&#xff1a;這一開源硬件優化的實現采用了一種新穎的ECC/Dilithium混合簽名模式&#xff0c;它結合了ECC抵御標準攻擊的安全性和…

[LeetCode]矩陣對角線元素的和

解題 思路 1: 循環,找到主對角線的下標和副對角線的下標,如果矩陣長或寬為奇數的時候,需要減去中間公共的那一個值,中間公共的那個數的下標為mat[mat.size()/2][mat.size()/2]副對角線的下標為 mat [i][mat.size()-i-1] class Solution { public:int diagonalSum(vector<ve…

JVM中判定對象是否回收的的方法

引用計數法 引用計數法是一種垃圾回收&#xff08;Garbage Collection&#xff09;算法&#xff0c;用于自動管理內存中的對象。在引用計數法中&#xff0c;每個對象都有一個關聯的引用計數器&#xff0c;用于記錄對該對象的引用數量。 當一個新的引用指向對象時&#xff0c;…

Hive底層數據存儲格式

前言 在大數據領域,Hive是一種常用的數據倉庫工具,用于管理和處理大規模數據集。Hive底層支持多種數據存儲格式,這些格式對于數據存儲、查詢性能和壓縮效率等方面有不同的優缺點。本文將介紹Hive底層的三種主要數據存儲格式:文本文件格式、Parquet格式和ORC格式。 一、三…

SpringBoot復習:(42)WebServerCustomizer的customize方法是在哪里被調用的?

ServletWebServletAutoConfiguration類定義如下&#xff1a; 可以看到其中通過Import注解導入了其內部類BeanPostProcessorRegister。 BeanPostProcessor中定義的registerBeanDefinition方法會被Spring容器調用。 registerBeanDefinitions方法調用了RegistrySyntheticBeanIf…