一个简单的表达式
(x) - y
根据是否x
是类型名称进行不同的解释.如果x
不是一个类型的名字,(x) - y
只是减去y
从x
.但如果x
是类型名称,则(x) - y
计算负数y
并将结果值转换为类型x
.
在典型的C或C++编译器中,是否x
是类型的问题是可回答的,因为解析器在处理了typedef或struct声明后立即将这些信息传递给词法分析器.(我认为这种必要的违反水平是C设计中最糟糕的部分.)
但是在Java中,x
可能直到后面的源代码才定义.Java编译器如何消除这种表达式的歧义?
很明显,Java编译器需要多次传递,因为Java不需要在使用前声明.但这似乎意味着第一遍必须在解析表达式时做一个非常草率的工作,然后在稍后的传递中做另一个更准确的表达式解析.这似乎很浪费.
有没有更好的办法?
我想我找到了满足我的解决方案.感谢mmyers,我意识到我需要检查类型转换语法的正式规范.
歧义是造成+
与-
既是一元和二元运算.Java通过这种语法解决了这个问题:
CastExpression: ( PrimitiveType Dimsopt ) UnaryExpression ( ReferenceType ) UnaryExpressionNotPlusMinus
(见http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#238146)
所以,'+'
和'-'
明确后,立即禁止')'
其是由编译器先验已知-铸造的,除非投采用的是原始类型.