前回の 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 が欲しい。