Простое выражение типа
(x) - y
интерпретируется по-разному в зависимости от того, является ли x
именем типа или нет. Если x
не является именем типа, (x) - y
просто вычитает y
из x
. Но если x
является именем типа, (x) - y
вычисляет отрицательное значение y
и приводит результирующее значение к типу x
.
В типичном компиляторе C или C ++ вопрос о том, является ли x
типом или нет, отвечает, потому что синтаксический анализатор передает такую информацию лексеру, как только он обрабатывает объявление typedef или struct. (Я думаю, что такое требуемое нарушение уровней было самой противной частью дизайна C.)
Но в Java x
может быть не определено до тех пор, пока не будет найдено в исходном коде. Как компилятор Java устраняет неоднозначность такого выражения?
Понятно, что компилятору Java требуется несколько проходов, поскольку Java не требует объявления перед использованием. Но это, кажется, подразумевает, что первый проход должен выполнить очень небрежную работу по синтаксическому анализу выражений, а затем на более позднем этапе выполнить другой, более точный анализ выражений. Это кажется расточительным.
Есть ли лучший способ?