tipos que hacer ejemplos compiladores compilador como basico java parsing compiler-construction casting

que - ¿Cómo funciona un compilador de Java parse typecasts?



que es un compilador (2)

Una expresión simple como

(x) - y

se interpreta de manera diferente según si x es un nombre de tipo o no. Si x no es un nombre de tipo, (x) - y solo resta y de x . Pero si x es un nombre de tipo, (x) - y calcula el valor negativo de y y arroja el valor resultante para escribir x .

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

Pero en Java, x puede no definirse hasta más adelante en el código fuente. ¿Cómo hace un compilador Java para eliminar la ambigüedad de dicha expresión?

Está claro que un compilador Java necesita múltiples pases, ya que Java no requiere declaración previa al uso. Pero eso parece implicar que el primer pase tiene que hacer un trabajo muy descuidado al analizar expresiones, y luego en un pase posterior hacer otro análisis de expresiones más preciso. Eso parece un desperdicio

¿Hay una mejor manera?


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 - cannot be applied to Double, java.lang.Double .

Poniendo paréntesis alrededor del -y lo hace compilar bien. Entonces, 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).


Creo que encontré la solución que me satisface. Gracias a mmyers, me di cuenta de que necesitaba verificar la especificación formal de la sintaxis para los tipos de conversión.

La ambigüedad es causada por + y - siendo ambos operadores unarios y binarios. Java resuelve el problema con esta gramática:

CastExpression: ( PrimitiveType Dimsopt ) UnaryExpression ( ReferenceType ) UnaryExpressionNotPlusMinus

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

Entonces, ''+'' y ''-'' son explícitamente desautorizados inmediatamente después del '')'' de un elenco a menos que el elenco use un tipo primitivo, que el compilador conoce a priori.