sintactica - ¿Cómo evitan Java, C++, C#, etc. esta particular ambigüedad sintáctica con<y>?
frases de ambiguedad (2)
Simplemente no puedo imaginar ninguna forma no-hacky / sin contexto de lidiar con esto, y estoy desconcertado por cómo cualquier lenguaje puede estar libre de contexto, y mucho menos LALR (1) -parsable ...
La respuesta es que no lo son (al menos no Java y C ++, sé muy poco sobre C #). La gramática de Java que enlazas data de 1996, mucho antes de que se introdujeran los genéricos.
Para mayor discusión, vea Are C # y Java Grammars LALR (x)?
Solía pensar que C ++ era el "extraño" con todas las ambigüedades con <
y >
, pero después de intentar implementar un analizador, creo que encontré un ejemplo que rompe casi todos los idiomas que usan <
y >
para los tipos genéricos:
f(g<h, i>(j));
Esto podría interpretarse sintácticamente como una llamada al método genérico ( g
) o podría interpretarse como que da los resultados de dos comparaciones.
¿Cómo pueden estos lenguajes (especialmente Java, que pensé que se suponía que era LALR (1) -parsable? ) Esquivar esta ambigüedad sintáctica?
Simplemente no puedo imaginar ninguna forma no-hacky / sin contexto de lidiar con esto, y estoy desconcertado por cómo cualquier lenguaje puede estar libre de contexto, y mucho menos LALR (1) -parsable ...
(¡Vale la pena señalar que incluso un analizador de GLR no puede devolver un único análisis sintáctico para esta afirmación sin contexto!)
una llamada a un método genérico en Java sería <h, i> g (j) por lo que no hay ambigüedad :)