Как Java, C++, C# и т. Д. Могут обойти эту особую синтаксическую неоднозначность с помощью <и>?
Раньше я думал, что C++ был "странным" со всеми неясностями с <
а также >
, но после попытки реализовать синтаксический анализатор, я думаю, я нашел пример, который ломает почти каждый язык, который использует <
а также >
для универсальных типов:
f(g<h, i>(j));
Это может быть синтаксически либо интерпретировано как общий вызов метода (g
), или это может быть интерпретировано как предоставление f
результаты двух сравнений.
Как такие языки (особенно Java, которые, как я думал, должен был быть LALR(1)-парсируемым?), Могут обойти эту синтаксическую неоднозначность?
Я просто не могу представить какой-либо нехакерский / контекстно-свободный способ справиться с этим, и я озадачен тем, как любой такой язык может быть контекстно-свободным, не говоря уже о LALR(1)-парсируемом...
(Стоит отметить, что даже анализатор GLR не может вернуть ни одного синтаксического анализа для этого оператора без контекста!!)
2 ответа
Общий вызов метода в Java будет
Я просто не могу представить какой-либо нехакерский / контекстно-свободный способ справиться с этим, и я озадачен тем, как любой такой язык может быть контекстно-свободным, не говоря уже о LALR(1)-парсируемом...
Ответ заключается в том, что это не так (по крайней мере, не Java и C++; я очень мало знаю о C#). Грамматика Java, на которую вы ссылаетесь, датируется 1996 годом, задолго до появления дженериков.
Для дальнейшего обсуждения, см. Ли C# и грамматики Java LALR(x)?