973 /***************************************/ |
973 /***************************************/ |
974 /***********************/ |
974 /***********************/ |
975 /* B 3.1 - Expressions */ |
975 /* B 3.1 - Expressions */ |
976 /***********************/ |
976 /***********************/ |
977 |
977 |
978 void *print_datatypes_error_c::visit(or_expression_c *symbol) { |
978 void *print_datatypes_error_c::print_binary_expression_errors(const char *operation, symbol_c *symbol, symbol_c *l_expr, symbol_c *r_expr, bool deprecated_operation) { |
979 symbol->l_exp->accept(*this); |
979 l_expr->accept(*this); |
980 symbol->r_exp->accept(*this); |
980 r_expr->accept(*this); |
981 if ((symbol->candidate_datatypes.size() == 0) && |
981 if ((symbol->candidate_datatypes.size() == 0) && |
982 (symbol->l_exp->candidate_datatypes.size() > 0) && |
982 (l_expr->candidate_datatypes.size() > 0) && |
983 (symbol->r_exp->candidate_datatypes.size() > 0)) |
983 (r_expr->candidate_datatypes.size() > 0)) |
984 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for 'OR' expression."); |
984 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '%s' expression.", operation); |
985 return NULL; |
985 if (deprecated_operation) |
986 } |
986 STAGE3_WARNING(symbol, symbol, "Deprecated operation for '%s' expression.", operation); |
987 |
987 return NULL; |
988 |
988 } |
989 void *print_datatypes_error_c::visit(xor_expression_c *symbol) { |
989 |
990 symbol->l_exp->accept(*this); |
990 |
991 symbol->r_exp->accept(*this); |
991 void *print_datatypes_error_c::visit( or_expression_c *symbol) {return print_binary_expression_errors( "OR", symbol, symbol->l_exp, symbol->r_exp);} |
992 if ((symbol->candidate_datatypes.size() == 0) && |
992 void *print_datatypes_error_c::visit( xor_expression_c *symbol) {return print_binary_expression_errors("XOR", symbol, symbol->l_exp, symbol->r_exp);} |
993 (symbol->l_exp->candidate_datatypes.size() > 0) && |
993 void *print_datatypes_error_c::visit( and_expression_c *symbol) {return print_binary_expression_errors("AND", symbol, symbol->l_exp, symbol->r_exp);} |
994 (symbol->r_exp->candidate_datatypes.size() > 0)) |
994 void *print_datatypes_error_c::visit( equ_expression_c *symbol) {return print_binary_expression_errors( "=" , symbol, symbol->l_exp, symbol->r_exp);} |
995 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for 'XOR' expression."); |
995 void *print_datatypes_error_c::visit(notequ_expression_c *symbol) {return print_binary_expression_errors( "<>", symbol, symbol->l_exp, symbol->r_exp);} |
996 return NULL; |
996 void *print_datatypes_error_c::visit( lt_expression_c *symbol) {return print_binary_expression_errors( "<" , symbol, symbol->l_exp, symbol->r_exp);} |
997 } |
997 void *print_datatypes_error_c::visit( gt_expression_c *symbol) {return print_binary_expression_errors( ">" , symbol, symbol->l_exp, symbol->r_exp);} |
998 |
998 void *print_datatypes_error_c::visit( le_expression_c *symbol) {return print_binary_expression_errors( "<=", symbol, symbol->l_exp, symbol->r_exp);} |
999 |
999 void *print_datatypes_error_c::visit( ge_expression_c *symbol) {return print_binary_expression_errors( ">=", symbol, symbol->l_exp, symbol->r_exp);} |
1000 void *print_datatypes_error_c::visit(and_expression_c *symbol) { |
1000 void *print_datatypes_error_c::visit( add_expression_c *symbol) {return print_binary_expression_errors( "+" , symbol, symbol->l_exp, symbol->r_exp, symbol->deprecated_operation);} |
1001 symbol->l_exp->accept(*this); |
1001 void *print_datatypes_error_c::visit( sub_expression_c *symbol) {return print_binary_expression_errors( "-" , symbol, symbol->l_exp, symbol->r_exp, symbol->deprecated_operation);} |
1002 symbol->r_exp->accept(*this); |
1002 void *print_datatypes_error_c::visit( mul_expression_c *symbol) {return print_binary_expression_errors( "*" , symbol, symbol->l_exp, symbol->r_exp, symbol->deprecated_operation);} |
1003 if ((symbol->candidate_datatypes.size() == 0) && |
1003 void *print_datatypes_error_c::visit( div_expression_c *symbol) {return print_binary_expression_errors( "/" , symbol, symbol->l_exp, symbol->r_exp, symbol->deprecated_operation);} |
1004 (symbol->l_exp->candidate_datatypes.size() > 0) && |
1004 void *print_datatypes_error_c::visit( mod_expression_c *symbol) {return print_binary_expression_errors("MOD", symbol, symbol->l_exp, symbol->r_exp);} |
1005 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1006 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for 'AND' expression."); |
|
1007 return NULL; |
|
1008 } |
|
1009 |
|
1010 |
|
1011 void *print_datatypes_error_c::visit(equ_expression_c *symbol) { |
|
1012 symbol->l_exp->accept(*this); |
|
1013 symbol->r_exp->accept(*this); |
|
1014 if ((symbol->candidate_datatypes.size() == 0) && |
|
1015 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1016 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1017 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '=' expression."); |
|
1018 return NULL; |
|
1019 } |
|
1020 |
|
1021 |
|
1022 void *print_datatypes_error_c::visit(notequ_expression_c *symbol) { |
|
1023 symbol->l_exp->accept(*this); |
|
1024 symbol->r_exp->accept(*this); |
|
1025 if ((symbol->candidate_datatypes.size() == 0) && |
|
1026 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1027 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1028 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '<>' expression."); |
|
1029 return NULL; |
|
1030 } |
|
1031 |
|
1032 |
|
1033 void *print_datatypes_error_c::visit(lt_expression_c *symbol) { |
|
1034 symbol->l_exp->accept(*this); |
|
1035 symbol->r_exp->accept(*this); |
|
1036 if ((symbol->candidate_datatypes.size() == 0) && |
|
1037 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1038 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1039 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '<' expression."); |
|
1040 return NULL; |
|
1041 } |
|
1042 |
|
1043 |
|
1044 void *print_datatypes_error_c::visit(gt_expression_c *symbol) { |
|
1045 symbol->l_exp->accept(*this); |
|
1046 symbol->r_exp->accept(*this); |
|
1047 if ((symbol->candidate_datatypes.size() == 0) && |
|
1048 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1049 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1050 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '>' expression."); |
|
1051 return NULL; |
|
1052 } |
|
1053 |
|
1054 |
|
1055 void *print_datatypes_error_c::visit(le_expression_c *symbol) { |
|
1056 symbol->l_exp->accept(*this); |
|
1057 symbol->r_exp->accept(*this); |
|
1058 if ((symbol->candidate_datatypes.size() == 0) && |
|
1059 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1060 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1061 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '<=' expression."); |
|
1062 return NULL; |
|
1063 } |
|
1064 |
|
1065 |
|
1066 void *print_datatypes_error_c::visit(ge_expression_c *symbol) { |
|
1067 symbol->l_exp->accept(*this); |
|
1068 symbol->r_exp->accept(*this); |
|
1069 if ((symbol->candidate_datatypes.size() == 0) && |
|
1070 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1071 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1072 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '>=' expression."); |
|
1073 return NULL; |
|
1074 } |
|
1075 |
|
1076 |
|
1077 void *print_datatypes_error_c::visit(add_expression_c *symbol) { |
|
1078 symbol->l_exp->accept(*this); |
|
1079 symbol->r_exp->accept(*this); |
|
1080 if ((symbol->candidate_datatypes.size() == 0) && |
|
1081 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1082 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1083 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '+' expression."); |
|
1084 if (symbol->deprecated_operation) |
|
1085 STAGE3_WARNING(symbol, symbol, "Deprecated operation for '+' expression."); |
|
1086 return NULL; |
|
1087 } |
|
1088 |
|
1089 |
|
1090 |
|
1091 void *print_datatypes_error_c::visit(sub_expression_c *symbol) { |
|
1092 symbol->l_exp->accept(*this); |
|
1093 symbol->r_exp->accept(*this); |
|
1094 if ((symbol->candidate_datatypes.size() == 0) && |
|
1095 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1096 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1097 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '-' expression."); |
|
1098 if (symbol->deprecated_operation) |
|
1099 STAGE3_WARNING(symbol, symbol, "Deprecated operation for '-' expression."); |
|
1100 return NULL; |
|
1101 } |
|
1102 |
|
1103 void *print_datatypes_error_c::visit(mul_expression_c *symbol) { |
|
1104 symbol->l_exp->accept(*this); |
|
1105 symbol->r_exp->accept(*this); |
|
1106 if ((symbol->candidate_datatypes.size() == 0) && |
|
1107 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1108 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1109 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '*' expression."); |
|
1110 if (symbol->deprecated_operation) |
|
1111 STAGE3_WARNING(symbol, symbol, "Deprecated operation for '*' expression."); |
|
1112 return NULL; |
|
1113 } |
|
1114 |
|
1115 void *print_datatypes_error_c::visit(div_expression_c *symbol) { |
|
1116 symbol->l_exp->accept(*this); |
|
1117 symbol->r_exp->accept(*this); |
|
1118 if ((symbol->candidate_datatypes.size() == 0) && |
|
1119 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1120 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1121 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for '/' expression."); |
|
1122 if (symbol->deprecated_operation) |
|
1123 STAGE3_WARNING(symbol, symbol, "Deprecated operation for '/' expression."); |
|
1124 return NULL; |
|
1125 } |
|
1126 |
|
1127 |
|
1128 void *print_datatypes_error_c::visit(mod_expression_c *symbol) { |
|
1129 symbol->l_exp->accept(*this); |
|
1130 symbol->r_exp->accept(*this); |
|
1131 if ((symbol->candidate_datatypes.size() == 0) && |
|
1132 (symbol->l_exp->candidate_datatypes.size() > 0) && |
|
1133 (symbol->r_exp->candidate_datatypes.size() > 0)) |
|
1134 STAGE3_ERROR(0, symbol, symbol, "Data type mismatch for 'MOD' expression."); |
|
1135 return NULL; |
|
1136 } |
|
1137 |
1005 |
1138 |
1006 |
1139 void *print_datatypes_error_c::visit(power_expression_c *symbol) { |
1007 void *print_datatypes_error_c::visit(power_expression_c *symbol) { |
1140 symbol->l_exp->accept(*this); |
1008 symbol->l_exp->accept(*this); |
1141 symbol->r_exp->accept(*this); |
1009 symbol->r_exp->accept(*this); |