任何时候的选项集由该类上可用的方法决定。该方法返回的类确定下一组方法。
所以生成链的文法规则是正确的正则文法,其中开始符号是类,符号是方法,非终结符是方法返回的类:
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
忽略方法 args (int):
Car -> "configure" Configurator
Configurator -> "with" Configurator
Configurator -> "and" Configurator
Configurator -> "wheels" Configurator
Configurator -> "windows" WindowDetails
WindowDetails -> "transparent" Configurator
WindowDetails -> "tinted" Configurator
但这未能捕捉到轮子的参数(轮子的数量)。并且常规语法无法处理该问题,因为不同的整数参数可能会导致不同的类(例如,在“(2)”之后,您是否有配置器或WindowDetails?):
Configurator -> "wheels" Integer
Configurator -> "windows" Integer
Integer -> ?
所以这取决于你想要什么。方法链可以用正则文法来描述。但是常规语法也不能描述传递给方法的参数。事实。
您可以通过添加上下文无关语法的复杂性来处理参数,因为您可以执行以下操作:
Configurator -> "wheels" Integer Configurator
Configurator -> "windows" Integer WindowDetails
它具有在整数参数之后正确继续所需的额外信息。
注意:以上假设方法名称在所有类中都是唯一的。如果您有两个具有相同方法名称的不同类,那么您显然会遇到问题(我希望)(如果您使用诸如“with”和“and”之类的东西,这可能并不罕见......)