Comment faire en Java, C++, C#, etc. contourner cette ambiguïté syntaxique particulière avec
Je pensais que C++ était le "bizarre" avec toutes les ambiguïtés avec <
et >
, mais après avoir essayé d'implémenter un analyseur, je pense avoir trouvé un exemple qui casse à peu près chaque langage qui utilise <
et >
pour les types génériques:
f(g<h, i>(j));
Cela pourrait être syntaxiquement interprété comme un appel de méthode générique (g
), ou il pourrait être interprété comme donnant f
les résultats de deux comparaisons.
Comment de tels langages (en particulier Java, que je pensais être censé être LALR(1)-parsable?) contourner cette ambiguïté syntaxique?
Je ne peux tout simplement pas imaginer une manière non hacky/sans contexte de gérer cela, et je suis perplexe sur la façon dont une telle langue peut être sans contexte, sans parler de LALR(1)-parsable...
(Il convient de noter que même un analyseur GLR ne peut pas renvoyer une seule analyse pour cette instruction sans contexte!!)
27
2 answers
Un appel de méthode générique en java serait g (j) donc il n'y a pas d'ambiguïté:)
3
Author: Zubzub, 2013-01-19 16:25:06
Je ne peux tout simplement pas imaginer une manière non hacky/sans contexte de gérer cela, et je suis perplexe sur la façon dont une telle langue peut être sans contexte, sans parler de LALR(1)-parsable...
La réponse est qu'ils ne le sont pas (du moins pas Java et C++; je sais très peu de choses sur C#). La grammaire Java que vous liez remonte à 1996, bien avant l'introduction des génériques.
Pour plus de discussion, voir Les grammaires C# et Java sont-elles LALR(x)?
2
Author: NPE, 2017-05-23 12:00:17
Je pensais que C++ était le "bizarre" avec toutes les ambiguïtés avec <
et >
, mais après avoir essayé d'implémenter un analyseur, je pense avoir trouvé un exemple qui casse à peu près chaque langage qui utilise <
et >
pour les types génériques:
f(g<h, i>(j));
Cela pourrait être syntaxiquement interprété comme un appel de méthode générique (g
), ou il pourrait être interprété comme donnant f
les résultats de deux comparaisons.
Comment de tels langages (en particulier Java, que je pensais être censé être LALR(1)-parsable?) contourner cette ambiguïté syntaxique?
Je ne peux tout simplement pas imaginer une manière non hacky/sans contexte de gérer cela, et je suis perplexe sur la façon dont une telle langue peut être sans contexte, sans parler de LALR(1)-parsable...
(Il convient de noter que même un analyseur GLR ne peut pas renvoyer une seule analyse pour cette instruction sans contexte!!)
2 answers
Un appel de méthode générique en java serait
Je ne peux tout simplement pas imaginer une manière non hacky/sans contexte de gérer cela, et je suis perplexe sur la façon dont une telle langue peut être sans contexte, sans parler de LALR(1)-parsable...
La réponse est qu'ils ne le sont pas (du moins pas Java et C++; je sais très peu de choses sur C#). La grammaire Java que vous liez remonte à 1996, bien avant l'introduction des génériques.
Pour plus de discussion, voir Les grammaires C# et Java sont-elles LALR(x)?