var_decl_list_t parse_para_list(tokenizer_t t) { var_decl_list_t param = mk_var_decl_list(); if(cur_tok(t).kind == TOK_RPAREN) { } else if(cur_tok(t).kind == TOK_INT) { var_decl_t x = parse_para(t); var_decl_list_add(param, x); while(cur_tok(t).kind == TOK_COMMA) { eat_it(t, TOK_COMMA); x = parse_para(t); var_decl_list_add(param, x); } } return param; }
fun_def_t parse_fun_def(tokenizer_t t) { // 型宣言を食べる (int 以外に増やすなら変える) eat_it(t, TOK_INT); struct token tok = cur_tok(t); char *f = strdup(tok.name); eat_it(t, TOK_ID); // { eat_it(t, TOK_LPAREN); var_decl_list_t params = mk_var_decl_list(t); while(1){ if(cur_tok(t).kind == TOK_RPAREN){ break; }else{ var_decl_list_add(params, parse_param(t)); if(cur_tok(t).kind == TOK_COMMA){ eat_it(t, TOK_COMMA); continue; }else{ break; } } } eat_it(t, TOK_RPAREN); // } stmt_t body = parse_stmt_compound(t); return mk_fun_def(t->filename, t->line, f, params, body); }
var_decl_list_t parse_var_decl(tokenizer_t t) { var_decl_list_t d = mk_var_decl_list(); char * filename = cur_tok(t).filename; int line = cur_tok(t).line_num; while(cur_tok(t).kind == TOK_INT) { parse_type_expr(t); char * f =(char *)malloc(sizeof(char) * 100); strcpy(f, parse_identifier(t)); var_decl_t x = mk_var_decl(filename, line, f); var_decl_list_add(d, x); eat_it(t, TOK_SEMICOLON); } return d; }
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; }