Pregunta

Una expresión simple como

(x) - y

se interpreta de manera diferente dependiendo de si x es un nombre de tipo o no. Si x no es un nombre de tipo, (x) - y simplemente resta y de x . Pero si x es un nombre de tipo, (x) - y calcula el negativo de y y convierte el valor resultante en el tipo x .

En un compilador típico de C o C ++, la pregunta de si x es un tipo o no es respondible porque el analizador comunica dicha información al lexer tan pronto como procesa una declaración typedef o struct. (Creo que tal violación requerida de niveles fue la parte más desagradable del diseño de C.)

Pero en Java, x puede no estar definido hasta más adelante en el código fuente. ¿Cómo un compilador de Java desmarca tal expresión?

Está claro que un compilador de Java necesita varios pases, ya que Java no requiere declaración antes de usar. Pero eso parece implicar que el primer paso tiene que hacer un trabajo muy descuidado en el análisis de las expresiones, y luego en un pase posterior, hacer otro análisis de expresiones más preciso. Eso parece un desperdicio.

¿Hay una mejor manera?

¿Fue útil?

Solución

Creo que he encontrado la solución que me satisface. Gracias a mmyers, me di cuenta de que necesitaba verificar las especificaciones formales de la sintaxis para los tipos de conversión.

La ambigüedad se debe a que + y - son operadores unarios y binarios. Java resuelve el problema por esta gramática:

CastExpression:
        ( PrimitiveType Dimsopt ) UnaryExpression
        ( ReferenceType ) UnaryExpressionNotPlusMinus

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

Por lo tanto, '+' y '-' se rechazan explícitamente inmediatamente después del ')' de una conversión a menos que la conversión use una tipo primitivo - que son conocidos por el compilador a priori.

Otros consejos

Acabo de probarlo, y este código:

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

da un error de compilación:

  

operator: no se puede aplicar a Double, java.lang.Double .

Poner paréntesis alrededor de la -y hace que se compile bien. Así que aparentemente, Java resuelve este problema simplemente no permitiéndolo en la gramática (si esa es la terminología correcta; no soy un experto en compiladores).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top