Jak zrobić Java, C++, C# itp. obejść tę konkretną wieloznaczność składniową za pomocą < and?

Kiedyś myślałem, że C++ jest tym "dziwnym" ze wszystkimi niejasnościami z < i >, ale po próbie zaimplementowania parsera myślę, że znalazłem przykład, który łamie prawie każdego dnia. język, który używa < i > dla typów rodzajowych:

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

To może być interpretowane składniowo albo jako wywołanie metody ogólnej (g), albo może być interpretowane jako dające f wyniki dwóch porównań.

Jak powstają takie języki (zwłaszcza Java, który miał być LALR (1) - parsable?) obejść tę dwuznaczność składniową?

Po prostu nie mogę sobie wyobrazić żadnego Nie-hakerskiego / wolnego od kontekstu sposobu radzenia sobie z tym i jestem zdumiony, jak każdy taki język może być wolny od kontekstu, nie mówiąc już o LALR(1) - parsownym...

(warto zauważyć, że nawet parser GLR nie może zwrócić ani jednego Parsa dla tej instrukcji bez kontekstu!!)

Author: Mehrdad, 2013-01-19

2 answers

Wywołanie metody generycznej w Javie byłoby g (j), więc nie ma dwuznaczności:)

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-19 16:25:06

Po prostu nie mogę sobie wyobrazić żadnego Nie-hakerskiego / wolnego od kontekstu sposobu radzenia sobie z tym i jestem zdumiony, jak każdy taki język może być wolny od kontekstu, nie mówiąc już o LALR(1) - parsownym...

Odpowiedź jest taka ,że nie są (przynajmniej nie Java i C++; niewiele wiem o C#). Gramatyka języka Java, którą łączysz, pochodzi z 1996 roku, na długo przed wprowadzeniem generyków.

Do dalszej dyskusji zobacz czy C# i Java są Gramatykami 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:17