模式定义

给定一个语言,定义它的文法的一种示意,并定义一种解释器,这个解释器应用该示意来解释语言中的句子

类图

要点总结

  • Interpreter模式的利用场合是Interpreter模式利用中的难点,只有满足“业务规定频繁变动,且相似的构造一直反复呈现,并且容易形象为语法规定的问题”才适宜应用Interpreter模式
  • 应用interpreter模式来示意文法规定,从而能够应用面向对象技巧来不便地“扩大”文法
  • Interpreter模式比拟适宜简略的文法示意,对于简单的文法示意,Interpreter模式会产生比拟大的类层次结构,须要求助于语法分析生成器这样的规范工具

Go语言代码实现

工程目录

Interpretor.go

package Interpreterimport "strings"type Expression interface {   Interpret(variables map[string]Expression)int}type Interger struct {   integer int}func (n *Interger) Interpret(variables map[string]Expression) int {   return n.integer}type Plus struct {   leftOperand Expression   rightOperand Expression}func (p *Plus) Interpret(variables map[string]Expression) int {   return p.leftOperand.Interpret(variables) + p.rightOperand.Interpret(variables)}func (e Evaluator) Interpret(variable map[string]Expression)int{   return e.syntaxTree.Interpret(variable)}type Variable struct {   name string}type Node struct {   value interface{}   next *Node}type Stack struct {   top *Node   size int}func (s *Stack) Push (value interface{}){   s.top= &Node{      value: value,      next:  s.top,   }}func (v *Variable) Interpret(variable map[string]Expression)int {   value, found := variable[v.name]   if !found {      return 0   }   return value.Interpret(variable)}func (s *Stack) Pop() interface{} {   if s.size == 0{      return nil   }   value := s.top.value   s.top = s.top.next   s.size--   return value}type Evaluator struct {   syntaxTree Expression}func NewEvaluator(expression string) *Evaluator{   expressionStack := new(Stack)   for _, token := range strings.Split(expression, " ") {      switch token {      case "+":         right := expressionStack.Pop().(Expression)         left := expressionStack.Pop().(Expression)         subExpression := &Plus{left, right}         expressionStack.Push(subExpression)      default:         expressionStack.Push(&Variable{token})      }   }   syntaxTree := expressionStack.Pop().(Expression)   return &Evaluator{syntaxTree: syntaxTree}}

Interpretor_test.go

package Interpreterimport (   "fmt"   "testing")func TestInterger(t *testing.T) {   expression := "w x z +"   sentence := NewEvaluator(expression)   variables := make(map[string]Expression)   variables["w"] = &Interger{6}   variables["x"] = &Interger{10}   variables["z"] = &Interger{41}   result := sentence.Interpret(variables)   fmt.Println(result)}