任意の時点でのオプションセットは、その時点でクラスで使用可能なメソッドによって決まります。そのメソッドによって返されたクラスは、次のメソッドのセットを決定します。
ので鎖を生成文法のためのルールは、開始シンボルはクラスであり、シンボルは方法であり、非端末がメソッドによって返されるクラスです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
これはキャプチャに失敗したものは、ホイールの引数(ホイールの数)です。
Configurator -> "wheels" Integer
Configurator -> "windows" Integer
Integer -> ?
がそう、それはあなたが望むものによって異なりますし、定期的な文法は異なる整数引数は(?「(2)」あなたはコンフィギュレータまたはWindowDetailsを持っているん後など)、異なるクラスにつながる可能性があるためという処理することはできません。メソッドの連鎖は規則的な文法で記述することができます。通常の文法では、メソッドに渡される引数も記述できません。アフガニスタン整数の引数の後に正常に継続するために必要な追加の情報を持っている
Configurator -> "wheels" Integer Configurator
Configurator -> "windows" Integer WindowDetails
:
あなたがは、あなたのような何かを行うことができますので、文脈自由文法の複雑さを加えることで、引数を処理することができます。
注:上記では、メソッド名がすべてのクラスで一意であると仮定しています。同じメソッド名を持つ2つの異なるクラスがある場合は、明らかに(私は願って)問題が発生します(これは "with"や "and" ....のようなものを使用している場合はまれではありません)
例の言語としてC#のプロパティとされていました。 – Dervall
確かに、私の間違い。私は 'var'を見逃し、Fowlerの言及のためにJavaを想定しました。 BTG、CFGからこれを生成するためのきちんとしたアイデア! –
これは最低限のアイデアですが、通常の文法で解決しなければならないと思います。あるいはバグのコードを書いています。 :) – Dervall