2008-12-30 25 views
11

简单表达式等Java编译器如何解析类型转换?

(x) - y 

取决于x是否是一种类型的名称或不被解释不同。如果x不是类型名称,则(x) - y仅从x减去y。但是,如果x是类型名称,则(x) - y计算y的负数,并将结果值转换为x

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

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

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

有没有更好的方法?

回答

8

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

模糊是由+-是一元和二元运算符造成的。这是众所周知的 - 除非投采用的是原始类型

CastExpression: 
     (PrimitiveType Dimsopt) UnaryExpression 
     (ReferenceType) UnaryExpressionNotPlusMinus 

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

所以,'+''-'明确立刻铸造的')'后不允许的:Java的解决了这个语法问题由编译器先验。

2

我只是测试它,而这个代码:

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

给出了一个编译错误:

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

把括号围绕-y使得它编译罚款。所以显然,Java通过简单地不允许它在语法中解决了这个问题(如果这是正确的术语;我不是编译器方面的专家)。

+0

我没有downvote,但如果不是double,那么你使用了double,编译器就会允许它,因为_operator -_可以应用于双打。我相信这是不赞成的。 – 2008-12-30 17:46:53

+0

自Java 1.5以来,您可以使用任何算术运算符与双打,浮动等(由于自动装箱)。正如我所说,添加圆括号使得它无错地编译。 – 2008-12-30 17:51:29