第二十三章 Caché 设计模式 解释器模式

第二十三章 Caché 设计模式 解释器模式

定义

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

使用场景

  • 如果一种特性类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,解释器通过解释这些句子来解决该问题。

  • 有一个简单的语法规则,比如编码转换.翻译。

  • 正则表达式,浏览器。

优点

扩展性强,若要新增乘,除,添加相应的非终结表达式,修改计算逻辑即可。

缺点

  • 需要建大量的类,因为每一种语法都要建一个非终结符的类。
  • 解释的时候采用递归调用方法,导致有时候函数的深度会很深,影响效率。

结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jr2WdiVm-1588377076721)(1B15B40786E4438E95F15EC1137A0CD8)]

描述

用abc来代替123数字。

完整示例

抽象解释器

Class PHA.YX.Design.Interpreter.Expression Extends %RegisteredObject
{

Method Interpreter(context As Context) As %Integer [ Abstract ]
{
	q 0
}

}

上下文

Class PHA.YX.Design.Interpreter.Context Extends %RegisteredObject
{

Property map As %ArrayOfDataTypes;

Method Add(s As Expression, value As %Integer)
{
	d ..map.SetAt(value, s)
}

Method Lookup(s As Expression)
{
	q ..map.GetAt(s)
}

}

终结符表达式

Class PHA.YX.Design.Interpreter.TerminalExpression Extends Expression
{

Property variable As %String;

Method %OnNew(variable As %String) As %Status [ Private, ServerOnly = 1 ]
{
	s ..variable = variable
	Quit $$$OK
}

Method Interpreter(context As Context) As %Integer
{
	q context.Lookup($this)
}

}

非终结符表达式

Class PHA.YX.Design.Interpreter.NonTerminalExpression Extends Expression
{

Property e1 As Expression;

Property e2 As Expression;

Method %OnNew(e1 As Expression, e2 As Expression) As %Status [ Private, ServerOnly = 1 ]
{
	s ..e1 = e1
	s ..e2 = e2
	Quit $$$OK
}

}

Class PHA.YX.Design.Interpreter.MinusOperation Extends NonTerminalExpression
{

Method %OnNew(e1 As Expression, e2 As Expression) As %Status [ Private, ServerOnly = 1 ]
{
    d ##super(e1, e2)
	Quit $$$OK
}

Method Interpreter(context As Context) As %Integer
{
	
	q ..e1.Interpreter(context) - ..e2.Interpreter(context)
}

}

Class PHA.YX.Design.Interpreter.PlusOperation Extends NonTerminalExpression
{

Method %OnNew(e1 As Expression, e2 As Expression) As %Status [ Private, ServerOnly = 1 ]
{
    d ##super(e1, e2)
	Quit $$$OK
}

Method Interpreter(context As Context) As %Integer
{
	q ..e1.Interpreter(context) + ..e2.Interpreter(context)
}

}

调用

/// d ##class(PHA.YX.Design.Program).Interpreter() 
ClassMethod Interpreter()
{
	s context = ##class(PHA.YX.Design.Interpreter.Context).%New()
	s a = ##class(PHA.YX.Design.Interpreter.TerminalExpression).%New("a")
	s b = ##class(PHA.YX.Design.Interpreter.TerminalExpression).%New("b")
	s c = ##class(PHA.YX.Design.Interpreter.TerminalExpression).%New("c")
	d context.Add(a, 4)
	d context.Add(b, 8)
	d context.Add(c, 6)
    s min= ##class(PHA.YX.Design.Interpreter.MinusOperation).%New(a,b).Interpreter(context)
	
	w min,!
	
	w ##class(PHA.YX.Design.Interpreter.MinusOperation).%New(##class(PHA.YX.Design.Interpreter.PlusOperation).%New(a, b), c).Interpreter(context),!
}

DHC-APP> d ##class(PHA.YX.Design.Program).Interpreter()
-4
6
 

思考

把数字解释解释成对应英文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaoxin521123

谢谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值