F diff --git a/src/frontend/parse/.parse_expression.c.swp b/src/frontend/parse/.parse_expression.c.swp new file mode 100644B Binary files /dev/null and b/src/frontend/parse/.parse_expression.c.swp differF diff --git a/src/semantics/ast.c b/src/semantics/ast.c --- a/src/semantics/ast.c +++ b/src/semantics/ast.creturn ret;}+ struct AST_Binary_Expression* get_modulo_tree(struct AST_Expression *left,struct AST_Expression *right,struct Translation_Data *translation_data)+ {+ struct Type *hold_type;+ hold_type=extract_expresion_value_type(left,translation_data);+ if(!type_is_integer_type(hold_type))+ { push_translation_error("expected integer type in modulo operation",translation_data); return get_error_tree(get_binary_expression_tree(left,right,OP_REMAINDER)); }++ hold_type=extract_expresion_value_type(right,translation_data);+ if(!type_is_integer_type(hold_type))+ { push_translation_error("expected integer type in modulo operation",translation_data); return get_error_tree(get_binary_expression_tree(left,right,OP_REMAINDER)); }+ return get_binary_expression_after_conversion(left,right,OP_REMAINDER,translation_data);++ }+ struct AST_Binary_Expression* get_multiplicative_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data)+ {+ struct Type *hold_type;+ hold_type=extract_expresion_value_type(left,translation_data);+ if(!type_is_arithmetic(hold_type))+ { push_translation_error("expected arithmetic type in multiplicative operation",translation_data); return get_error_tree(get_binary_expression_tree(left,right,operation)); }++ hold_type=extract_expresion_value_type(right,translation_data);+ if(!type_is_arithmetic(hold_type))+ { push_translation_error("expected arithmetic type in multiplicative operation",translation_data); return get_error_tree(get_binary_expression_tree(left,right,OP_REMAINDER)); }+ return get_binary_expression_after_conversion(left,right,operation,translation_data);+ }+ struct AST_Binary_Expression* get_additive_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data)+ {+ struct Type *left_type;+ struct Type *right_type;++ left_type=extract_expresion_value_type(left,translation_data);+ right_type=extract_expresion_value_type(left,translation_data);++ if(!type_is_arithmetic(left_type))+ {+ if(left_type->specifier==TS_POINTER && type_is_integer_type(right_type))+ {+ return get_binary_expression_tree(left,right,get_expression_value_rvalue(get_temp_object(left_type)),OP_POINTER_ADDITION);+ }else+ {+ push_translation_error("expected arithmetic type in additive operation",translation_data);+ return get_error_tree(get_binary_expression_tree(left,right,operation));+ }+ }else if(!type_is_arithmetic(right_type))+ {+ if(right_type->specifier==TS_POINTER && type_is_integer_type(left_type))+ {+ return get_binary_expression_tree(right,left,get_expression_value_rvalue(get_temp_object(right_type)),OP_POINTER_ADDITION);+ }else+ {+ push_translation_error("expected arithmetic type in additive operation",translation_data);+ return get_error_tree(get_binary_expression_tree(left,right,operation));+ }+ }else+ {+ return get_binary_expression_after_conversion(left,right,operation,translation_data);+ }+ }+ struct AST_Binary_Expression* get_shift_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data)+ {+ struct Type *left_type;+ struct Type *right_type;++ left_type=extract_expresion_value_type(left,translation_data);+ right=extract_expresion_value_type(right,translation_data);++ if(!type_is_integer_type(left_type) || !type_is_integer_type(right_type))+ {+ push_translation_error("expected integer type in shift operation",translation_data);+ return get_error_tree(get_binary_expression_tree(left,right,operation));+ }+ left=get_promoted_expression(left,translation_data);+ right=get_promoted_expression(right,translation_data);++ left_type=extract_expresion_value_type(left,translation_data);+ right=extract_expresion_value_type(right,translation_data);++ return get_binary_expression_tree(left,right,get_expression_value_rvalue(get_temp_object(left_type)),operation);++ }+ struct AST_Binary_Expression* get_bitwise_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data)+ {+ struct Type *left_type;+ struct Type *right_type;++ left_type=extract_expresion_value_type(left,translation_data);+ right=extract_expresion_value_type(right,translation_data);++ if(!type_is_integer_type(left_type) || !type_is_integer_type(right_type))+ {+ push_translation_error("expected integer type in bitwise operation",translation_data);+ return get_error_tree(get_binary_expression_tree(left,right,operation));+ }+ return get_binary_expression_after_conversion(left,right,operation,translation_data);+ }++ /*TODO*/+ struct AST_Binary_Expression* get_equality_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data)+ {+ return get_binary_expression_tree(left,right,get_expression_value_rvalue(get_temp_object(get_type_insecure(TS_INT,TSIGN_SIGNED,TC_NONE,INT_SIZE,translation_data))),operation);++ }+ struct AST_Binary_Expression* get_logical_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data)+ {+ struct Type *left_type;+ struct Type *right_type;++ left_type=extract_expresion_value_type(left,translation_data);+ right=extract_expresion_value_type(right,translation_data);++ if(!type_is_scalar(left_type) || !type_is_scalar(right_type))+ {+ push_translation_error("expected scalar type in logical expression",translation_data);+ return get_error_tree(get_binary_expression_tree(left,right,operation));+ }+ return get_binary_expression_tree(left,right,get_expression_value_rvalue(get_temp_object(get_type_insecure(TS_INT,TSIGN_SIGNED,TC_NONE,INT_SIZE,translation_data))),operation);+ }++ /*TODO*/+ struct AST_Binary_Expression* get_assignment_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data)+ {+ struct+ if(left->value->type!=VALUE_LVALUE)+ {+ push_translation_error("expected lvalue in left operand of assignment expression",translation_data);+ return get_error_tree(get_binary_expression_tree(left,right,operation));+ }else+ {+ return get_binary_expression_tree(left,right,get_temp+ }+ }+struct AST_Binary_Expression* get_binary_expression_after_conversion(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type type,struct Translation_Data *translation_data){struct Type_Basic *left_type;F diff --git a/src/semantics/ast.h b/src/semantics/ast.h --- a/src/semantics/ast.h +++ b/src/semantics/ast.hstruct AST_Expression *right;};+ struct AST_Pointer_Addition_Expression+ {+ enum AST_Type type;+ struct Expression_Value *value;++ struct AST_Expression *pointer;+ struct AST_Expression *integer;+ };struct AST_Conditional_Expression{enum AST_Type type;struct AST_Binary_Expression* get_binary_expression_tree(struct AST_Expression *left,struct AST_Expression *right,struct Expression_Value *value,enum AST_Type type);struct AST_Binary_Expression* get_binary_expression_after_conversion(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type type,struct Translation_Data *translation_data);+ struct AST_Binary_Expression* get_modulo_tree(struct AST_Expression *left,struct AST_Expression *right,struct Translation_Data *translation_data);+ struct AST_Binary_Expression* get_multiplicative_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data);+ struct AST_Binary_Expression* get_additive_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data);++ struct AST_Binary_Expression* get_shift_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data);+ struct AST_Binary_Expression* get_bitwise_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data);+ struct AST_Binary_Expression* get_equality_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data);+ struct AST_Binary_Expression* get_logical_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data);+ struct AST_Binary_Expression* get_assignment_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data);+ struct AST_Binary_Expression* get_comma_expression_tree(struct AST_Expression *left,struct AST_Expression *right,enum AST_Type operation,struct Translation_Data *translation_data);+++struct AST_Binary_Expression* get_array_subscript_tree(struct AST_Expression *left,struct AST_Expression *right,struct Translation_Data *translation_data);struct AST_Unary_Expression* get_address_expression_tree(struct AST_Expression *operand);struct AST_Unary_Expression* get_sizeof_by_type_tree(struct Type *type);struct AST_Unary_Expression* get_unary_arithmetic_tree(struct AST_Expression *operand,enum AST_Type operation,struct Translation_Data *translation_data);+ struct AST_Unary_Expression* get_postfix_inc_dec_tree(struct AST_Expression *operand,enum AST_Type operation,struct Translation_Data *translation_data);++ //TODO compound literals++F diff --git a/src/semantics/ast.hh b/src/semantics/ast.hh --- a/src/semantics/ast.hh +++ b/src/semantics/ast.hhenum AST_Type{OP_COMMA- ,OP_ADDITION,OP_SUBTRACTION,OP_MUL,OP_DIV,OP_REMAINDER+ ,OP_ADDITION,OP_POINTER_ADDITION,OP_SUBTRACTION,OP_MUL,OP_DIV,OP_REMAINDER,OP_COND,OP_FUNCTION,OP_ASSIGN,OP_ADD_ASSIGN,OP_SUBTRACT_ASSIGN,OP_MULTIPLY_ASSIGN,OP_REMAINDER_ASSIGN,OP_DIV_ASSIGN,OP_SHIFT_LEFT_ASSIGN,OP_SHIFT_RIGHT_ASSIGN