示例#1
0
文件: primary.c 项目: beretta42/FUZIX
int primary(LVALUE *lval) {
    char    sname[NAMESIZE];
    int     num[1], k, symbol_table_idx, offset, reg;
    SYMBOL *symbol;

    lval->ptr_type = 0;  // clear pointer/array type
    lval->tagsym = 0;
    if (match ("(")) {
        k = hier1 (lval);
        needbrack (")");
        return (k);
    }
    if (amatch("sizeof", 6)) {
        needbrack("(");
        gen_immediate();
        if (amatch("int", 3)) output_number(INTSIZE);
        else if (amatch("char", 4)) output_number(1);
        else if (symname(sname)) {
            if (((symbol_table_idx = find_locale(sname)) > -1) ||
                ((symbol_table_idx = find_global(sname)) > -1)) {
                symbol = &symbol_table[symbol_table_idx];
                if (symbol->storage == LSTATIC)
                    error("sizeof local static");
                offset = symbol->offset;
                if ((symbol->type & CINT) ||
                    (symbol->identity == POINTER))
                    offset *= INTSIZE;
                else if (symbol->type == STRUCT)
                    offset *= tag_table[symbol->tagidx].size;
                output_number(offset);
            } else {
                error("sizeof undeclared variable");
                output_number(0);
            }
        } else {
            error("sizeof only on type or variable");
        }
        needbrack(")");
        newline();
        lval->symbol = 0;
        lval->indirect = 0;
        return(0);
    }
    if (symname (sname)) {
        if ((symbol_table_idx = find_locale(sname)) > -1) {
            symbol = &symbol_table[symbol_table_idx];
            reg = gen_get_locale(symbol);
            lval->symbol = symbol;
            lval->indirect = symbol->type;
            if (symbol->type == STRUCT) {
                lval->tagsym = &tag_table[symbol->tagidx];
            }
            if (symbol->identity == ARRAY ||
                (symbol->identity == VARIABLE && symbol->type == STRUCT)) {
                lval->ptr_type = symbol->type;
                return reg;
            }
            if (symbol->identity == POINTER) {
                lval->indirect = CINT;
                lval->ptr_type = symbol->type;
            }
            return FETCH | reg;
        }
        if ((symbol_table_idx = find_global(sname)) > -1) {
            symbol = &symbol_table[symbol_table_idx];
            if (symbol->identity != FUNCTION) {
                lval->symbol = symbol;
                lval->indirect = 0;
                if (symbol->type == STRUCT) {
                    lval->tagsym = &tag_table[symbol->tagidx];
                }
                if (symbol->identity != ARRAY &&
                    (symbol->identity != VARIABLE || symbol->type != STRUCT)) {
                    if (symbol->identity == POINTER) {
                        lval->ptr_type = symbol->type;
                    }
                    return FETCH | HL_REG;
                }
                gen_immediate();
                output_string(symbol->name);
                newline();
                lval->indirect = symbol->type;
                lval->ptr_type = symbol->type;
                return 0;
            }
        }
        blanks();
        if (ch() != '(')
            error("undeclared variable");
        symbol_table_idx = add_global(sname, FUNCTION, CINT, 0, PUBLIC);
        symbol = &symbol_table[symbol_table_idx];
        lval->symbol = symbol;
        lval->indirect = 0;
        return 0;
    }
    lval->symbol = 0;
    lval->indirect = 0;
    if (constant(num))
        return 0;
    else {
        error("invalid expression");
        gen_immediate();
        output_number(0);
        newline();
        junk();
        return 0;
    }
}
示例#2
0
primary (lvalue_t *lval)
{
        char    sname[NAMESIZE];
        int     num[1], k, symbol_table_idx, offset, reg;
        symbol_t *symbol;

        lval->ptr_type = 0;  /* clear pointer/array type */
        if (match ("(")) {
                k = hier1 (lval);
                needbrack (")");
                return (k);
        }
        if (amatch("sizeof", 6)) {
                needbrack("(");
                gen_immediate_c();
                if (amatch("int", 3)) output_number(INTSIZE);
                else if (amatch("char", 4)) output_number(1);
                else if (symname(sname)) {
                        if ((symbol_table_idx = findloc(sname)) ||
                                (symbol_table_idx = findglb(sname))) {
                                symbol = &symbol_table[symbol_table_idx];
                                if (symbol->storage == LSTATIC)
                                        error("sizeof local static");
                                offset = symbol->count;
                                if ((symbol->type & CINT) ||
                                        (symbol->identity == POINTER))
                                        offset *= INTSIZE;
                                output_number(offset);
                        } else {
                                error("sizeof undeclared variable");
                                output_number(0);
                        }
                } else {
                        error("sizeof only on simple type or variable");
                }
                needbrack(")");
                newline();
                lval->symbol = 0;
                lval->indirect = 0;
                return(0);
        }
        if (symname (sname)) {
                if (symbol_table_idx = findloc (sname)) {
                        symbol = &symbol_table[symbol_table_idx];
                        reg = gen_get_location (symbol);
                        lval->symbol = symbol;
                        lval->indirect =  symbol->type;
                        if (symbol->identity == ARRAY) {
                                //lval->ptr_type = symbol->type;
                                lval->ptr_type = 0;
                                return 0;
                        }
                        if (symbol->identity == POINTER) {
                                lval->indirect = UINT;
                                lval->ptr_type = symbol->type;
                        }
                        return reg;
                }
                if (symbol_table_idx = findglb (sname)) {
                        symbol = &symbol_table[symbol_table_idx];
                        lval->symbol = symbol;
                        switch (symbol->identity) {
                        case ARRAY:
                                gen_immediate_a ();
                                output_string (symbol->name);
                                newline ();
                                /* Fall through */
                        case FUNCTION:
                                lval->indirect = lval->ptr_type = symbol_table[symbol_table_idx].type;
                                lval->ptr_type = 0;
                                return 0;
                        default:
                                lval->indirect = 0;
                                if (symbol->identity == POINTER) {
                                        lval->ptr_type = symbol->type;
                                }
                                return 1;
                        }
                }
                blanks ();
                if (ch() != '(')
                        error("undeclared variable");
                symbol_table_idx = add_global (sname, FUNCTION, CINT, 0, PUBLIC, 1);
                symbol = &symbol_table[symbol_table_idx];
                lval->symbol = symbol;
                lval->indirect = 0;
                return 0;
        }
        if (constant (num)) {
                lval->symbol = 0;
                lval->indirect = 0;
                return 0;
        }
        error ("invalid expression");
        gen_immediate_c ();
        output_number(0);
        newline ();
        junk ();
        return 0;
}