Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java语法中表达式级的设计合理性_Java_Parsing_Grammar - Fatal编程技术网

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" : "

我目前正在研究Java7语法,并试图找出为什么会使用几种不同的表达式级别。显然,有一些设计决策是为了避免某些无效的构造。然而,在Java语法的文档中,我找不到这些决定

例如,考虑生产<代码>“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章中的语法在这一点上有所不同。我在这里询问了另一个(明显的)区别: