From b3e2b201ea549e7e44110b0e0d366a4e34ed1914 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Wed, 14 Nov 2007 18:27:28 +0000 Subject: [PATCH] fix left-right, right-left association, make sure global variable initialisations have correct mode, fix ast for printing [r18395] --- ast.c | 6 ++-- ast2firm.c | 2 ++ parser.c | 98 +++++++++++++++++++++++++++--------------------------- 3 files changed, 55 insertions(+), 51 deletions(-) diff --git a/ast.c b/ast.c index 93ba57f..8c3c54b 100644 --- a/ast.c +++ b/ast.c @@ -414,8 +414,10 @@ static void print_for_statement(const for_statement_t *statement) panic("multiple declarations in for statement not supported yet"); } fputc(' ', out); - } else if(statement->initialisation) { - print_expression(statement->initialisation); + } else { + if(statement->initialisation) { + print_expression(statement->initialisation); + } fputs("; ", out); } if(statement->condition != NULL) { diff --git a/ast2firm.c b/ast2firm.c index 826985d..999e75a 100644 --- a/ast2firm.c +++ b/ast2firm.c @@ -1550,6 +1550,8 @@ static void create_initializer(declaration_t *declaration) set_value(declaration->v.value_number, init_node); } else { ir_entity *entity = declaration->v.entity; + ir_mode *mode = get_ir_mode(declaration->type); + init_node = create_conv(NULL, init_node, mode); set_entity_variability(entity, variability_initialized); set_atomic_ent_value(entity, init_node); diff --git a/parser.c b/parser.c index 31fd8d2..43b4766 100644 --- a/parser.c +++ b/parser.c @@ -2804,70 +2804,70 @@ static void semantic_comma(binary_expression_t *expression) expression->expression.datatype = expression->right->datatype; } -#define CREATE_BINEXPR_PARSER(token_type, binexpression_type, sfunc) \ -static expression_t *parse_##binexpression_type(unsigned precedence, \ - expression_t *left) \ -{ \ - eat(token_type); \ - \ - expression_t *right = parse_sub_expression(precedence); \ - \ - binary_expression_t *binexpr \ - = allocate_ast_zero(sizeof(binexpr[0])); \ - binexpr->expression.type = EXPR_BINARY; \ - binexpr->type = binexpression_type; \ - binexpr->left = left; \ - binexpr->right = right; \ - sfunc(binexpr); \ - \ - return (expression_t*) binexpr; \ -} - -CREATE_BINEXPR_PARSER(',', BINEXPR_COMMA, semantic_comma) -CREATE_BINEXPR_PARSER('*', BINEXPR_MUL, semantic_binexpr_arithmetic) -CREATE_BINEXPR_PARSER('/', BINEXPR_DIV, semantic_binexpr_arithmetic) -CREATE_BINEXPR_PARSER('%', BINEXPR_MOD, semantic_binexpr_arithmetic) -CREATE_BINEXPR_PARSER('+', BINEXPR_ADD, semantic_add) -CREATE_BINEXPR_PARSER('-', BINEXPR_SUB, semantic_sub) -CREATE_BINEXPR_PARSER('<', BINEXPR_LESS, semantic_comparison) -CREATE_BINEXPR_PARSER('>', BINEXPR_GREATER, semantic_comparison) -CREATE_BINEXPR_PARSER('=', BINEXPR_ASSIGN, semantic_binexpr_assign) -CREATE_BINEXPR_PARSER(T_EQUALEQUAL, BINEXPR_EQUAL, semantic_comparison) +#define CREATE_BINEXPR_PARSER(token_type, binexpression_type, sfunc, lr) \ +static expression_t *parse_##binexpression_type(unsigned precedence, \ + expression_t *left) \ +{ \ + eat(token_type); \ + \ + expression_t *right = parse_sub_expression(precedence + lr); \ + \ + binary_expression_t *binexpr \ + = allocate_ast_zero(sizeof(binexpr[0])); \ + binexpr->expression.type = EXPR_BINARY; \ + binexpr->type = binexpression_type; \ + binexpr->left = left; \ + binexpr->right = right; \ + sfunc(binexpr); \ + \ + return (expression_t*) binexpr; \ +} + +CREATE_BINEXPR_PARSER(',', BINEXPR_COMMA, semantic_comma, 1) +CREATE_BINEXPR_PARSER('*', BINEXPR_MUL, semantic_binexpr_arithmetic, 1) +CREATE_BINEXPR_PARSER('/', BINEXPR_DIV, semantic_binexpr_arithmetic, 1) +CREATE_BINEXPR_PARSER('%', BINEXPR_MOD, semantic_binexpr_arithmetic, 1) +CREATE_BINEXPR_PARSER('+', BINEXPR_ADD, semantic_add, 1) +CREATE_BINEXPR_PARSER('-', BINEXPR_SUB, semantic_sub, 1) +CREATE_BINEXPR_PARSER('<', BINEXPR_LESS, semantic_comparison, 1) +CREATE_BINEXPR_PARSER('>', BINEXPR_GREATER, semantic_comparison, 1) +CREATE_BINEXPR_PARSER('=', BINEXPR_ASSIGN, semantic_binexpr_assign, 0) +CREATE_BINEXPR_PARSER(T_EQUALEQUAL, BINEXPR_EQUAL, semantic_comparison, 1) CREATE_BINEXPR_PARSER(T_EXCLAMATIONMARKEQUAL, BINEXPR_NOTEQUAL, - semantic_comparison) -CREATE_BINEXPR_PARSER(T_LESSEQUAL, BINEXPR_LESSEQUAL, semantic_comparison) + semantic_comparison, 1) +CREATE_BINEXPR_PARSER(T_LESSEQUAL, BINEXPR_LESSEQUAL, semantic_comparison, 1) CREATE_BINEXPR_PARSER(T_GREATEREQUAL, BINEXPR_GREATEREQUAL, - semantic_comparison) -CREATE_BINEXPR_PARSER('&', BINEXPR_BITWISE_AND, semantic_binexpr_arithmetic) -CREATE_BINEXPR_PARSER('|', BINEXPR_BITWISE_OR, semantic_binexpr_arithmetic) -CREATE_BINEXPR_PARSER('^', BINEXPR_BITWISE_XOR, semantic_binexpr_arithmetic) -CREATE_BINEXPR_PARSER(T_ANDAND, BINEXPR_LOGICAL_AND, semantic_logical_op) -CREATE_BINEXPR_PARSER(T_PIPEPIPE, BINEXPR_LOGICAL_OR, semantic_logical_op) + semantic_comparison, 1) +CREATE_BINEXPR_PARSER('&', BINEXPR_BITWISE_AND, semantic_binexpr_arithmetic, 1) +CREATE_BINEXPR_PARSER('|', BINEXPR_BITWISE_OR, semantic_binexpr_arithmetic, 1) +CREATE_BINEXPR_PARSER('^', BINEXPR_BITWISE_XOR, semantic_binexpr_arithmetic, 1) +CREATE_BINEXPR_PARSER(T_ANDAND, BINEXPR_LOGICAL_AND, semantic_logical_op, 1) +CREATE_BINEXPR_PARSER(T_PIPEPIPE, BINEXPR_LOGICAL_OR, semantic_logical_op, 1) /* TODO shift has a bit special semantic */ CREATE_BINEXPR_PARSER(T_LESSLESS, BINEXPR_SHIFTLEFT, - semantic_binexpr_arithmetic) + semantic_binexpr_arithmetic, 1) CREATE_BINEXPR_PARSER(T_GREATERGREATER, BINEXPR_SHIFTRIGHT, - semantic_binexpr_arithmetic) + semantic_binexpr_arithmetic, 1) CREATE_BINEXPR_PARSER(T_PLUSEQUAL, BINEXPR_ADD_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_MINUSEQUAL, BINEXPR_SUB_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_ASTERISKEQUAL, BINEXPR_MUL_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_SLASHEQUAL, BINEXPR_DIV_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_PERCENTEQUAL, BINEXPR_MOD_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_LESSLESSEQUAL, BINEXPR_SHIFTLEFT_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_GREATERGREATEREQUAL, BINEXPR_SHIFTRIGHT_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_ANDEQUAL, BINEXPR_BITWISE_AND_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_PIPEEQUAL, BINEXPR_BITWISE_OR_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) CREATE_BINEXPR_PARSER(T_CARETEQUAL, BINEXPR_BITWISE_XOR_ASSIGN, - semantic_arithmetic_assign) + semantic_arithmetic_assign, 0) static expression_t *parse_sub_expression(unsigned precedence) { -- 2.20.1