Java语法中表达式级的设计合理性
我目前正在研究Java7语法,并试图找出为什么会使用几种不同的表达式级别。显然,有一些设计决策是为了避免某些无效的构造。然而,在Java语法的文档中,我找不到这些决定Java语法中表达式级的设计合理性,java,parsing,grammar,Java,Parsing,Grammar,我目前正在研究Java7语法,并试图找出为什么会使用几种不同的表达式级别。显然,有一些设计决策是为了避免某些无效的构造。然而,在Java语法的文档中,我找不到这些决定 例如,考虑生产“ExpRels1REST:?表达式:ExpExtudi1)< /代码>。为什么“if部分”是表达式,而else部分是表达式1 这意味着以下Java代码不会在NetBeans中导致语法错误: String value = ""; String x = value.isEmpty() ? x = "empty" : "
例如,考虑生产<代码>“ExpRels1REST:?表达式:ExpExtudi1)< /代码>。为什么“if部分”是表达式,而else部分是表达式1
这意味着以下Java代码不会在NetBeans中导致语法错误:String value = "";
String x = value.isEmpty() ? x = "empty" : "no";
官方Java语法可在此处找到:
有关的表达产物:
Expression:
Expression1 [AssignmentOperator Expression1]
Expression1:
Expression2 [Expression1Rest]
Expression1Rest:
? Expression : Expression1
Expression2:
Expression3 [Expression2Rest]
Expression2Rest:
{ InfixOp Expression3 }
instanceof Type
Expression3:
PrefixOp Expression3
( (Expression | Type) ) Expression3
Primary { Selector } { PostfixOp }
是否有一些文档/研究论文解释了Java语法背后的决定?您发布的语法允许赋值运算符的左侧为条件表达式:
shouldSetFoo() ? foo : bar = 47;
因此,如果条件表达式的“else”分支本身可能是赋值表达式,那么它自然会导致歧义
此问题不会影响“then”分支,因为
?
和:
明确地抵消了该分支,从而避免了任何歧义。其基本原理可能是减少表达式的语法,并在一个规则中处理所有二进制运算符(而不是针对每个前验级别)。如果你只想验证语法,这可能会简化事情,但如果你要真正解释表达式,可能就没那么有用了(在这种情况下,第15章中的语法更有用)
第15章和第18章中的语法是否等效是另一个问题。(顺便说一句,我直到现在才意识到Java允许赋值运算符的左边是一个条件表达式。你每天都会学到一些新东西!)事实并非如此。语法可能允许解析这样一段代码,但它仍然不会被编译,因为条件表达式会生成一个值,Java不允许为值赋值。语法还允许
foo()=1代码>但这是同一个故事。@Holger:你说得对。要求左侧为“变量”,尽管似乎没有明确说明条件表达式的结果始终是“值”而不是“变量”,但这似乎是唯一合理的解读(因为“然后对选定的操作数表达式求值,并将结果值转换为由上述规则确定的条件表达式类型”)。在我看来,第15章和第18章中的语法在这一点上有所不同。我在这里询问了另一个(明显的)区别: