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上下左右方...