Beispiel #1
0
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;
}
Beispiel #2
0
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);
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;

}