diff options
Diffstat (limited to 'ecomp-c/ec.c')
-rw-r--r-- | ecomp-c/ec.c | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/ecomp-c/ec.c b/ecomp-c/ec.c index ac1632f..217c7e1 100644 --- a/ecomp-c/ec.c +++ b/ecomp-c/ec.c @@ -697,7 +697,7 @@ static void free_symbol( Symbol *sym ) free( sym ); } -static void delete_scope( Scope *scope ) +static void free_scope( Scope *scope ) { Symbol *sym, *next; Scope *next_scope; @@ -711,7 +711,7 @@ static void delete_scope( Scope *scope ) } next_scope = scope->parent; if( scope->parent != NULL ) { - delete_scope( scope->parent ); + free_scope( scope->parent ); } free( scope->name ); free( scope ); @@ -1105,10 +1105,6 @@ static void emit_expression_code( ExpressionNode *node, Scope *scope ) Emit( "push eax\n" ); } break; case S_lbracket: - if( !is_compatible_type( node->symbol->type->type, node->actual_type ) ) { - Abort( "Incompatible assignment of expression of type '%s' to variable '%s' of type '%s'", - node->actual_type->name, node->symbol->name, node->symbol->type->name ); - } emit_expression_code( node->left, scope ); EmitArrayDereference( node->symbol ); break; @@ -1159,28 +1155,30 @@ static ExpressionNode *parseFactor( Scope *scope ) } else { Abort( "Unhandled expression assignment from identifier with type '%s'", node->actual_type->name ); } + sym = getSym( ); } else if( symbol->class == SYMBOL_CLASS_VARIABLE ) { - node = create_expression_node( ); - node->type = EXPRESSION_NODE_TYPE_VAR; - node->symbol = symbol; - node->actual_type = symbol->type; + sym = getSym( ); + if( sym == S_lbracket ) { + Expect( S_lbracket ); + if( symbol->type->class != SYMBOL_CLASS_ARRAY_TYPE ) { + Abort( "Dereferencing non-array '%s'", symbol->name ); + } + node = create_expression_node( ); + node->type = EXPRESSION_NODE_TYPE_OP; + node->op = S_lbracket; + node->left = parseExpression( scope ); + node->symbol = symbol; + node->actual_type = symbol->type->type; + Expect( S_rbracket ); + } else { + node = create_expression_node( ); + node->type = EXPRESSION_NODE_TYPE_VAR; + node->symbol = symbol; + node->actual_type = symbol->type; + } } else { Abort( "'%s' is the name for a type and not a constant or variable as expected", ident ); } - sym = getSym( ); - if( sym == S_lbracket ) { - Expect( S_lbracket ); - if( symbol->type->class != SYMBOL_CLASS_ARRAY_TYPE ) { - Abort( "Dereferencing non-array '%s'", symbol->name ); - } - node = create_expression_node( ); - node->type = EXPRESSION_NODE_TYPE_OP; - node->op = S_lbracket; - node->left = parseExpression( scope ); - node->symbol = symbol; - node->actual_type = symbol->type->type; - Expect( S_rbracket ); - } } else if( sym == S_lparen ) { sym = getSym( ); node = parseExpression( scope ); @@ -1951,10 +1949,18 @@ static void reserve_initialize( Symbol *symbol ) i++; } Emit( "\n" ); - } else { + } else if( symbol->type->type == integer_type ) { + for( i = 0; i < symbol->type->dim; i++ ) { + Emit( "dd $0\n" ); + } + } else { + /* TODO: this can not work */ + Abort( "Unhandled generic array case" ); + /* for( i = 0; i < symbol->type->dim; i++ ) { reserve_initialize( symbol->type ); } + */ } break; @@ -1981,7 +1987,7 @@ static void epilogue( void ) static void deinit( void ) { - delete_scope( current_scope ); + free_scope( current_scope ); } int main( void ) |