gcc - yyparse (for_stmt)

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

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h