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!!)
27
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
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!!)
2 answers
Una llamada a un método genérico en java sería
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)?
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