stage3/print_datatypes_error.cc
changeset 485 835697564c6d
parent 484 f78750994a82
child 486 e22150ad75fd
equal deleted inserted replaced
484:f78750994a82 485:835697564c6d
   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);