Frage

Ich schreibe eine Sprache mit Antlr und Expression Bäume.

Ich habe eine Standard-Factory-Methode definierte für meinen Baum-Parser zu verwenden, wenn zusätzlich zu erzeugen, und es funktioniert sehr gut für die in ganzzahligen Typen gebaut, jetzt auf allgemeinere Arten Ich bin bewegt.

Im Moment ist es unglaublich naiv, es einfach tut dies (in-progress oft TDD-Code sieht naiv richtig!?):

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);
}

Wo Promote7_2_6_2 Convert Ausdrücke erzeugt, die die Regeln für ganzheitliche Förderung folgen, wie durch die C # spec 7.2.6.2 angelegt (Die Sprache wird in C # ähnlich sein, aber Cross-Over mit JScript sowie mit anderen brandneue Keywords) .

Natürlich habe ich ging zum Testen String zusätzlich - das heißt "a" + "b"; und ich den Fehler:

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

Na gut - wir reflektieren System.String und sicher genug, dass Betreiber ist in der Tat nicht definiert. Erzeugen eines Ausdrucksbaums in einem Testverfahren wie folgt aus:

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

Zeigt an, dass ein Add Binary ist in der Tat erstellt, aber mit der Umsetzung der Methode Satz zu einem der string.Concat Methoden.

Ich war mir bewusst, dass ich wollte, haben, betrachten in einigen Fällen so etwas wie dies zu tun, aber wie viele andere Arten definiert zusätzlich auf diese Weise? Ist es nur string?

Ist es eine Regel in der C # Compiler eingebettet - oder ist es eine Art auffindbar Meta-Daten, dass ich verwenden kann, automatische Erkennung von solchen Methoden auf anderen Typen

?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Es scheint, dass ich eine große Linie tun, um meine eigenen Fragen zu beantworten!

Ich entschuldige mich, könnte diese Antwort besser formatiert werden, aber ich bin auf meinem HTC Desire und seine Tastatur unterstützt nicht alle die Symbole!

es scheint, dass es keine Möglichkeit gibt zu ‚entdecken‘ diese Regeln zur Laufzeit, ist es in der Verantwortung der Host-Sprache zu entscheiden, wie solche Dinge wie String zusätzlich zu implementieren. C # passt sich an die Anzahl von aufeinander folgenden Bedingungen in einem Zusatz, rufen die die .Concat Methode, die am geeignetsten, dass übereinstimmt.

Also, wenn ich meine Sprache Unterstützung Zugabe von Klasseninstanzen will, wo ein Betreiber nicht für sich definiert ist, zum Beispiel, kann ich einfach schreiben oder eine statische Methode, es zu tun finden (der korrekten Signatur natürlich!) Und dann verdrahten die Sprache es in diesem Fall zu verwenden. Ein klassisches Beispiel ist hier, ob array1 + array2 durch die statischen Array Methoden unterstützen.

Wie für die Entdeckung von Operatoren erfolgt die Expression.Add Methode Pflege, aber es führt nicht automatisch alle Umwandlungen, so, wie mit dem Integral / Punkt-Promotion-Methode I Referenz in der Frage schwamm, ist es wieder nach oben an die Regeln der Sprache, um zu bestimmen, ob andere Umwandlungen, bevor erforderlich sind, um die Expression zu bauen.

Als solches ist es wahrscheinlich am besten, um den Bediener zu reflektieren zuerst, um zu sehen, wenn man für die beiden Typen definiert wird, bevor dann eine Konvertierung unter Berücksichtigung, wenn ein solches vorhanden ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top