未來機器智慧型化已然成為趨勢,現在手機都能聽懂英語和普通話,那我大中華幾萬種方言的被智慧型化也許也是趨勢,我們的方言雖然和普通話相似,但是還是不一樣的。這可能需要乙個新的語法分析器來幫助我們。
我們的直譯器模式就是描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。
但是解釋一門自然語言是複雜的過程,我們以加減運算為例子來詳細解釋直譯器模式。
抽象表示式角色(abstractexpression):
宣告乙個抽象的解釋操作
,這個介面為所有具體表示式角色都要實現的
。終結符表示式角色(terminalexpression):實現與文法中的元素相關聯的解釋操作
,通常乙個直譯器模式中只有乙個終結符表示式
,但有多個例項對應不同的終結符
,終結符就是語言中用到的基本元素,
一般不能再被分解,如
: x -> xa, 這裡a
是終結符,因為沒有別的規則可以把
a變成別的符號,不過
x可以變成別的符號,所以
x是非終結符
。非終結符表示式角色(nonterminalexpression):
文法中的每條規則對應於乙個非終結表示式,
非終結表示式根據邏輯的複雜程度而增加
,原則上每個文法規則都對應乙個非終結符表示式
。環境角色(context):
包含直譯器之外的一些全域性資訊。
例項:
[cpp]view plain
copy
#include
#include
#include
using
namespace
std;
class
context
intgetvalue(string key)
};
class
abstractexpression
; class
addnonterminalexpression :
public
abstractexpression
intinterpreter(context context)
};
class
subtractnonterminalexpression :
public
abstractexpression
intinterpreter(context context)
};
class
terminalexpression :
public
abstractexpression
intinterpreter(context context)
};
intmain()
在以下情況下可以考慮使用直譯器模式:
(1) 可以將乙個需要解釋執行的語言中的句子表示為乙個抽象語法樹。
(2) 一些重複出現的問題可以用一種簡單的語言來進行表達。
(3) 乙個語言的文法較為簡單。
(4) 執行效率不是關鍵問題。(注:高效的直譯器通常不是通過直接解釋抽象語法樹來實現的,而是需要將它們轉換成其他形式,使用直譯器模式的執行效率並不高。)
(1) 易於改變和擴充套件文法。由於在直譯器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴充套件文法。
(2) 每一條文法規則都可以表示為乙個類,因此可以方便地實現乙個簡單的語言。
(3) 實現文法較為容易。在抽象語法樹中每乙個表示式節點類的實現方式都是相似的,這些類的**編寫都不會特別複雜,還可以通過一些工具自動生成節點類**。
(4) 增加新的解釋表示式較為方便。如果使用者需要增加新的解釋表示式只需要對應增加乙個新的終結符表示式或非終結符表示式類,原有表示式類**無須修改,符合
「開閉原則」。
(1) 對於複雜文法難以維護。在直譯器模式中,每一條規則至少需要定義乙個類,因此如果乙個語言包含太多文法規則,類的個數將會急劇增加,導致系統難以管理和維護,此時可以考慮使用語法分析程式等方式來取代直譯器模式。
(2) 執行效率較低。由於在直譯器模式中使用了大量的迴圈和遞迴呼叫,因此在解釋較為複雜的句子時其速度很慢,而且**的除錯過程也比較麻煩。
盡量不要在重要模組中使用直譯器模式,因為維護困難。在專案中,可以使用指令碼語言來代替直譯器模式。
設計模式 直譯器模式
直譯器模式 給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器,該直譯器通過解釋這些句子來解決該問題。當有乙個語言需要解釋執行,並...
設計模式 直譯器模式
直譯器模式 interpreter pattern 提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。這種模式被用在 sql 解析 符號處理引擎等。給定乙個語言,定義它的文法表示,並定義乙個直譯器,這個直譯器使用該標識來解釋語言中的句子。...
設計模式 直譯器模式
給定乙個語言,定義它的語法表示,並使用乙個直譯器來解釋語法或表示式 可以用於sql解析,或者特殊符號處理等 此處設計乙個and語法解析器,類圖如下 表示式介面 public inte ce expression package com.glt.designpattern.interpreter 基礎...