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