前回の stmt は雑に飛ばしたのだが、少しやってみたいことがあるのでもう少し stmt に留まる。今回は for 文。
/* for_stmt.c */
int main() {
int i;
char msg[] = "hello\n";
for (i = 0; i < sizeof(msg); i++) {
printf("%c", msg[i]);
}
}
このダンプでは、 compstmt は二つ出力される。 for 文の中身のスコープと、 main の中身のスコープだ。 for_stmt まわりだけを示す。
@11 compound_stmt line: 5 body: @24 next: @25
@24 scope_stmt line: 5 begn null
clnp next: @37
@25 scope_stmt line: 8 end clnp
@37 for_stmt line: 5 init: @46 cond: @47
expr: @48 body: @49 next: @50
@46 expr_stmt line: 5 expr: @56
@47 le_expr type: @7 op 0: @57 op 1: @58
@48 postincrement_expr type: @7 op 0: @4 op 1: @59
@49 compound_stmt line: 5 body: @60
@50 scope_stmt line: 7 end null
@60 scope_stmt line: 5 begn null
clnp next: @71
@71 compound_stmt line: 5 body: @78 next: @79
clnp
@78 scope_stmt line: 6 begn clnp
next: @89
@79 scope_stmt line: 7 end null
clnp
@89 expr_stmt line: 6 expr: @98 next: @99
@99 scope_stmt line: 7 end clnp
スコープに二度入っていてわかりにくいが、
@11 => @25
=> @24 => @37 (for) => @50
(init) => @46 (i=0)
(cond) => @47 (iという木構造になっているようだ。 for (init; cond; expr) body のうち、 init と body だけが stmt だが理由は保留 (@@@)。なんとなく理由はわからんでもないが。 ANSI X3.159-1989 が欲しい。