stmt_t parse_comp_stmt(tokenizer_t t) { char * filename = cur_tok(t).filename; int line = cur_tok(t).line_num; eat_it(t, TOK_LBRACE); stmt_list_t c = mk_stmt_list(); var_decl_list_t d = parse_var_decl(t); stmt_t x; while(cur_tok(t).kind != TOK_RBRACE) { x = parse_stmt(t); stmt_list_add(c, x); } eat_it(t, TOK_RBRACE); return mk_stmt_compound(filename, line, d, c); }
stmt_t parse_stmt_compound(tokenizer_t t){ stmt_list_t list = mk_stmt_list(); var_decl_list_t decls = mk_var_decl_list(); eat_it(t, TOK_LBRACE); // printf("var_decl_list_add begin\n"); // printf("call: parse_stmt_compound\n"); while(1){ // 型宣言じゃなかったら修了 if(cur_tok(t).kind != TOK_INT){ break; }else{ // printf("var_decl_list_add\n"); var_decl_list_add(decls, parse_decl(t)); } } while(1){ if(cur_tok(t).kind != TOK_RBRACE){ // printf("stmt_list_add\n"); stmt_t s = parse_stmt(t); stmt_list_add(list, s); // printf("s->kind: %d\n", s->kind); }else{ // } でリスト終了 break; } } eat_it(t, TOK_RBRACE); stmt_t comp = mk_stmt_compound(t->filename, t->line, decls, list); return comp; }