479 /* subscript_list ',' subscript */ |
479 /* subscript_list ',' subscript */ |
480 // SYM_LIST(subscript_list_c) |
480 // SYM_LIST(subscript_list_c) |
481 void *narrow_candidate_datatypes_c::visit(subscript_list_c *symbol) { |
481 void *narrow_candidate_datatypes_c::visit(subscript_list_c *symbol) { |
482 for (int i = 0; i < symbol->n; i++) { |
482 for (int i = 0; i < symbol->n; i++) { |
483 for (unsigned int k = 0; k < symbol->elements[i]->candidate_datatypes.size(); k++) { |
483 for (unsigned int k = 0; k < symbol->elements[i]->candidate_datatypes.size(); k++) { |
484 if (is_ANY_INT_type(symbol->elements[i]->candidate_datatypes[k])) |
484 if (get_datatype_info_c::is_ANY_INT(symbol->elements[i]->candidate_datatypes[k])) |
485 symbol->elements[i]->datatype = symbol->elements[i]->candidate_datatypes[k]; |
485 symbol->elements[i]->datatype = symbol->elements[i]->candidate_datatypes[k]; |
486 } |
486 } |
487 symbol->elements[i]->accept(*this); |
487 symbol->elements[i]->accept(*this); |
488 } |
488 } |
489 return NULL; |
489 return NULL; |
1008 |
1008 |
1009 void *narrow_candidate_datatypes_c::narrow_conditional_flow_control_IL_instruction(symbol_c *symbol) { |
1009 void *narrow_candidate_datatypes_c::narrow_conditional_flow_control_IL_instruction(symbol_c *symbol) { |
1010 /* if the next IL instructions needs us to provide a datatype other than a bool, |
1010 /* if the next IL instructions needs us to provide a datatype other than a bool, |
1011 * then we have an internal compiler error - most likely in fill_candidate_datatypes_c |
1011 * then we have an internal compiler error - most likely in fill_candidate_datatypes_c |
1012 */ |
1012 */ |
1013 if ((NULL != symbol->datatype) && (!is_ANY_BOOL_compatible(symbol->datatype))) ERROR; |
1013 if ((NULL != symbol->datatype) && (!get_datatype_info_c::is_BOOL_compatible(symbol->datatype))) ERROR; |
1014 if (symbol->candidate_datatypes.size() > 1) ERROR; |
1014 if (symbol->candidate_datatypes.size() > 1) ERROR; |
1015 |
1015 |
1016 /* NOTE: If there is no IL instruction following this CALC, CALCN, JMPC, JMPC, ..., instruction, |
1016 /* NOTE: If there is no IL instruction following this CALC, CALCN, JMPC, JMPC, ..., instruction, |
1017 * we must still provide a bool_type_name_c datatype (if possible, i.e. if it exists in the candidate datatype list). |
1017 * we must still provide a bool_type_name_c datatype (if possible, i.e. if it exists in the candidate datatype list). |
1018 * If it is not possible, we set it to NULL |
1018 * If it is not possible, we set it to NULL |
1019 */ |
1019 */ |
1020 if (symbol->candidate_datatypes.size() == 0) symbol->datatype = NULL; |
1020 if (symbol->candidate_datatypes.size() == 0) symbol->datatype = NULL; |
1021 else symbol->datatype = symbol->candidate_datatypes[0]; /* i.e. a bool_type_name_c! */ |
1021 else symbol->datatype = symbol->candidate_datatypes[0]; /* i.e. a bool_type_name_c! */ |
1022 if ((NULL != symbol->datatype) && (!is_ANY_BOOL_compatible(symbol->datatype))) ERROR; |
1022 if ((NULL != symbol->datatype) && (!get_datatype_info_c::is_BOOL_compatible(symbol->datatype))) ERROR; |
1023 |
1023 |
1024 /* set the required datatype of the previous IL instruction, i.e. a bool_type_name_c! */ |
1024 /* set the required datatype of the previous IL instruction, i.e. a bool_type_name_c! */ |
1025 set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction); |
1025 set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction); |
1026 return NULL; |
1026 return NULL; |
1027 } |
1027 } |
1077 r_type = r_expr->candidate_datatypes[j]; |
1077 r_type = r_expr->candidate_datatypes[j]; |
1078 if (is_widening_compatible(widen_table, l_type, r_type, symbol->datatype, deprecated_operation)) { |
1078 if (is_widening_compatible(widen_table, l_type, r_type, symbol->datatype, deprecated_operation)) { |
1079 l_expr->datatype = l_type; |
1079 l_expr->datatype = l_type; |
1080 r_expr->datatype = r_type; |
1080 r_expr->datatype = r_type; |
1081 count ++; |
1081 count ++; |
1082 } else if ((l_type == r_type) && search_base_type.type_is_enumerated(l_type) && is_ANY_BOOL_compatible(symbol->datatype)) { |
1082 } else if ((l_type == r_type) && search_base_type.type_is_enumerated(l_type) && get_datatype_info_c::is_BOOL_compatible(symbol->datatype)) { |
1083 if (NULL != deprecated_operation) *deprecated_operation = false; |
1083 if (NULL != deprecated_operation) *deprecated_operation = false; |
1084 l_expr->datatype = l_type; |
1084 l_expr->datatype = l_type; |
1085 r_expr->datatype = r_type; |
1085 r_expr->datatype = r_type; |
1086 count ++; |
1086 count ++; |
1087 } |
1087 } |
1203 /* B 3.2.3 Selection Statements */ |
1203 /* B 3.2.3 Selection Statements */ |
1204 /********************************/ |
1204 /********************************/ |
1205 |
1205 |
1206 void *narrow_candidate_datatypes_c::visit(if_statement_c *symbol) { |
1206 void *narrow_candidate_datatypes_c::visit(if_statement_c *symbol) { |
1207 for(unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1207 for(unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1208 if (is_ANY_BOOL_compatible(symbol->expression->candidate_datatypes[i])) |
1208 if (get_datatype_info_c::is_BOOL_compatible(symbol->expression->candidate_datatypes[i])) |
1209 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1209 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1210 } |
1210 } |
1211 symbol->expression->accept(*this); |
1211 symbol->expression->accept(*this); |
1212 if (NULL != symbol->statement_list) |
1212 if (NULL != symbol->statement_list) |
1213 symbol->statement_list->accept(*this); |
1213 symbol->statement_list->accept(*this); |
1219 } |
1219 } |
1220 |
1220 |
1221 |
1221 |
1222 void *narrow_candidate_datatypes_c::visit(elseif_statement_c *symbol) { |
1222 void *narrow_candidate_datatypes_c::visit(elseif_statement_c *symbol) { |
1223 for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1223 for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1224 if (is_ANY_BOOL_compatible(symbol->expression->candidate_datatypes[i])) |
1224 if (get_datatype_info_c::is_BOOL_compatible(symbol->expression->candidate_datatypes[i])) |
1225 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1225 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1226 } |
1226 } |
1227 symbol->expression->accept(*this); |
1227 symbol->expression->accept(*this); |
1228 if (NULL != symbol->statement_list) |
1228 if (NULL != symbol->statement_list) |
1229 symbol->statement_list->accept(*this); |
1229 symbol->statement_list->accept(*this); |
1232 |
1232 |
1233 /* CASE expression OF case_element_list ELSE statement_list END_CASE */ |
1233 /* CASE expression OF case_element_list ELSE statement_list END_CASE */ |
1234 // SYM_REF3(case_statement_c, expression, case_element_list, statement_list) |
1234 // SYM_REF3(case_statement_c, expression, case_element_list, statement_list) |
1235 void *narrow_candidate_datatypes_c::visit(case_statement_c *symbol) { |
1235 void *narrow_candidate_datatypes_c::visit(case_statement_c *symbol) { |
1236 for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1236 for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1237 if ((is_ANY_INT_type(symbol->expression->candidate_datatypes[i])) |
1237 if ((get_datatype_info_c::is_ANY_INT(symbol->expression->candidate_datatypes[i])) |
1238 || (search_base_type.type_is_enumerated(symbol->expression->candidate_datatypes[i]))) |
1238 || (search_base_type.type_is_enumerated(symbol->expression->candidate_datatypes[i]))) |
1239 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1239 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1240 } |
1240 } |
1241 symbol->expression->accept(*this); |
1241 symbol->expression->accept(*this); |
1242 if (NULL != symbol->statement_list) |
1242 if (NULL != symbol->statement_list) |
1285 /* B 3.2.4 Iteration Statements */ |
1285 /* B 3.2.4 Iteration Statements */ |
1286 /********************************/ |
1286 /********************************/ |
1287 void *narrow_candidate_datatypes_c::visit(for_statement_c *symbol) { |
1287 void *narrow_candidate_datatypes_c::visit(for_statement_c *symbol) { |
1288 /* Control variable */ |
1288 /* Control variable */ |
1289 for(unsigned int i = 0; i < symbol->control_variable->candidate_datatypes.size(); i++) { |
1289 for(unsigned int i = 0; i < symbol->control_variable->candidate_datatypes.size(); i++) { |
1290 if (is_ANY_INT_type(symbol->control_variable->candidate_datatypes[i])) { |
1290 if (get_datatype_info_c::is_ANY_INT(symbol->control_variable->candidate_datatypes[i])) { |
1291 symbol->control_variable->datatype = symbol->control_variable->candidate_datatypes[i]; |
1291 symbol->control_variable->datatype = symbol->control_variable->candidate_datatypes[i]; |
1292 } |
1292 } |
1293 } |
1293 } |
1294 symbol->control_variable->accept(*this); |
1294 symbol->control_variable->accept(*this); |
1295 /* BEG expression */ |
1295 /* BEG expression */ |
1296 for(unsigned int i = 0; i < symbol->beg_expression->candidate_datatypes.size(); i++) { |
1296 for(unsigned int i = 0; i < symbol->beg_expression->candidate_datatypes.size(); i++) { |
1297 if (is_type_equal(symbol->control_variable->datatype,symbol->beg_expression->candidate_datatypes[i]) && |
1297 if (is_type_equal(symbol->control_variable->datatype,symbol->beg_expression->candidate_datatypes[i]) && |
1298 is_ANY_INT_type(symbol->beg_expression->candidate_datatypes[i])) { |
1298 get_datatype_info_c::is_ANY_INT(symbol->beg_expression->candidate_datatypes[i])) { |
1299 symbol->beg_expression->datatype = symbol->beg_expression->candidate_datatypes[i]; |
1299 symbol->beg_expression->datatype = symbol->beg_expression->candidate_datatypes[i]; |
1300 } |
1300 } |
1301 } |
1301 } |
1302 symbol->beg_expression->accept(*this); |
1302 symbol->beg_expression->accept(*this); |
1303 /* END expression */ |
1303 /* END expression */ |
1304 for(unsigned int i = 0; i < symbol->end_expression->candidate_datatypes.size(); i++) { |
1304 for(unsigned int i = 0; i < symbol->end_expression->candidate_datatypes.size(); i++) { |
1305 if (is_type_equal(symbol->control_variable->datatype,symbol->end_expression->candidate_datatypes[i]) && |
1305 if (is_type_equal(symbol->control_variable->datatype,symbol->end_expression->candidate_datatypes[i]) && |
1306 is_ANY_INT_type(symbol->end_expression->candidate_datatypes[i])) { |
1306 get_datatype_info_c::is_ANY_INT(symbol->end_expression->candidate_datatypes[i])) { |
1307 symbol->end_expression->datatype = symbol->end_expression->candidate_datatypes[i]; |
1307 symbol->end_expression->datatype = symbol->end_expression->candidate_datatypes[i]; |
1308 } |
1308 } |
1309 } |
1309 } |
1310 symbol->end_expression->accept(*this); |
1310 symbol->end_expression->accept(*this); |
1311 /* BY expression */ |
1311 /* BY expression */ |
1312 if (NULL != symbol->by_expression) { |
1312 if (NULL != symbol->by_expression) { |
1313 for(unsigned int i = 0; i < symbol->by_expression->candidate_datatypes.size(); i++) { |
1313 for(unsigned int i = 0; i < symbol->by_expression->candidate_datatypes.size(); i++) { |
1314 if (is_type_equal(symbol->control_variable->datatype,symbol->by_expression->candidate_datatypes[i]) && |
1314 if (is_type_equal(symbol->control_variable->datatype,symbol->by_expression->candidate_datatypes[i]) && |
1315 is_ANY_INT_type(symbol->by_expression->candidate_datatypes[i])) { |
1315 get_datatype_info_c::is_ANY_INT(symbol->by_expression->candidate_datatypes[i])) { |
1316 symbol->by_expression->datatype = symbol->by_expression->candidate_datatypes[i]; |
1316 symbol->by_expression->datatype = symbol->by_expression->candidate_datatypes[i]; |
1317 } |
1317 } |
1318 } |
1318 } |
1319 symbol->by_expression->accept(*this); |
1319 symbol->by_expression->accept(*this); |
1320 } |
1320 } |
1323 return NULL; |
1323 return NULL; |
1324 } |
1324 } |
1325 |
1325 |
1326 void *narrow_candidate_datatypes_c::visit(while_statement_c *symbol) { |
1326 void *narrow_candidate_datatypes_c::visit(while_statement_c *symbol) { |
1327 for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1327 for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1328 if(is_BOOL_type(symbol->expression->candidate_datatypes[i])) |
1328 if(get_datatype_info_c::is_BOOL(symbol->expression->candidate_datatypes[i])) |
1329 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1329 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1330 } |
1330 } |
1331 symbol->expression->accept(*this); |
1331 symbol->expression->accept(*this); |
1332 if (NULL != symbol->statement_list) |
1332 if (NULL != symbol->statement_list) |
1333 symbol->statement_list->accept(*this); |
1333 symbol->statement_list->accept(*this); |
1334 return NULL; |
1334 return NULL; |
1335 } |
1335 } |
1336 |
1336 |
1337 void *narrow_candidate_datatypes_c::visit(repeat_statement_c *symbol) { |
1337 void *narrow_candidate_datatypes_c::visit(repeat_statement_c *symbol) { |
1338 for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1338 for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) { |
1339 if(is_BOOL_type(symbol->expression->candidate_datatypes[i])) |
1339 if(get_datatype_info_c::is_BOOL(symbol->expression->candidate_datatypes[i])) |
1340 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1340 symbol->expression->datatype = symbol->expression->candidate_datatypes[i]; |
1341 } |
1341 } |
1342 symbol->expression->accept(*this); |
1342 symbol->expression->accept(*this); |
1343 if (NULL != symbol->statement_list) |
1343 if (NULL != symbol->statement_list) |
1344 symbol->statement_list->accept(*this); |
1344 symbol->statement_list->accept(*this); |