任何时刻可用的选项集由该点上类可用的方法决定。由该方法返回的类确定下一组方法。
因此,生成该链的文法规则是一个
右线性文法,其中起始符号为类,符号为方法,非终结符为方法返回的类。
class Car:
configure: Configurator
class Configurator:
with: Configurator // noise method
and: Configurator // noise method
wheels: int -> Configurator
windows: int -> WindowDetails
class WindowDetails:
transparent -> Configurator
tinted -> Configurator
忽略方法参数(int):
Car -> "configure" Configurator
Configurator -> "with" Configurator
Configurator -> "and" Configurator
Configurator -> "wheels" Configurator
Configurator -> "windows" WindowDetails
WindowDetails -> "transparent" Configurator
WindowDetails -> "tinted" Configurator
但是这没有涵盖到车轮的参数(即车轮数量)的论点。由于不同的整数参数可能导致不同的类别(例如,在“(2)”之后,您是否有一个Configurator或WindowDetails?),因此常规语法无法处理它。
Configurator -> "wheels" Integer
Configurator -> "windows" Integer
Integer -> ?
所以这取决于你想要什么。方法链可以用正则语法描述,但正则语法不能描述传递给方法的参数。据我所知。
如果添加上上下文无关语法的复杂性,就可以处理参数,因为这样你可以做类似这样的事情:
Configurator -> "wheels" Integer Configurator
Configurator -> "windows" Integer WindowDetails
这里的“额外信息”是指整数参数之后需要继续进行的信息。
注意:上述假设方法名称在所有类中都是唯一的。如果您有两个不同的类具有相同的方法名称,则会出现问题,显然(我希望如此)(如果您使用“with”和“and”之类的东西,这种情况可能并不罕见...)。
var
并且由于Fowler的提及而假设为Java。顺便说一句,从CFG生成这个的想法很棒! - Matt Ball