我想我理解这一部分: "有些陈述包含其他陈述作为其结构的一部分;这些其他陈述是陈述的替代。"
资料来源:(第二段) http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html
如果我错了,请纠正我:这是指方法调用,其中包含多个语句。这也是指在初始化时执行某些操作(如计算或连接字符串)等操作。
我遇到麻烦的是: "我们说语句S立即包含语句U如果没有语句T不同于S和U使得S包含T而T包含U"
我不会撒谎,他们在这里完全失去了我。我无法在脑海中想象这一点,或者在纸上写下来。措辞让我完全糊涂了。
有人可以解释这是一种比较容易理解的时尚吗?
答案 0 :(得分:2)
如果你有例如
if (Expression1)
while (Expression2)
Statement1
然后IfThenStatement
立即包含WhileStatement
。它还包含Statement1
,但不会立即包含Statement1
。
参考JLS规范中使用的符号S是包含IfThenStatement
T的WhileStatement
,而Statement1
T又包含{{1}} U.因此S 不会立即< / em>包含U。
答案 1 :(得分:1)
我认为这是指“彼此之间有多接近”。
我想你可以将这些陈述想象成一棵树。 “整体”语句是根,而子语句是子语句。什么“S立即包含U”可以粗略地理解为语句树中的“S是U的直接父” - 也就是说,存在从S到U的直接链接,中间没有节点。
这就是那句话所说的。 “没有与S和U不同的陈述T,使得S包含T而T包含U” - &gt; “没有节点T与S和U不同,因此U的父级是T而T的父级是S”
如果你知道AST是如何工作的,我想这可能更有意义......
另外,关于第一部分:
句子“有些语句包含其他语句作为其结构的一部分;其他语句是语句的子语句”并不专门引用方法调用;实际上,所有三种类型的语句(表达式,声明和控制流)都可能有子语句。您可以在声明(例如初始化)时使用表达式。您可以在控制流语句中声明(例如for
循环)。等等。
例如,if-then语句定义如下:
IfThenStatement:
if
(
表达式 )
声明
在这种情况下,你有一个if-then语句的子语句而没有看到方法调用。
但是,除了你提到的其他情况之外,你是正确的,方法调用是你可以拥有子语句的地方之一。