Как Java, C++, C# и т. Д. Могут обойти эту особую синтаксическую неоднозначность с помощью <и>?

Раньше я думал, что C++ был "странным" со всеми неясностями с < а также >, но после попытки реализовать синтаксический анализатор, я думаю, я нашел пример, который ломает почти каждый язык, который использует < а также > для универсальных типов:

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

Это может быть синтаксически либо интерпретировано как общий вызов метода (g), или это может быть интерпретировано как предоставление f результаты двух сравнений.

Как такие языки (особенно Java, которые, как я думал, должен был быть LALR(1)-парсируемым?), Могут обойти эту синтаксическую неоднозначность?

Я просто не могу представить какой-либо нехакерский / контекстно-свободный способ справиться с этим, и я озадачен тем, как любой такой язык может быть контекстно-свободным, не говоря уже о LALR(1)-парсируемом...

(Стоит отметить, что даже анализатор GLR не может вернуть ни одного синтаксического анализа для этого оператора без контекста!!)

2 ответа

Решение

Общий вызов метода в Java будет g(j), поэтому нет никакой двусмысленности:)

Я просто не могу представить какой-либо нехакерский / контекстно-свободный способ справиться с этим, и я озадачен тем, как любой такой язык может быть контекстно-свободным, не говоря уже о LALR(1)-парсируемом...

Ответ заключается в том, что это не так (по крайней мере, не Java и C++; я очень мало знаю о C#). Грамматика Java, на которую вы ссылаетесь, датируется 1996 годом, задолго до появления дженериков.

Для дальнейшего обсуждения, см. Ли C# и грамматики Java LALR(x)?

Другие вопросы по тегам