解釋器模式是什麼 解釋器是一種行為型設計模式,指給分析對象定義一個語言,並定義該語言的文法表示,再設計一個解析器來解釋語言中的句子。也就是說,用編譯語言的方式來分析應用中的實例。這種模式實現了文法表達式處理的介面,該介面解釋一個特定的上下文。 為什麼用解釋器模式 在軟體開發中,會遇到有些問題多次重覆 ...
解釋器模式是什麼
解釋器是一種行為型設計模式,指給分析對象定義一個語言,並定義該語言的文法表示,再設計一個解析器來解釋語言中的句子。也就是說,用編譯語言的方式來分析應用中的實例。這種模式實現了文法表達式處理的介面,該介面解釋一個特定的上下文。
為什麼用解釋器模式
在軟體開發中,會遇到有些問題多次重覆出現,而且有一定的相似性和規律性。如果將它們歸納成一種簡單的語言,那麼這些問題實例將是該語言的一些句子,這樣就可以用“編譯原理”中的解釋器模式來實現了。雖然使用解釋器模式的實例不是很多,但對於滿足以上特點,且對運行效率要求不是很高的應用實例,如果用解釋器模式來實現,其效果是非常好的。
解釋器模式怎麼實現
這裡用解釋器模式實現一個字元串加法減法的操作。
node.go
package interpreter
type Node interface {
Interpret() int
}
add_node.go
package interpreter
type AddNode struct {
left, right Node
}
func (n *AddNode) Interpret() int {
return n.left.Interpret() + n.right.Interpret()
}
min_node.go
package interpreter
type MinNode struct {
left, right Node
}
func (n *MinNode) Interpret() int {
return n.left.Interpret() - n.right.Interpret()
}
val_node.go
package interpreter
type ValNode struct {
val int
}
func (n *ValNode) Interpret() int {
return n.val
}
parser.go解釋器
package interpreter
import (
"strconv"
"strings"
)
// 解釋器
type Parser struct {
exp []string
index int
prev Node
}
func (p *Parser) Parse(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.newMinNode()
default:
p.prev = p.newValNode()
}
}
}
func (p *Parser) newAddNode() Node {
p.index++
return &AddNode{
left: p.prev,
right: p.newValNode(),
}
}
func (p *Parser) newMinNode() Node {
p.index++
return &MinNode{
left: p.prev,
right: p.newValNode(),
}
}
func (p *Parser) newValNode() Node {
v, _ := strconv.Atoi(p.exp[p.index])
p.index++
return &ValNode{
val: v,
}
}
func (p *Parser) Result() Node {
return p.prev
}
example.go
package interpreter
import "fmt"
func Example() {
p := new(Parser)
exp := "5 + 1 - 2"
p.Parse(exp)
fmt.Println(p.Result().Interpret())
}
// 4
優點
- 擴展性好。由於在解釋器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴展文法。
- 容易實現。在語法樹中的每個表達式節點類都是相似的,所以實現其文法較為容易。
缺點
- 執行效率較低。解釋器模式中通常使用大量的迴圈和遞歸調用,當要解釋的句子較複雜時,其運行速度很慢,且代碼的調試過程也比較麻煩。
- 會引起類膨脹。解釋器模式中的每條規則至少需要定義一個類,當包含的文法規則很多時,類的個數將急劇增加,導致系統難以管理與維護。
- 可應用的場景比較少。在軟體開發中,需要定義語言文法的應用實例非常少,所以這種模式很少被使用到。