任意の時点でのオプションのセットは、その時点でクラスで使用可能なメソッドによって決定されます。そのメソッドによって返されるクラスによって、次の一連のメソッドが決まります。
したがって、チェーンを生成する文法の規則は、開始記号がクラスであり、記号がメソッドであり、非終端記号がメソッドによって返されるクラスである正しい規則文法です。
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
これには、整数引数の後に正しく続行するために必要な追加情報があります。
注: 上記は、メソッド名がすべてのクラスで一意であることを前提としています。同じメソッド名を持つ2つの異なるクラスがある場合、明らかに問題が発生します(私は願っています) (そして、「with」や「and」などを使用している場合、これはそれほどまれではないかもしれません....)