Как компилятор Java анализирует типы типов? - PullRequest
11 голосов
/ 30 декабря 2008

Простое выражение типа

(x) - y

интерпретируется по-разному в зависимости от того, является ли x именем типа или нет. Если x не является именем типа, (x) - y просто вычитает y из x. Но если x является именем типа, (x) - y вычисляет отрицательное значение y и приводит результирующее значение к типу x.

В типичном компиляторе C или C ++ вопрос о том, является ли x типом или нет, отвечает, потому что синтаксический анализатор передает такую ​​информацию лексеру, как только он обрабатывает объявление typedef или struct. (Я думаю, что такое требуемое нарушение уровней было самой противной частью дизайна C.)

Но в Java x может быть не определено до тех пор, пока не будет найдено в исходном коде. Как компилятор Java устраняет неоднозначность такого выражения?

Понятно, что компилятору Java требуется несколько проходов, поскольку Java не требует объявления перед использованием. Но это, кажется, подразумевает, что первый проход должен выполнить очень небрежную работу по синтаксическому анализу выражений, а затем на более позднем этапе выполнить другой, более точный анализ выражений. Это кажется расточительным.

Есть ли лучший способ?

Ответы [ 2 ]

8 голосов
/ 30 декабря 2008

Мне кажется, я нашел решение, которое меня устраивает. Благодаря mmyers я понял, что мне нужно проверить формальную спецификацию синтаксиса для приведения типов.

Неоднозначность вызвана тем, что + и - являются унарными и бинарными операторами. Java решает проблему с помощью этой грамматики:

CastExpression:
        ( PrimitiveType Dimsopt ) UnaryExpression
        ( ReferenceType ) UnaryExpressionNotPlusMinus

(см. http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#238146)

Итак, '+' и '-' явно запрещены сразу после ')' приведения, если приведение не использует примитивный тип, который априори известен компилятору.

2 голосов
/ 30 декабря 2008

Я только что проверил это, и этот код:

Double y = new Double(0.1);
System.out.println((Double)-y);

выдает ошибку компиляции:

operator - cannot be applied to Double, java.lang.Double.

Если поставить скобки вокруг -y, он будет хорошо компилироваться. Очевидно, что Java решает эту проблему, просто не допуская ее в грамматике (если это правильная терминология; я не специалист по компиляторам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...