解釋器模式

概念

解釋器模式(Interpreter Pattern)提供了評估語言的語法或表達式的方式隅熙。這種模式實現了一個表達式接口实愚,該接口解釋一個特定的上下文。這種模式被用在 SQL 解析、符號處理引擎等守谓。

模式的場景和優(yōu)缺點

使用場景

對于一些固定文法構建一個解釋句子的解釋器

優(yōu)點

  • 可擴展性比較好,靈活
  • 增加了新的解釋表達式的方式
  • 易于實現簡單文法

缺點

  • 可利用場景比較少
  • 對于復雜的文法比較難維護
  • 解釋器模式會引起類膨脹

代碼實現


package main

import (
    "fmt"
    "strconv"
    "strings"
)

// Node ...
type Node interface {
    Interpret() int
}

// ValNode ...
type ValNode struct {
    val int
}

// Interpret ...
func (n *ValNode) Interpret() int {
    return n.val
}

// AddNode ...
type AddNode struct {
    left, right Node
}

// Interpret ...
func (n *AddNode) Interpret() int {
    return n.left.Interpret() + n.right.Interpret()
}

// MinNode ...
type MinNode struct {
    left, right Node
}

// Interpret ...
func (n *MinNode) Interpret() int {
    return n.left.Interpret() - n.right.Interpret()
}

// Parser ...
type Parser struct {
    exp   []string
    index int
    prev  Node
}

// Parse ...
func (p *Parser) Parse(exp string) {
    p.exp = strings.Split(exp, " ")

    for {
        if p.index >= len(p.exp) {
            return
        }
        // p.prev = p.newXXX, AddNode MinNode left贤旷, 一級一級存儲上層的地址祷安,最后調用 p.Result的時候, 會依次拿到上層存儲的地址嗽桩, 拿到每一層的數據岳守。
        switch p.exp[p.index] {
        case "+":
            p.prev = p.newAddNode()
        case "-":
            p.prev = p.newMinNode()
        default:
            p.prev = p.newValNode()
        }
    }
}

// newAddNode ...
func (p *Parser) newAddNode() Node {
    p.index++
    return &AddNode{
        left:  p.prev,
        right: p.newValNode(),
    }
}

// newMinNode ...
func (p *Parser) newMinNode() Node {
    p.index++
    return &MinNode{
        left:  p.prev,
        right: p.newValNode(),
    }
}

// newValNode ...
func (p *Parser) newValNode() Node {
    v, _ := strconv.Atoi(p.exp[p.index])
    p.index++
    return &ValNode{
        val: v,
    }
}

// Result ...
func (p *Parser) Result() Node {
    return p.prev
}
func main() {

    p := &Parser{}
    p.Parse("1 + 2 + 3 - 4 + 5 - 6")
    // 調用 p.Result的時候, 會依次調用每一層的Interpret(), Interpret調用 left碌冶,拿到left存儲的上層地址湿痢, 拿到每一層的數據。
    res := p.Result().Interpret()
    fmt.Printf("res:%d\n", res)
}


?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市譬重,隨后出現的幾起案子拒逮,更是在濱河造成了極大的恐慌,老刑警劉巖臀规,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滩援,死亡現場離奇詭異,居然都是意外死亡塔嬉,警方通過查閱死者的電腦和手機玩徊,發(fā)現死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邑遏,“玉大人佣赖,你說我怎么就攤上這事〖呛校” “怎么了憎蛤?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纪吮。 經常有香客問我俩檬,道長,這世上最難降的妖魔是什么碾盟? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任棚辽,我火速辦了婚禮,結果婚禮上冰肴,老公的妹妹穿的比我還像新娘屈藐。我一直安慰自己,他們只是感情好熙尉,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布联逻。 她就那樣靜靜地躺著,像睡著了一般检痰。 火紅的嫁衣襯著肌膚如雪包归。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天铅歼,我揣著相機與錄音公壤,去河邊找鬼。 笑死椎椰,一個胖子當著我的面吹牛厦幅,可吹牛的內容都是我干的。 我是一名探鬼主播慨飘,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼确憨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起缚态,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堤瘤,沒想到半個月后玫芦,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡本辐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年桥帆,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慎皱。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡老虫,死狀恐怖,靈堂內的尸體忽然破棺而出茫多,到底是詐尸還是另有隱情祈匙,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布天揖,位于F島的核電站夺欲,受9級特大地震影響,放射性物質發(fā)生泄漏今膊。R本人自食惡果不足惜些阅,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望斑唬。 院中可真熱鬧市埋,春花似錦、人聲如沸恕刘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雪营。三九已至弓千,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間献起,已是汗流浹背洋访。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谴餐,地道東北人姻政。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像岂嗓,于是被迫代替她去往敵國和親汁展。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容