直譯器模式

2021-10-18 20:27:00 字數 2648 閱讀 6230

給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。

文法:即語法規則。在直譯器模式中每乙個語法都將對應乙個直譯器物件,用來處理相應的語法規則。它對於擴充套件、改變文法以及增加新的文法規則都很方便。

直譯器模式描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。

在直譯器模式中可以通過一種稱之為抽象語法樹(abstract syntax tree, ast)的圖形方式來直觀地表示語言的構成,每一棵抽象語法樹對應乙個語言例項

abstractexpression:定**釋器的介面,約定直譯器的解釋操作。其中的interpret介面,正如其名字那樣,它是專門用來解釋該直譯器所要實現的功能。(如加法直譯器中的interpret介面就是完成兩個運算元的相加功能)。

terminalexpression:終結符直譯器,用來實現語法規則中和終結符相關的操作,不再包含其他的直譯器,如果用組合模式來構建抽象語法樹的話,就相當於組合模式中的葉子物件,可以有多種終結符直譯器。

nonterminalexpression:非終結符直譯器,用來實現語法規則中非終結符相關的操作,通常乙個直譯器對應乙個語法規則,可以包含其他直譯器,如果用組合模式構建抽象語法樹的話,就相當於組合模式中的組合物件。可以有多種非終結符直譯器。

context:上下文,通常包含各個直譯器需要的資料或是公共的功能。這個context在直譯器模式中起著非常重要的作用。一般用來傳遞被所有直譯器共享的資料,後面的直譯器可以從這裡獲取這些值。

client:客戶端,指的是使用直譯器的客戶端,通常在這裡將按照語言的語法做的表示式轉換成使用直譯器物件描述的抽象語法樹,然後呼叫解釋操作。

簡單的計算器

#include

//相當於abstractexpression

class

expression};

//數值 相當於 terminalexpression

class

varexpression

:public expression

intinterpret()

private

:int m_ndata;};

//相當於 nonterminalexpression

class

symbolexpression

:public expression

~symbolexpression()

protected

: expression * m_left =

null

; expression * m_right =

null;}

;class

plu***pression

:public symbolexpression

intinterpret()

};class

subexpression

:public symbolexpression

intinterpret()

};//相當於 context

class

calculator

intgetres()

case

'-':

default

: resstack.

push

(new

varexpression

(cdata -

'0'));

}}left = resstack.

top();

int res =

(left ==

null)?

0: left-

>

interpret()

;delete left;

//刪除棧

return res;

}private

: string m_data;};

intmain()

只能做一位數的加減法,但是還是能看出這個模式。

優點易於實現文法:在直譯器模式中,一條語法規則用乙個直譯器物件來解釋執行。對於直譯器的實現來講,功能就變得比較簡單,只需要考慮這一條語法規則的實現就可以了,其他的都不用管。

易於擴充套件新的語法。由於直譯器採用類來描述語法規則,因此可以通過繼承等機制建立相應的直譯器物件,在建立抽象語法樹的時候使用這個新的直譯器物件就可以了。 缺點

執行效率較低。由於在直譯器模式中使用了大量的迴圈和遞迴呼叫,因此在解釋較為複雜的句子時其速度很慢,而且**的除錯過程也比較麻煩。

對於複雜文法難以維護。在直譯器模式中,每一條規則至少需要定義乙個類,因此如果乙個語言包含太多文法規則,類的個數將會急劇增加,導致系統難以管理和維護,此時可以考慮使用語法分析程式等方式來取代直譯器模式。

在以下情況下可以考慮使用直譯器模式:

1.可以將乙個需要解釋執行的語言中的句子表示為乙個抽象語法樹;

2.一些重複出現的問題可以用一種簡單的語言來進行表達;

3.乙個語言的文法較為簡單;

4.執行效率不是關鍵問題。【注:高效的直譯器通常不是通過直接解釋抽象語法樹來實現的,而是需要將它們轉換成其他形式,使用直譯器模式的執行效率並不高。】

目前個人來看,本質就是解析字串

直譯器模式

include include include include include using namespace std 直譯器模式 給定一種語言,定義它的文法的一種表示,並定義乙個直譯器 該直譯器使用該表示來解釋語言中的句子 類似於程式語言或者指令碼 假設情景是乙個指令碼控制系統 wasd上下左右方...

直譯器模式

1 模式定義 直譯器模式 interpreter pattern 定義語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的 語言 意思是使用規定格式和語法的 它是一種類行為型模式。2 模式結構 直譯器模式包含如下角色 abstractexpression 抽象表示式 terminalexpre...

直譯器模式

給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋語言中的句子。要解決的問題 如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個例項表述為乙個簡單語言中的句子。這樣就可以構造乙個直譯器,該直譯器通過解釋這些句子來解決該問題。的好處 當有乙個語言需要解...