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!!)

Author: Mehrdad, 2013-01-19

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