設計模式 直譯器模式

2021-09-16 14:31:44 字數 1742 閱讀 1884

定義:

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

角色

**實現:

解釋波蘭表示式(polish notation)

波蘭邏輯學家 j.lukasiewicz 於 1929 年提出了一種不需要括號的表示法,將運算子寫在運算物件之前,也就是字首表示式,即波蘭式(polish notation, pn)。

比如:2 + 5 * (1 - 4)這個表示式的字首表示式為+ 2 * 5 - 1 4

字尾表示式也稱為逆波蘭式(reverse polish notation, rpn),和字首表示式相反,是將運算符號放置於運算物件之後。

比如:2 + 5 * (1 - 4)用逆波蘭式來表示則是:2 5 1 4 - * +

下面我們實現字尾表示式。

public inte***ce expression
public class number implements expression 

public int interpret(mapvariables)

}

public class minus implements expression 

public int interpret(mapvariables)

}

public class variable implements expression 

public int interpret(mapvariables)

}

public class plus implements expression 

public int interpret(mapvariables)

}

public class evaluator implements expression  else if (token.equals("-"))  else

expressionstack.push(new variable(token));

}syntaxtree = expressionstack.pop();

}public int interpret(mapcontext)

}

public class interpreterexample 

}

context也是在客戶端定義,定義表示式,裝配到直譯器中,將context作為引數傳遞進去,最後直譯器輸出結果。

本文主要講解了直譯器模式,直譯器是乙個簡單的語法分析工具,它最顯著的優點就是擴充套件性,修改語法規則只需要修改相應的非終結符就可以了,若擴充套件語法,只需要增加非終結符類就可以了。

但是,直譯器模式會引起類的膨脹,每個語法都需要產生乙個非終結符表示式,語法規則比較複雜時,就可能產生大量的類檔案,為維護帶來非常多的麻煩。

同時,由於採用遞迴呼叫方法,每個非終結符表示式只關心與自己相關的表示式,每個表示式需要知道最終的結果,必須通過遞迴方式,無論是物件導向的語言還是面向過程的語言,遞迴都是乙個不推薦的方式。

由於使用了大量的迴圈和遞迴,效率是乙個不容忽視的問題。特別是用於解釋乙個解析複雜、冗長的語法時,效率是難以忍受的。

設計模式 直譯器模式

未來機器智慧型化已然成為趨勢,現在手機都能聽懂英語和普通話,那我大中華幾萬種方言的被智慧型化也許也是趨勢,我們的方言雖然和普通話相似,但是還是不一樣的。這可能需要乙個新的語法分析器來幫助我們。我們的直譯器模式就是描述了如何為簡單的語言定義乙個文法,如何在該語言中表示乙個句子,以及如何解釋這些句子。但...

設計模式 直譯器模式

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

設計模式 直譯器模式

直譯器模式 interpreter pattern 提供了評估語言的語法或表示式的方式,它屬於行為型模式。這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。這種模式被用在 sql 解析 符號處理引擎等。給定乙個語言,定義它的文法表示,並定義乙個直譯器,這個直譯器使用該標識來解釋語言中的句子。...