11

一个简单的表达式,如

(x) - y

根据是否x是类型名称,解释不同。如果x不是类型名称,(x) - y只需yx. 但是 ifx是一个类型名称,(x) - y计算负数y并将结果值转换为 type x

在典型的 C 或 C++ 编译器中,是否x是类型的问题是可以回答的,因为解析器在处理 typedef 或 struct 声明后立即将此类信息传达给词法分析器。(我认为这种要求违反级别是 C 设计中最讨厌的部分。)

但是在 Java 中,x可能要到源代码的后面才能定义。Java 编译器如何消除这种表达式的歧义?

很明显,Java 编译器需要多次传递,因为 Java 不需要在使用前声明。但这似乎意味着第一遍必须在解析表达式上做一个非常草率的工作,然后在后面的一遍中做另一个更准确的表达式解析。这似乎很浪费。

有没有更好的办法?

4

2 回答 2

8

我想我已经找到了令我满意的解决方案。感谢 mmyers,我意识到我需要检查类型转换语法的正式规范。

歧义是由+-元和二元运算符引起的。Java通过这个语法解决了这个问题:

CastExpression:
        ( PrimitiveType Dimsopt ) UnaryExpression
        ( ReferenceType ) UnaryExpressionNotPlusMinus

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

因此,'+'并且'-'在强制转换之后立即被明确禁止,')'除非强制转换使用原始类型——编译器先验地知道这些类型。

于 2008-12-30T18:22:34.190 回答
2

我刚刚测试了它,这段代码:

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

给出编译错误:

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

在 -y 周围加上括号使它编译得很好。所以显然Java通过简单地不允许在语法中解决这个问题(如果这是正确的术语;我不是编译器专家)。

于 2008-12-30T17:32:41.763 回答