Lexer:
- proper support of preprocessor
-- parse float numbers
- octal&hex escape sequences
- wide string constants
- proper handling of different file encodings
implementations...
- fix semantic to ignore type qualifiers (const double is the same as double)
- label: declaration; is no valid C99 but we parse it anyway
+- designator support for initializers
+- support string literals in intializers
ast2firm:
- output source file positions for panics...
-- correctly handle pointer ++, --
+- create strict convs where necessary
Coole Warnungen:
bool is_defined;
statement_t *statement;
initializer_t *initializer;
+ expression_t *enum_value;
} init;
context_t context;
context_t *parent_context;
if(token.type == '=') {
next_token();
- entry->init.initializer = parse_initializer(type_int);
+ entry->init.enum_value = parse_constant_expression();
}
record_declaration(entry);
declaration_t *declaration = record_declaration(ndeclaration);
- type_t *type = declaration->type;
+ type_t *orig_type = declaration->type;
+ type_t *type = skip_typeref(orig_type);
if(type->type != TYPE_FUNCTION && declaration->is_inline) {
parser_print_warning_prefix_pos(declaration->source_position);
fprintf(stderr, "variable '%s' declared 'inline'\n",
parser_error_multiple_definition(declaration, ndeclaration);
}
- ndeclaration->init.initializer
- = parse_initializer(declaration->type);
+ initializer_t *initializer = parse_initializer(type);
+
+ if(type->type == TYPE_ARRAY && initializer != NULL) {
+ assert(initializer->type == INITIALIZER_LIST);
+
+ initializer_list_t *list = (initializer_list_t*) initializer;
+ array_type_t *array_type = (array_type_t*) type;
+
+ if(array_type->size == NULL) {
+ const_t *cnst = allocate_ast_zero(sizeof(cnst[0]));
+
+ cnst->expression.type = EXPR_CONST;
+ cnst->expression.datatype = type_size_t;
+ cnst->v.int_value = list->len;
+
+ array_type->size = (expression_t*) cnst;
+ }
+ }
+
+
+ ndeclaration->init.initializer = initializer;
} else if(token.type == '{') {
- if(declaration->type->type != TYPE_FUNCTION) {
+ if(type->type != TYPE_FUNCTION) {
parser_print_error_prefix();
- fprintf(stderr, "Declarator ");
- print_type_ext(declaration->type, declaration->symbol, NULL);
- fprintf(stderr, " has a body but is not a function type.\n");
+ fprintf(stderr, "declarator '");
+ print_type_ext(orig_type, declaration->symbol, NULL);
+ fprintf(stderr, "' has a body but is not a function type.\n");
eat_block();
continue;
}
fprintf(out, "%s", entry->symbol->string);
if(entry->init.initializer != NULL) {
fprintf(out, " = ");
- print_initializer(entry->init.initializer);
+ print_expression(entry->init.enum_value);
}
fprintf(out, ",\n");
}
}
}
-static void write_initializer(const initializer_t *initializer)
-{
- if(initializer->type != INITIALIZER_VALUE) {
- panic("list initializers not supported yet");
- }
-
- //write_expression(initializer->v.value);
-}
-
static void write_enum(const symbol_t *symbol, const enum_type_t *type)
{
fprintf(out, "enum %s:\n", symbol->string);
fprintf(out, "\t%s", entry->symbol->string);
if(entry->init.initializer != NULL) {
fprintf(out, " <- ");
- write_initializer(entry->init.initializer);
+ write_expression(entry->init.enum_value);
}
fputc('\n', out);
}
/* write global variables */
declaration = unit->context.declarations;
for( ; declaration != NULL; declaration = declaration->next) {
+ if(declaration->namespc != NAMESPACE_NORMAL)
+ continue;
if(declaration->storage_class == STORAGE_CLASS_TYPEDEF
|| declaration->storage_class == STORAGE_CLASS_ENUM_ENTRY)
continue;
/* write functions */
declaration = unit->context.declarations;
for( ; declaration != NULL; declaration = declaration->next) {
+ if(declaration->namespc != NAMESPACE_NORMAL)
+ continue;
if(declaration->storage_class == STORAGE_CLASS_TYPEDEF
|| declaration->storage_class == STORAGE_CLASS_ENUM_ENTRY)
continue;