質問

ANTLRと式の木を使用して言語を書いています。

ツリーパーサーの標準的な工場メソッドを定義して、加算を生成するときに使用する標準の工場メソッドを定義しましたが、組み込みの組み合わせタイプで非常にうまく機能しますが、今ではより一般的なタイプに進んでいます。

現時点では信じられないほど素朴で、これを単に実行します(進行中のTDDコードはしばしば素朴に見えます!?):

protected Expression GenerateAdd(Expression left, Expression right)
{
  if (left.Type.Equals(right.Type))
    return Expression.Add(left, right);
  if (left.Type.IsValueType && right.Type.IsValueType)
    Promote7_2_6_2(ref left, ref right);
  return Expression.Add(left, right);
}

どこ Promote7_2_6_2 C#Spec 7.2.6.2でレイアウトされた統合プロモーションのルールに従う式に従う式を変換する式を生成します(言語はC#に似ていますが、JScriptと他の新しいキーワードを持っているだけでなく、クロスオーバーします)。

当然、私は文字列の追加のテストに移りました-IE "a" + "b"; そして、私はエラーを取得します:

System.InvalidOperationException: The binary operator Add is not defined for the types 'System.String' and 'System.String'.

十分に公平-System.Stringを反映しており、オペレーターが実際に定義されていないことを十分に確信しています。このようなテスト方法で式ツリーを生成する:

Expression<Func<string, string, string>> e = (s1, s2) => s1 + s2;

ADDバイナリエクスペレーションが実際に作成されていることを示していますが、実装メソッドが1つに設定されていることを示しています string.Concat 方法。

場合によってはこのようなことをすることを検討しなければならないことを知っていましたが、この方法で追加を定義する他のタイプはいくつありますか?それは公正です string?

それはC#コンパイラに組み込まれたルールですか?それとも、他のタイプでそのようなメソッドを自動化するために使用できるいくつかの種類の発見可能なメタデータがありますか?

前もって感謝します!

役に立ちましたか?

解決

私は自分の質問に答えるのに素晴らしいラインをしているようです!

私の謝罪、この答えはよりよくフォーマットされる可能性がありますが、私は私のHTCの欲求に従っており、そのキーボードはすべてのシンボルをサポートしていません!

実行時にこれらのルールを「発見」する方法はないように思われます。これは、文字列の追加などを実装する方法を決定するホスト言語の責任です。 C#は、追加の条件の数に適応し、最も適切に一致する.concatメソッドを呼び出します。

したがって、私の言語がオペレーターが定義されていないクラスインスタンスの追加をサポートすることを望む場合、たとえば、(もちろん正しい署名!)それを行うための静的な方法を簡単に書き込んだり見つけることができます。その場合に使用する言語。ここでの古典的な例は、静的配列メソッドを介してarray1 + array2をサポートするかどうかです。

オペレーターの発見に関しては、expression.Addメソッドはそれを処理しますが、それは自動的に変換を実行しないため、質問で参照する積分/浮動小数点プロモーション方法と同様に、再び言語のもの次第です式を構築しようとする前に、他の変換が必要かどうかを判断するためのルール。

そのため、最初にオペレーターを反映して、2つのタイプで定義されているかどうかを確認することが最善です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top