直譯器模式

2021-10-03 18:30:36 字數 3041 閱讀 9273

直譯器模式:定義乙個語言的文法,並且建立乙個直譯器來解釋該語言中的句子,這裡的"語言"是指適用規定格式和語法的**.直譯器模式是一種類行為型模式.

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

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

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

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

abstract class abstractexpression
class terminalexpression extends abstractexpression

}

class nonterminalexpression extends abstractexpression

public void interpret(context ctx)

}

class context

public string lookup(string key)

}

開發一套簡單的基於字元介面的格式化指令,可以根據輸入的指令在字元介面中輸出一些格式化內容 ,例如輸入"loop 2 print 楊過 space space print 小龍女 break end print 郭靖 space space print 黃蓉".將輸出如下結果:

**如下:

public abstract class node
public class context 

public string nexttoken(

)else

return currenttoken;

} // 返回當前的標記

public string currenttoken(

) public void skiptoken(string token)

nexttoken();

} // 如果當前的標記是乙個數字,則返回對應的數值

public int currentnumber(

)catch (numberformatexception e)

return number;

}}

public class expressionnode extends node else if(context.currenttoken(

).equals(

"end"

))else}}

@override

public void execute()}

}

public class commandnode extends node else

} @override

public void execute(

)}

public class loopcommandnode extends node

@override

public void execute()}

}

public class primitivecommandnode extends node 

if(name.equals(

"print"))}

@override

public void execute(

)else if(name.equals(

"space"

))else if(name.equals(

"break"))}

}

public class client 

}

主要優點:

1)易於改變和擴充套件文法.由於在直譯器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴充套件文法。

2)每一條文法規則都可以表示為乙個類,因此可以方便地實現乙個簡單的語言。

3)實現文法較為容易。在抽象語法樹中每乙個表示式節點類的實現方式都是相似的,這些類的**編寫都不會特別複雜,還可以通過一些工具自動生成節點類**。

4)增加新的解釋表示式較為方便。如果使用者需要增加新的解釋表示式只需要對應增加乙個新的終結符表示式或非終結符表示式類,原有表示式類**無須修改,符合「開閉原則」。

主要缺點:

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

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

適用場景:

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

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

3)乙個語言的文法較為簡單。

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

直譯器模式

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

直譯器模式

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

直譯器模式

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