首页 文章

流程接口是由上下文无关或常规语法描述的吗?

提问于
浏览
3

我正在使用Martin Fowlers文本风格的流畅界面,我想知道他们描述的语法是无上下文还是常规?我在谈论这样的接口:

var car = new Car();
car.Configure().MakeCar.With.Wheels(4).And.Engine.Using.Petrol;

我要做的是编写一个可以生成它们的程序 . 目前它需要输入无上下文语法,但我似乎在将其转换为源代码应用程序时遇到一些困难 . 我怀疑答案是我只能达到常规语法,因为无法知道“堆栈”的状态,因为每个“终端”方法的结果必须事先知道 .

我现在得到的是什么,但是它会对某些语法产生影响 .

Edit: 我使用常规语法,代码是开源的,现在正在工作,如果有人热衷于玩弄它 . https://github.com/Dervall/Snout

1 回答

  • 2

    任何点上的选项集都由该点上该类可用的方法确定 . 该方法返回的类确定下一组方法 .

    所以生成链的语法规则是right regular grammar,其中起始符号是类,符号是方法,非终端是方法返回的类:

    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)”之后你有一个Configurator或一个WindowDetails?):

    Configurator -> "wheels" Integer
    Configurator -> "windows" Integer
    Integer -> ?
    

    所以这取决于你想要什么 . 方法链可以用常规语法描述 . 但是常规语法也不能描述传递给方法的参数 . AFAICT .

    您可以通过添加上下文无关语法的复杂性来处理参数,因为这样您可以执行以下操作:

    Configurator -> "wheels" Integer Configurator
    Configurator -> "windows" Integer WindowDetails
    

    具有在整数参数后正确继续所需的额外信息 .

    NOTE :以上假设方法名称在所有类中都是唯一的 . 如果你有两个不同的类具有相同的方法名称,那么你会遇到问题,显然(我希望)(如果你使用像"with"和"and"这样的东西,这可能不会那么罕见)

相关问题