Golang设计模式之解释器模式

Jackey Golang 2,030 次浏览 , , 没有评论

创建文件Node.go

package interpreter

type Node interface {
    Interpreter() int
}

type ValNode struct {
    val int
}

func (v *ValNode) Interpreter() int {
    return v.val
}

创建AddNode.go

package interpreter

type AddNode struct {
    left, right Node
}

func (a *AddNode) Interpreter() int {
    return a.left.Interpreter() + a.right.Interpreter()
}

创建SubNode.go

package interpreter

type SubNode struct {
    left, right Node
}

func (s *SubNode) Interpreter() int {
    return s.left.Interpreter() - s.right.Interpreter()
}

创建Parser.go

package interpreter

import (
    "strconv"
    "strings"
)

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

func (p *Parser) Parser(exp string) {
    p.exp = strings.Split(exp, " ")
    for {
        if p.index >= len(p.exp) {
            return
        }
        switch p.exp[p.index] {
        case "+":
            p.prev = p.newAddNode()
        case "-":
            p.prev = p.newSubNode()
        default:
            p.prev = p.newValNode()
        }
    }
}

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

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

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

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

main.go

package main

import (
    "fmt"
    "ssp_api_go/test/design/interpreter"
)

func main() {
    p := &interpreter.Parser{}
    p.Parser("1 + 3 - 2")
    fmt.Println(p.Result().Interpreter())
}

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Go