16 直譯器模式

2021-10-08 19:22:48 字數 3728 閱讀 5703

1.什麼是直譯器模式?

程式語言有很多種,但是人們希望用一些簡單的語言來實現一些特定的操作。而對於乙個操作指令通常是字串,所以必須要有一套自定義的語言(即文法規則)來解釋這個指令。實現這個自定義語言(文法規則)則需要用到直譯器模式。

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

2.文法規則和抽象語法樹

(1)「::=」是「定義為」的意思

(2)終結符表示式:組成元素不能再分解

非終結符表示式:組成元素可以再分解

(3)「|」表示「或」,「{}」表示「組合」,「*」表示0次或多次(有點正則內味)

(4)抽象語法樹:以圖形方式來直觀的表示語言的構成,每一顆抽象語法樹對應乙個語言例項

了解上述概念,下面來看乙個文法規則就能理解了:

expression::=value|opreation

operation::=expression'+'expression|expression'-'expression

value::=an integer//乙個整數值

抽象語法樹:

3.直譯器模式結構

(1)abstractexpression(抽象表示式):在抽象表示式中宣告了抽象的解釋操作,它是所有終結符表示式和非終結符表示式的公共父類

(2)terminalexpression(終結符表示式):終結符表示式是抽象表示式的子類,它實現了與文法中的終結符相關聯的解釋操作,在句子中的每乙個終結符都是該類的乙個例項。通常在乙個直譯器模式中只有少數幾個終結符表示式類,它們的例項可以通過非終結符表示式組成較為複雜的句子

(3)nonterminalexpression(非終結符表示式):非終結符表示式也是抽象表示式的子類,它實現了文法中非終結符的解釋操作,由於在非終結符表示式中可以包含終結符表示式,也可以繼續包含非終結符表示式,因此其解釋操作一般通過遞迴的方式完成

(4)context(環境類):環境類又稱為上下文類,它用於儲存直譯器之外的一些全域性資訊,通常它臨時儲存了需要解釋的語句

4.直譯器模式實現

(1)抽象表示式類

/**

* 抽象表示式類

*/public abstract class abstractexpression

(2)終結符表示式類

/**

* 終結符表示式類

*/public class terminalexpression extends abstractexpression

}

(3)非終結符表示式類

/**

* 非終結符表示式類

*/public class nonterminalexpression extends abstractexpression

@override

public void interpret(context ctx)

}

(4)環境類

/**

* 環境類

*/public class context

public string lookup(string key)

}

5.直譯器模式例項——機械人控制語言,包含方向:上下左右。移動方式:移動和跑步。移動距離:乙個正整數

(1)抽象結點類,充當抽象表示式

/**

* 抽象結點類,充當抽象表示式

*/public abstract class abstractnode

(2)and結點類,充當非終結符表示式角色

/**

* and結點類,充當非終結符表示式角色

*/public class andnode extends abstractnode

/*** and表示式解釋操作

* @return

*/@override

public string interpret()

}

(3)簡單句子結點類,充當非終結符表示式角色

/**

* 簡單句子結點類,充當非終結符表示式角色

*/public class sentencenode extends abstractnode

//簡單句子的解釋操作

@override

public string interpret()

}

(4)方向節點類,充當終結符表示式角色

/**

*方向節點類,充當終結符表示式角色

*/public class directionnode extends abstractnode

//方向表示式的解釋操作

@override

public string interpret() else if (direction.equalsignorecase("down"))else if (direction.equalsignorecase("left"))else if (direction.equalsignorecase("right"))else }}

(5)動作結點類,充當終結符表示式角色

/**

* 動作結點類,充當終結符表示式角色

*/public class actionnode extends abstractnode

//移動方式表示式的解釋操作

@override

public string interpret() else if(action.equalsignorecase("run"))else }}

(6)距離結點類,充當終結符表示式角色

/**

* 距離結點類,充當終結符表示式角色

*/public class distancenode extends abstractnode

//距離表示式的解釋操作

@override

public string interpret()

}

(7)處理類

/**

* 處理類

*/public class instructionhandler

}

(9)輸出結果及路徑

6.直譯器優缺點

優:(1)易於改變和擴充套件文法

(2)每一條文法規則都可以表示為乙個類

(3)實現文法較為容易

(4)增加新的解釋表示式較為方便

缺:(1)複雜文法難以維護

(2)執行效率低

7.使用環境

(1)將乙個需要解釋執行的語言中的句子表示成一顆抽象語法樹

(2)重複出現的問題可以用一種簡單的語言表達

(3)執行效率不重要

(4)語言的文法較為簡單

設計模式筆記 16 直譯器模式(行為型)

給定乙個語言,定義它的文法的一種表示,並定義一種直譯器,這個直譯器使用該表示來解釋語言中的句 子。在軟體構建過程中,如果某一特定領域的問題比較複雜,類似的模式不斷重複出現,如果使用普通的程式設計方式來實現將面臨非常頻繁的變化。在這種情況下,將特定領域的問題表達為某種語法規則下的句子,然後構建乙個直譯...

設計模式筆記 16 直譯器模式(行為型)

給定乙個語言,定義它的文法的一種表示,並定義一種直譯器,這個直譯器使用該表示來解釋語言中的句 子。在軟體構建過程中,如果某一特定領域的問題比較複雜,類似的模式不斷重複出現,如果使用普通的程式設計方式來實現將面臨非常頻繁的變化。在這種情況下,將特定領域的問題表達為某種語法規則下的句子,然後構建乙個直譯...

直譯器模式

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