예제 #1
0
stmt_t parse_stmt(tokenizer_t t){
    struct token tok = cur_tok(t);
    switch(tok.kind){
        case TOK_SEMICOLON:
            return parse_stmt_empty(t);
        break;

        case TOK_CONTINUE:
            return parse_stmt_continue(t);
        break;
        case TOK_BREAK:
            return parse_stmt_break(t);
        break;
        case TOK_RETURN:
            return parse_stmt_return(t);
        break;
        case TOK_IF:
            return parse_stmt_if(t);
        break;
        case TOK_WHILE:
            return parse_stmt_while(t);
        break;

        case TOK_LBRACE:
            return parse_stmt_compound(t);
        break;

        default:
            return parse_stmt_expr(t);
        break;
    }
    return NULL;
}
예제 #2
0
파일: parser.c 프로젝트: nukamu/c0_compiler
stmt_t parse_stmt(tokenizer_t t) {
    char * filename = cur_tok(t).filename;
    int line = cur_tok(t).line_num;
    expr_t e;
    switch(cur_tok(t).kind) {
    case TOK_SEMICOLON:
        eat_it(t, TOK_SEMICOLON);
        return mk_stmt_empty(filename, line);
        break;
    case TOK_CONTINUE:
        eat_it(t, TOK_CONTINUE);
        eat_it(t, TOK_SEMICOLON);
        return mk_stmt_continue(filename, line);
        break;
    case TOK_BREAK:
        eat_it(t, TOK_BREAK);
        eat_it(t, TOK_SEMICOLON);
        return mk_stmt_break(filename, line);
        break;
    case TOK_RETURN:
        eat_it(t, TOK_RETURN);
        e = parse_expr(t);
        eat_it(t, TOK_SEMICOLON);
        return mk_stmt_return(filename, line, e);
        break;
    case TOK_IF:
        return parse_stmt_if(t);
        break;
    case TOK_WHILE:
        return parse_stmt_while(t);
        break;
    case TOK_LBRACE:
        return parse_comp_stmt(t);
        break;
    default:
        e = parse_expr(t);
        eat_it(t, TOK_SEMICOLON);
        return mk_stmt_expr(filename, line, e);
        break;
    }
}