3

私はMartin Fowlersの文章のような流暢なインターフェースを使いこなしています。彼らが記述している文法が文脈自由であるか正規であるかどうか疑問に思っていますか?私はこのようなインターフェイスについて話しています:流暢なインターフェースは文脈自由であるか規則的な文法で記述されていますか?

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

私がしようとしているのは、それらを生成できるプログラムを書くことです。現在のところ、文脈自由文法の入力が必要ですが、私はこれをソースコードアプリケーションに変換する際にいくつかの問題があるようです。その答えは、各「端末」メソッドの結果を事前に知っておく必要があるため、「スタック」の状態を知ることができないため、正規の文法にしか到達できないと考えています。

私は今何をしているのですか?しかし、特定の文法にはバグがあります。

編集:私は規則的な文法を使いましたが、コードはオープンソースであり、誰かがそれを使いこなしたいと思っていれば、現在作業中です。 https://github.com/Dervall/Snout

+0

例の言語としてC#のプロパティとされていました。 – Dervall

+0

確かに、私の間違い。私は 'var'を見逃し、Fowlerの言及のためにJavaを想定しました。 BTG、CFGからこれを生成するためのきちんとしたアイデア! –

+0

これは最低限のアイデアですが、通常の文法で解決しなければならないと思います。あるいはバグのコードを書いています。 :) – Dervall

答えて

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 

これはキャプチャに失敗したものは、ホイールの引数(ホイールの数)です。

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

がそう、それはあなたが望むものによって異なりますし、定期的な文法は異なる整数引数は(?「(2)」あなたはコンフィギュレータまたはWindowDetailsを持っているん後など)、異なるクラスにつながる可能性があるためという処理することはできません。メソッドの連鎖は規則的な文法で記述することができます。通常の文法では、メソッドに渡される引数も記述できません。アフガニスタン整数の引数の後に正常に継続するために必要な追加の情報を持っている

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

あなたが、あなたのような何かを行うことができますので、文脈自由文法の複雑さを加えることで、引数を処理することができます。

:上記では、メソッド名がすべてのクラスで一意であると仮定しています。同じメソッド名を持つ2つの異なるクラスがある場合は、明らかに(私は願って)問題が発生します(これは "with"や "and" ....のようなものを使用している場合はまれではありません)

+0

次のオプションのセットを提示するために、どのクラスが返されているのかをコンパイル時に知る必要があるため、引数が処理されないのは問題ありません。しかし、あなたが言っていることは、文法のクラスは**文脈自由**の代わりに**規則**文法であるということですか? – Dervall

+0

上記は正規の文法を使用しています。私は単純なメソッド連鎖の文脈自由文法の必要性を見ません。それらは引数を処理する必要があります(簡略化すると、括弧付きのものは文脈自由を意味する傾向があります。なぜなら、括弧が閉じると、前に行っていたことに "ポップバック"する必要があるからです)。あ、はい"。アップデートを参照してください。 –

+0

しかしユニークなメソッド名についての注意を参照してください... –

関連する問題