Question

Une expression simple comme

(x) - y

est interprété différemment selon que x est un nom de type ou non. Si x n'est pas un nom de type, (x) - y soustrait simplement y de x . Mais si x est un nom de type, (x) - y calcule le négatif de y et convertit la valeur résultante en type x .

Dans un compilateur C ou C ++ typique, la question de savoir si x est un type ou non est répondable car l'analyseur communique ces informations au lexer dès qu'il traite une déclaration typedef ou struct. (Je pense que cette violation obligatoire des niveaux était la partie la plus cruelle de la conception de C.)

Mais en Java, x ne peut être défini que plus tard dans le code source. Comment un compilateur Java peut-il lever l'ambiguïté d'une telle expression?

Il est clair qu'un compilateur Java nécessite plusieurs passes, car Java ne nécessite pas de déclaration avant utilisation. Mais cela semble impliquer que la première passe doit faire un travail très bâclé sur l'analyse des expressions, puis une autre, plus précise, une analyse syntaxique d'expressions. Cela semble inutile.

Y a-t-il un meilleur moyen?

Était-ce utile?

La solution

Je pense avoir trouvé la solution qui me satisfait. Grâce à mmyers, je me suis rendu compte que je devais vérifier les spécifications formelles de la syntaxe pour les transtypages.

Cette ambiguïté est due au fait que + et - sont à la fois des opérateurs unaires et binaires. Java résout le problème par cette grammaire:

CastExpression:
        ( PrimitiveType Dimsopt ) UnaryExpression
        ( ReferenceType ) UnaryExpressionNotPlusMinus

(voir http: //java.sun. com / docs / books / jls / third_edition / html / expressions.html # 238146 )

Ainsi, '+' et '-' sont explicitement interdits immédiatement après le ')' d'une distribution, sauf si la distribution utilise un type primitif - connus à priori par le compilateur.

Autres conseils

Je viens de le tester et ce code:

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

donne une erreur de compilation:

  

opérateur - ne peut pas être appliqué à Double, java.lang.Double .

Mettre des parenthèses autour de -y facilite la compilation. Donc apparemment, Java résout ce problème simplement en ne le permettant pas dans la grammaire (si c'est la bonne terminologie, je ne suis pas un expert en compilateurs).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top