Frage

Ein einfacher Ausdruck wie

(x) - y

wird unterschiedlich interpretiert, je nachdem ob x ist ein Typenname oder nicht. Wenn x kein Typname ist, subtrahiert (x) - y nur y von x. Aber wenn x ein Typname ist, (x) - y berechnet den negativen y und wirft den resultierenden Wert x eingeben.

In einem typischen C oder C ++ Compiler, die Frage, ob x ist eine Art oder nicht, ist verantwortlich, weil der Parser diese Informationen an die Lexer in Verbindung steht, sobald es eine typedef oder Strukturdeklaration verarbeitet. (Ich glaube, dass eine solche erforderliche Verletzung Ebenen der übelsten Teil des Designs von C war.)

Aber in Java, x erst später im Quellcode definiert werden kann. Wie funktioniert disambiguate ein Java-Compiler einen Ausdruck so?

Es ist klar, dass ein Java-Compiler mehrere Durchgänge benötigt, da Java keine Erklärung-vor-Einsatz erfordern. Aber das scheint zu implizieren, dass der erste Durchgang eine sehr schlampige Arbeit auf Parsen Ausdrücken zu tun hat, und dann in einem späteren Durchlauf das anderes tut, genauer, Parsen von Ausdrücken. Das scheint verschwenderisch.

Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Ich glaube, ich habe die Lösung gefunden, die mich erfüllt. Dank mmyers, erkannte ich, dass ich brauchte die formale Spezifikation der Syntax für Typ Abgüsse zu überprüfen.

Die Mehrdeutigkeit wird verursacht durch + und - wobei beide einstellige und binäre Operatoren. Java löst das Problem durch diese Grammatik:

CastExpression:
        ( PrimitiveType Dimsopt ) UnaryExpression
        ( ReferenceType ) UnaryExpressionNotPlusMinus

(siehe http: //java.sun. com / docs / Bücher / JLS / third_edition / html / expressions.html # 238146 )

So, '+' und '-' explizit unmittelbar nach dem ')' eines gegossenen, es sei denn die Besetzung verwendet eine primitive Art nicht erlaubt -., Die vom Compiler a priori bekannt sind,

Andere Tipps

Ich habe es getestet gerade aus, und dieser Code:

Double y = new Double(0.1);
System.out.println((Double)-y);

gibt einen Compiler-Fehler:

  

operator - cannot be applied to Double, java.lang.Double.

Putting Klammern um die -y macht es gut kompilieren. So offenbar Java löst dieses Problem, indem es einfach nicht in der Grammatik erlaubt (wenn das die richtige Terminologie, ich bin kein Experte für Compiler).

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