Как Java, С++, С# и т.д. Обойти эту конкретную синтаксическую двусмысленность с помощью <и>?

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

f(g<h, i="">(j));
</h,>

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

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

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

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

2 ответа

общий вызов метода в java будет < h, я> g (j), поэтому нет никакой двусмысленности:)


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

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

Для дальнейшего обсуждения см. Являются ли CAL и Java Grammars LALR (x)?

licensed under cc by-sa 3.0 with attribution.