diff -r e657008f43d0 -r da1a8186f86f absyntax_utils/search_expression_type.cc --- a/absyntax_utils/search_expression_type.cc Thu Jul 02 11:26:25 2009 +0100 +++ b/absyntax_utils/search_expression_type.cc Thu Aug 27 16:06:46 2009 +0100 @@ -65,32 +65,48 @@ /* A helper function... */ bool search_expression_type_c::is_string_type(symbol_c *type_symbol) { if (type_symbol == NULL) {return true;} - if (typeid(*type_symbol) == typeid(string_type_name_c)) {return true;} + if (typeid(*type_symbol) == typeid(string_type_name_c)) {return true;} if (typeid(*type_symbol) == typeid(wstring_type_name_c)) {return true;} return false; } /* A helper function... */ +bool search_expression_type_c::is_literal_integer_type(symbol_c *type_symbol) { + if (type_symbol == NULL) {return true;} + if (typeid(*type_symbol) == typeid(integer_c)) {return true;} + if (typeid(*type_symbol) == typeid(binary_integer_c)) {return true;} + if (typeid(*type_symbol) == typeid(octal_integer_c)) {return true;} + if (typeid(*type_symbol) == typeid(hex_integer_c)) {return true;} + return false; +} + +/* A helper function... */ bool search_expression_type_c::is_integer_type(symbol_c *type_symbol) { if (type_symbol == NULL) {return true;} - if (typeid(*type_symbol) == typeid(sint_type_name_c)) {return true;} - if (typeid(*type_symbol) == typeid(int_type_name_c)) {return true;} - if (typeid(*type_symbol) == typeid(dint_type_name_c)) {return true;} - if (typeid(*type_symbol) == typeid(lint_type_name_c)) {return true;} + if (typeid(*type_symbol) == typeid(sint_type_name_c)) {return true;} + if (typeid(*type_symbol) == typeid(int_type_name_c)) {return true;} + if (typeid(*type_symbol) == typeid(dint_type_name_c)) {return true;} + if (typeid(*type_symbol) == typeid(lint_type_name_c)) {return true;} if (typeid(*type_symbol) == typeid(usint_type_name_c)) {return true;} - if (typeid(*type_symbol) == typeid(uint_type_name_c)) {return true;} + if (typeid(*type_symbol) == typeid(uint_type_name_c)) {return true;} if (typeid(*type_symbol) == typeid(udint_type_name_c)) {return true;} if (typeid(*type_symbol) == typeid(ulint_type_name_c)) {return true;} - if (typeid(*type_symbol) == typeid(constant_int_type_name_c)) {return true;} - return false; -} - + return is_literal_integer_type(type_symbol); +} + +/* A helper function... */ +bool search_expression_type_c::is_literal_real_type(symbol_c *type_symbol) { + if (type_symbol == NULL) {return true;} + if (typeid(*type_symbol) == typeid(real_c)) {return true;} + return false; +} + +/* A helper function... */ bool search_expression_type_c::is_real_type(symbol_c *type_symbol) { if (type_symbol == NULL) {return true;} if (typeid(*type_symbol) == typeid(real_type_name_c)) {return true;} if (typeid(*type_symbol) == typeid(lreal_type_name_c)) {return true;} - if (typeid(*type_symbol) == typeid(constant_real_type_name_c)) {return true;} - return false; + return is_literal_real_type(type_symbol); } bool search_expression_type_c::is_num_type(symbol_c *type_symbol) { @@ -104,8 +120,7 @@ if (typeid(*type_symbol) == typeid(word_type_name_c)) {return true;} if (typeid(*type_symbol) == typeid(dword_type_name_c)) {return true;} if (typeid(*type_symbol) == typeid(lword_type_name_c)) {return true;} - if (typeid(*type_symbol) == typeid(constant_int_type_name_c)) {return true;} - return false; + return is_literal_integer_type(type_symbol); } bool search_expression_type_c::is_binary_type(symbol_c *type_symbol) { @@ -117,12 +132,12 @@ bool search_expression_type_c::is_same_type(symbol_c *first_type, symbol_c *second_type) { if (first_type == NULL || second_type == NULL) {return true;} if (typeid(*first_type) == typeid(*second_type)) {return true;} - if (is_integer_type(first_type) && (typeid(*second_type) == typeid(constant_int_type_name_c))) {return true;} - if ((typeid(*first_type) == typeid(constant_int_type_name_c) && is_integer_type(second_type))) {return true;} - if (is_binary_type(first_type) && (typeid(*second_type) == typeid(constant_int_type_name_c))) {return true;} - if ((typeid(*first_type) == typeid(constant_int_type_name_c) && is_binary_type(second_type))) {return true;} - if (is_real_type(first_type) && (typeid(*second_type) == typeid(constant_real_type_name_c))) {return true;} - if ((typeid(*first_type) == typeid(constant_real_type_name_c) && is_real_type(second_type))) {return true;} + if (is_integer_type(first_type) && is_literal_integer_type(second_type)) {return true;} + if (is_literal_integer_type(first_type) && is_integer_type(second_type)) {return true;} + if (is_binary_type(first_type) && is_literal_integer_type(second_type)) {return true;} + if (is_literal_integer_type(first_type) && is_binary_type(second_type)) {return true;} + if (is_real_type(first_type) && is_literal_real_type(second_type)) {return true;} + if (is_literal_real_type(first_type) && is_real_type(second_type)) {return true;} return false; } @@ -131,18 +146,28 @@ if (first_type == NULL) {return second_type;} if (second_type == NULL) {return first_type;} if (typeid(*first_type) == typeid(*second_type)) {return first_type;} - if (is_integer_type(first_type) && (typeid(*second_type) == typeid(constant_int_type_name_c))) {return first_type;} - if ((typeid(*first_type) == typeid(constant_int_type_name_c)) && is_integer_type(second_type)) {return second_type;} - if (is_binary_type(first_type) && (typeid(*second_type) == typeid(constant_int_type_name_c))) {return first_type;} - if ((typeid(*first_type) == typeid(constant_int_type_name_c)) && is_binary_type(second_type)) {return second_type;} - if (is_real_type(first_type) && (typeid(*second_type) == typeid(constant_real_type_name_c))) {return first_type;} - if ((typeid(*first_type) == typeid(constant_real_type_name_c)) && is_real_type(second_type)) {return second_type;} - return NULL; -} - + if (is_integer_type(first_type) && is_literal_integer_type(second_type)) {return first_type;} + if (is_literal_integer_type(first_type) && is_integer_type(second_type)) {return second_type;} + if (is_binary_type(first_type) && is_literal_integer_type(second_type)) {return first_type;} + if (is_literal_integer_type(first_type) && is_binary_type(second_type)) {return second_type;} + if (is_real_type(first_type) && is_literal_real_type(second_type)) {return first_type;} + if (is_literal_real_type(first_type) && is_real_type(second_type)) {return second_type;} + return NULL; +} + + +integer_c search_expression_type_c::integer("1"); // what default value should we use here ??? #define compute_standard_function_default search_expression_type_c::compute_standard_function_default #define compute_standard_function_il search_expression_type_c::compute_standard_function_il +#define search(x) search_f(x) +#define next() next_nf() +// #define search_constant_type_c::constant_int_type_name search_expression_type_c::integer +#define constant_int_type_name integer #include "search_type_code.c" +#undef constant_int_type_name +// #undef search_constant_type_c::constant_int_type_name +#undef next +#undef search #undef compute_standard_function_default #undef compute_standard_function_il @@ -154,7 +179,7 @@ ERROR; if (!is_bool_type(left_type) && !is_binary_type(left_type)) ERROR; - if (typeid(*left_type) == typeid(constant_int_type_name_c)) {return (void *)right_type;} + if (is_literal_integer_type(left_type)) {return (void *)right_type;} else {return (void *)left_type;} } @@ -164,7 +189,7 @@ ERROR; if (!is_integer_type(left_type) && !is_real_type(left_type)) ERROR; - if ((typeid(*left_type) == typeid(constant_int_type_name_c)) || (typeid(*left_type) == typeid(constant_real_type_name_c))) {return (void *)right_type;} + if (is_literal_integer_type(left_type) || is_literal_real_type(left_type)) {return (void *)right_type;} else {return (void *)left_type;} return NULL; }