Cómo hacer Java, C++, C#, etc. evite esta ambigüedad sintáctica particular con

Solía pensar que C++ era el "raro" con todas las ambigüedades con < y >, pero después de intentar implementar un analizador, creo que encontré un ejemplo que rompe casi cada lenguaje que usa < y > para tipos genéricos:

f(g<h, i>(j));

Esto podría interpretarse sintácticamente como una llamada a un método genérico (g), o podría interpretarse como dar f los resultados de dos comparaciones.

¿Cómo funcionan estos lenguajes (especialmente Java, que pensé que se suponía que era LALR(1)-parsable?) ¿evitar esta ambigüedad sintáctica?

Simplemente no puedo imaginar una forma no hacky/libre de contexto de lidiar con esto, y estoy desconcertado de cómo cualquier lenguaje puede ser libre de contexto, y mucho menos LALR(1)-parsable...

(¡Vale la pena señalar que incluso un analizador GLR no puede devolver un solo análisis para esta declaración sin contexto!!)

Author: Mehrdad, 2013-01-19

2 answers

Una llamada a un método genérico en java sería g (j) por lo que no hay ambigüedad:)

 3
Author: Zubzub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-19 16:25:06

Simplemente no puedo imaginar una forma no hacky/libre de contexto de lidiar con esto, y estoy desconcertado de cómo cualquier lenguaje puede ser 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 Java a la que enlazas se remonta a 1996, mucho antes de que se introdujeran los genéricos.

Para mayor discusión, ver ¿Son las gramáticas de C# y Java LALR(x)?

 2
Author: NPE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:00:17