absyntax_utils/search_expression_type.cc
changeset 257 90782e241346
parent 202 da1a8186f86f
child 258 d7d92b2f87e9
equal deleted inserted replaced
204:8ffa211b7f9a 257:90782e241346
    47 
    47 
    48 /* A helper function... */
    48 /* A helper function... */
    49 bool search_expression_type_c::is_bool_type(symbol_c *type_symbol) {
    49 bool search_expression_type_c::is_bool_type(symbol_c *type_symbol) {
    50   bool_type_name_c tt;
    50   bool_type_name_c tt;
    51   if (type_symbol == NULL) {return true;}
    51   if (type_symbol == NULL) {return true;}
    52   return (typeid(*type_symbol) == typeid(bool_type_name_c));
    52   if (typeid(*type_symbol) == typeid(safebool_type_name_c)) {return true;}
       
    53   if (typeid(*type_symbol) == typeid(bool_type_name_c))     {return true;}
       
    54   if (typeid(*type_symbol) == typeid(boolean_true_c))       {return true;}
       
    55   if (typeid(*type_symbol) == typeid(boolean_false_c))      {return true;}
       
    56   return false;
    53 }
    57 }
    54 
    58 
    55 /* A helper function... */
    59 /* A helper function... */
    56 bool search_expression_type_c::is_time_type(symbol_c *type_symbol) {
    60 bool search_expression_type_c::is_time_type(symbol_c *type_symbol) {
    57   if (type_symbol == NULL) {return true;}
    61   if (type_symbol == NULL) {return true;}
    58   if (typeid(*type_symbol) == typeid(time_type_name_c)) {return true;}
    62   if (typeid(*type_symbol) == typeid(time_type_name_c))     {return true;}
    59   if (typeid(*type_symbol) == typeid(date_type_name_c)) {return true;}
    63   if (typeid(*type_symbol) == typeid(date_type_name_c))     {return true;}
    60   if (typeid(*type_symbol) == typeid(tod_type_name_c)) {return true;}
    64   if (typeid(*type_symbol) == typeid(tod_type_name_c))      {return true;}
    61   if (typeid(*type_symbol) == typeid(dt_type_name_c)) {return true;}
    65   if (typeid(*type_symbol) == typeid(dt_type_name_c))       {return true;}
       
    66   if (typeid(*type_symbol) == typeid(safetime_type_name_c)) {return true;}
       
    67   if (typeid(*type_symbol) == typeid(safedate_type_name_c)) {return true;}
       
    68   if (typeid(*type_symbol) == typeid(safetod_type_name_c))  {return true;}
       
    69   if (typeid(*type_symbol) == typeid(safedt_type_name_c))   {return true;}
    62   return false;
    70   return false;
    63 }
    71 }
    64 
    72 
    65 /* A helper function... */
    73 /* A helper function... */
    66 bool search_expression_type_c::is_string_type(symbol_c *type_symbol) {
    74 bool search_expression_type_c::is_string_type(symbol_c *type_symbol) {
    67   if (type_symbol == NULL) {return true;}
    75   if (type_symbol == NULL) {return true;}
    68   if (typeid(*type_symbol) == typeid(string_type_name_c))  {return true;}
    76   if (typeid(*type_symbol) == typeid(string_type_name_c))      {return true;}
    69   if (typeid(*type_symbol) == typeid(wstring_type_name_c)) {return true;}
    77   if (typeid(*type_symbol) == typeid(wstring_type_name_c))     {return true;}
       
    78   if (typeid(*type_symbol) == typeid(safestring_type_name_c))  {return true;}
       
    79   if (typeid(*type_symbol) == typeid(safewstring_type_name_c)) {return true;}
    70   return false;
    80   return false;
    71 }
    81 }
    72 
    82 
    73 /* A helper function... */
    83 /* A helper function... */
    74 bool search_expression_type_c::is_literal_integer_type(symbol_c *type_symbol) {
    84 bool search_expression_type_c::is_literal_integer_type(symbol_c *type_symbol) {
    75   if (type_symbol == NULL) {return true;}
    85   if (type_symbol == NULL) {return true;}
    76   if (typeid(*type_symbol) == typeid(integer_c))        {return true;}
    86   if (typeid(*type_symbol) == typeid(integer_c))        {return true;}
       
    87   if (typeid(*type_symbol) == typeid(neg_integer_c))    {return true;}
    77   if (typeid(*type_symbol) == typeid(binary_integer_c)) {return true;}
    88   if (typeid(*type_symbol) == typeid(binary_integer_c)) {return true;}
    78   if (typeid(*type_symbol) == typeid(octal_integer_c))  {return true;}
    89   if (typeid(*type_symbol) == typeid(octal_integer_c))  {return true;}
    79   if (typeid(*type_symbol) == typeid(hex_integer_c))    {return true;}
    90   if (typeid(*type_symbol) == typeid(hex_integer_c))    {return true;}
    80   return false;
    91   return false;
    81 }
    92 }
    82 
    93 
    83 /* A helper function... */
    94 /* A helper function... */
    84 bool search_expression_type_c::is_integer_type(symbol_c *type_symbol) {
    95 bool search_expression_type_c::is_integer_type(symbol_c *type_symbol) {
    85   if (type_symbol == NULL) {return true;}
    96   if (type_symbol == NULL) {return true;}
    86   if (typeid(*type_symbol) == typeid(sint_type_name_c))  {return true;}
    97   if (typeid(*type_symbol) == typeid(sint_type_name_c))      {return true;}
    87   if (typeid(*type_symbol) == typeid(int_type_name_c))   {return true;}
    98   if (typeid(*type_symbol) == typeid(int_type_name_c))       {return true;}
    88   if (typeid(*type_symbol) == typeid(dint_type_name_c))  {return true;}
    99   if (typeid(*type_symbol) == typeid(dint_type_name_c))      {return true;}
    89   if (typeid(*type_symbol) == typeid(lint_type_name_c))  {return true;}
   100   if (typeid(*type_symbol) == typeid(lint_type_name_c))      {return true;}
    90   if (typeid(*type_symbol) == typeid(usint_type_name_c)) {return true;}
   101   if (typeid(*type_symbol) == typeid(usint_type_name_c))     {return true;}
    91   if (typeid(*type_symbol) == typeid(uint_type_name_c))  {return true;}
   102   if (typeid(*type_symbol) == typeid(uint_type_name_c))      {return true;}
    92   if (typeid(*type_symbol) == typeid(udint_type_name_c)) {return true;}
   103   if (typeid(*type_symbol) == typeid(udint_type_name_c))     {return true;}
    93   if (typeid(*type_symbol) == typeid(ulint_type_name_c)) {return true;}
   104   if (typeid(*type_symbol) == typeid(ulint_type_name_c))     {return true;}
       
   105   if (typeid(*type_symbol) == typeid(safesint_type_name_c))  {return true;}
       
   106   if (typeid(*type_symbol) == typeid(safeint_type_name_c))   {return true;}
       
   107   if (typeid(*type_symbol) == typeid(safedint_type_name_c))  {return true;}
       
   108   if (typeid(*type_symbol) == typeid(safelint_type_name_c))  {return true;}
       
   109   if (typeid(*type_symbol) == typeid(safeusint_type_name_c)) {return true;}
       
   110   if (typeid(*type_symbol) == typeid(safeuint_type_name_c))  {return true;}
       
   111   if (typeid(*type_symbol) == typeid(safeudint_type_name_c)) {return true;}
       
   112   if (typeid(*type_symbol) == typeid(safeulint_type_name_c)) {return true;}
    94   return is_literal_integer_type(type_symbol);
   113   return is_literal_integer_type(type_symbol);
    95 }
   114 }
    96 
   115 
    97 /* A helper function... */
   116 /* A helper function... */
    98 bool search_expression_type_c::is_literal_real_type(symbol_c *type_symbol) {
   117 bool search_expression_type_c::is_literal_real_type(symbol_c *type_symbol) {
    99   if (type_symbol == NULL) {return true;}
   118   if (type_symbol == NULL) {return true;}
   100   if (typeid(*type_symbol) == typeid(real_c)) {return true;}
   119   if (typeid(*type_symbol) == typeid(real_c))     {return true;}
       
   120   if (typeid(*type_symbol) == typeid(neg_real_c)) {return true;}
   101   return false;
   121   return false;
   102 }
   122 }
   103 
   123 
   104 /* A helper function... */
   124 /* A helper function... */
   105 bool search_expression_type_c::is_real_type(symbol_c *type_symbol) {
   125 bool search_expression_type_c::is_real_type(symbol_c *type_symbol) {
   106   if (type_symbol == NULL) {return true;}
   126   if (type_symbol == NULL) {return true;}
   107   if (typeid(*type_symbol) == typeid(real_type_name_c)) {return true;}
   127   if (typeid(*type_symbol) == typeid(real_type_name_c))      {return true;}
   108   if (typeid(*type_symbol) == typeid(lreal_type_name_c)) {return true;}
   128   if (typeid(*type_symbol) == typeid(lreal_type_name_c))     {return true;}
       
   129   if (typeid(*type_symbol) == typeid(safereal_type_name_c))  {return true;} 
       
   130   if (typeid(*type_symbol) == typeid(safelreal_type_name_c)) {return true;}  
   109   return is_literal_real_type(type_symbol);
   131   return is_literal_real_type(type_symbol);
   110 }
   132 }
   111 
   133 
   112 bool search_expression_type_c::is_num_type(symbol_c *type_symbol) {
   134 bool search_expression_type_c::is_num_type(symbol_c *type_symbol) {
   113   if (type_symbol == NULL) {return true;}
   135   if (type_symbol == NULL) {return true;}
   114   return is_real_type(type_symbol) || is_integer_type(type_symbol);
   136   return is_real_type(type_symbol) || is_integer_type(type_symbol);
   115 }
   137 }
   116 
   138 
   117 bool search_expression_type_c::is_nbinary_type(symbol_c *type_symbol) {
   139 bool search_expression_type_c::is_nbinary_type(symbol_c *type_symbol) {
   118   if (type_symbol == NULL) {return true;}
   140   if (type_symbol == NULL) {return true;}
   119   if (typeid(*type_symbol) == typeid(byte_type_name_c)) {return true;}
   141   if (typeid(*type_symbol) == typeid(byte_type_name_c))      {return true;}
   120   if (typeid(*type_symbol) == typeid(word_type_name_c)) {return true;}
   142   if (typeid(*type_symbol) == typeid(word_type_name_c))      {return true;}
   121   if (typeid(*type_symbol) == typeid(dword_type_name_c)) {return true;}
   143   if (typeid(*type_symbol) == typeid(dword_type_name_c))     {return true;}
   122   if (typeid(*type_symbol) == typeid(lword_type_name_c)) {return true;}
   144   if (typeid(*type_symbol) == typeid(lword_type_name_c))     {return true;}
       
   145   if (typeid(*type_symbol) == typeid(safebyte_type_name_c))  {return true;}
       
   146   if (typeid(*type_symbol) == typeid(safeword_type_name_c))  {return true;}
       
   147   if (typeid(*type_symbol) == typeid(safedword_type_name_c)) {return true;}
       
   148   if (typeid(*type_symbol) == typeid(safelword_type_name_c)) {return true;}
   123   return is_literal_integer_type(type_symbol);
   149   return is_literal_integer_type(type_symbol);
   124 }
   150 }
   125 
   151 
   126 bool search_expression_type_c::is_binary_type(symbol_c *type_symbol) {
   152 bool search_expression_type_c::is_binary_type(symbol_c *type_symbol) {
   127   if (type_symbol == NULL) {return true;}
   153   if (type_symbol == NULL) {return true;}
   128   if (typeid(*type_symbol) == typeid(bool_type_name_c)) {return true;}
   154 //   if (typeid(*type_symbol) == typeid(bool_type_name_c))     {return true;}
   129   return is_nbinary_type(type_symbol);
   155 //   if (typeid(*type_symbol) == typeid(safebool_type_name_c)) {return true;}
       
   156   return (is_nbinary_type(type_symbol) || is_bool_type(type_symbol));
   130 }
   157 }
   131 
   158 
   132 bool search_expression_type_c::is_same_type(symbol_c *first_type, symbol_c *second_type) {
   159 bool search_expression_type_c::is_same_type(symbol_c *first_type, symbol_c *second_type) {
   133   if (first_type == NULL || second_type == NULL) {return true;}
   160   if (first_type == NULL || second_type == NULL) {return true;}
   134   if (typeid(*first_type) == typeid(*second_type)) {return true;}
   161   if (typeid(*first_type) == typeid(*second_type)) {return true;}
   135   if (is_integer_type(first_type) && is_literal_integer_type(second_type)) {return true;}
   162   if (is_bool_type(first_type)            && is_bool_type(second_type))            {return true;}
   136   if (is_literal_integer_type(first_type) && is_integer_type(second_type)) {return true;}
   163   if (is_integer_type(first_type)         && is_literal_integer_type(second_type)) {return true;}
   137   if (is_binary_type(first_type) && is_literal_integer_type(second_type))  {return true;}
   164   if (is_literal_integer_type(first_type) && is_integer_type(second_type))         {return true;}
   138   if (is_literal_integer_type(first_type) && is_binary_type(second_type))  {return true;}
   165   if (is_binary_type(first_type)          && is_literal_integer_type(second_type)) {return true;}
   139   if (is_real_type(first_type) && is_literal_real_type(second_type)) {return true;}
   166   if (is_literal_integer_type(first_type) && is_binary_type(second_type))          {return true;}
   140   if (is_literal_real_type(first_type) && is_real_type(second_type)) {return true;}
   167   if (is_real_type(first_type)            && is_literal_real_type(second_type))    {return true;}
       
   168   if (is_literal_real_type(first_type)    && is_real_type(second_type))            {return true;}
   141   return false;
   169   return false;
   142 }
   170 }
   143 
   171 
   144 symbol_c* search_expression_type_c::common_type(symbol_c *first_type, symbol_c *second_type) {
   172 symbol_c* search_expression_type_c::common_type(symbol_c *first_type, symbol_c *second_type) {
   145   if (first_type == NULL && second_type == NULL) {return NULL;}
   173   if (first_type == NULL && second_type == NULL) {return NULL;}
   146   if (first_type == NULL) {return second_type;}
   174   if (first_type == NULL) {return second_type;}
   147   if (second_type == NULL) {return first_type;}
   175   if (second_type == NULL) {return first_type;}
   148   if (typeid(*first_type) == typeid(*second_type)) {return first_type;}
   176   if (typeid(*first_type) == typeid(*second_type)) {return first_type;}
   149   if (is_integer_type(first_type) && is_literal_integer_type(second_type)) {return first_type;}
   177   if (is_integer_type(first_type)         && is_literal_integer_type(second_type)) {return first_type;}
   150   if (is_literal_integer_type(first_type) && is_integer_type(second_type)) {return second_type;}
   178   if (is_literal_integer_type(first_type) && is_integer_type(second_type))         {return second_type;}
   151   if (is_binary_type(first_type) && is_literal_integer_type(second_type))  {return first_type;}
   179   if (is_binary_type(first_type)          && is_literal_integer_type(second_type)) {return first_type;}
   152   if (is_literal_integer_type(first_type) && is_binary_type(second_type))  {return second_type;}
   180   if (is_literal_integer_type(first_type) && is_binary_type(second_type))          {return second_type;}
   153   if (is_real_type(first_type) && is_literal_real_type(second_type)) {return first_type;}
   181   if (is_real_type(first_type)            && is_literal_real_type(second_type))    {return first_type;}
   154   if (is_literal_real_type(first_type) && is_real_type(second_type)) {return second_type;}
   182   if (is_literal_real_type(first_type)    && is_real_type(second_type))            {return second_type;}
   155   return NULL;
   183   return NULL;
   156 }
   184 }
   157 
   185 
   158 
   186 
   159 integer_c search_expression_type_c::integer("1"); // what default value should we use here ???
   187 integer_c search_expression_type_c::integer("1"); // what default value should we use here ???