absyntax_utils/get_datatype_info.cc
changeset 909 8b2a31dea131
parent 858 c5f145364a4f
child 919 8da635655f37
equal deleted inserted replaced
908:9e8e1ba5ca46 909:8b2a31dea131
    77   protected:
    77   protected:
    78     /********************************/
    78     /********************************/
    79     /* B 1.3.3 - Derived data types */
    79     /* B 1.3.3 - Derived data types */
    80     /********************************/
    80     /********************************/
    81     /*  simple_type_name ':' simple_spec_init */
    81     /*  simple_type_name ':' simple_spec_init */
    82     void *visit(simple_type_declaration_c *symbol)      {return symbol->simple_type_name;}
    82     void *visit(simple_type_declaration_c     *symbol)  {return symbol->simple_type_name;}
    83     /*  subrange_type_name ':' subrange_spec_init */
    83     /*  subrange_type_name ':' subrange_spec_init */
    84     void *visit(subrange_type_declaration_c *symbol)    {return symbol->subrange_type_name;}
    84     void *visit(subrange_type_declaration_c   *symbol)  {return symbol->subrange_type_name;}
    85     /*  enumerated_type_name ':' enumerated_spec_init */
    85     /*  enumerated_type_name ':' enumerated_spec_init */
    86     void *visit(enumerated_type_declaration_c *symbol)  {return symbol->enumerated_type_name;}
    86     void *visit(enumerated_type_declaration_c *symbol)  {return symbol->enumerated_type_name;}
    87     /*  identifier ':' array_spec_init */
    87     /*  identifier ':' array_spec_init */
    88     void *visit(array_type_declaration_c *symbol)       {return symbol->identifier;}
    88     void *visit(array_type_declaration_c      *symbol)  {return symbol->identifier;}
    89     /*  structure_type_name ':' structure_specification */
    89     /*  structure_type_name ':' structure_specification */
    90     void *visit(structure_type_declaration_c *symbol)   {return symbol->structure_type_name;}
    90     void *visit(structure_type_declaration_c  *symbol)  {return symbol->structure_type_name;}
    91     /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
    91     /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
    92     void *visit(string_type_declaration_c *symbol)      {return symbol->string_type_name;}
    92     void *visit(string_type_declaration_c     *symbol)  {return symbol->string_type_name;}
       
    93     /* ref_type_decl: identifier ':' ref_spec_init */
       
    94     void *visit(ref_type_decl_c               *symbol)  {return symbol->ref_type_name;}
    93     
    95     
    94     /*****************************/
    96     /*****************************/
    95     /* B 1.5.2 - Function Blocks */
    97     /* B 1.5.2 - Function Blocks */
    96     /*****************************/
    98     /*****************************/
    97     /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
    99     /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
    98     void *visit(function_block_declaration_c *symbol)      {return symbol->fblock_name;}
   100     void *visit(function_block_declaration_c  *symbol)  {return symbol->fblock_name;}
    99 }; // get_datatype_id_c 
   101 }; // get_datatype_id_c 
   100 
   102 
   101 get_datatype_id_c *get_datatype_id_c::singleton = NULL;
   103 get_datatype_id_c *get_datatype_id_c::singleton = NULL;
   102 
   104 
   103 
   105 
   187 
   189 
   188     /********************************/
   190     /********************************/
   189     /* B 1.3.3 - Derived data types */
   191     /* B 1.3.3 - Derived data types */
   190     /********************************/
   192     /********************************/
   191     /*  simple_type_name ':' simple_spec_init */
   193     /*  simple_type_name ':' simple_spec_init */
   192     void *visit(simple_type_declaration_c *symbol)      {return symbol->simple_type_name->accept(*this);}
   194     void *visit(simple_type_declaration_c     *symbol)  {return symbol->simple_type_name->accept(*this);}
   193     /*  subrange_type_name ':' subrange_spec_init */
   195     /*  subrange_type_name ':' subrange_spec_init */
   194     void *visit(subrange_type_declaration_c *symbol)    {return symbol->subrange_type_name->accept(*this);}
   196     void *visit(subrange_type_declaration_c   *symbol)  {return symbol->subrange_type_name->accept(*this);}
   195     /*  enumerated_type_name ':' enumerated_spec_init */
   197     /*  enumerated_type_name ':' enumerated_spec_init */
   196     void *visit(enumerated_type_declaration_c *symbol)  {return symbol->enumerated_type_name->accept(*this);}
   198     void *visit(enumerated_type_declaration_c *symbol)  {return symbol->enumerated_type_name->accept(*this);}
   197     /*  identifier ':' array_spec_init */
   199     /*  identifier ':' array_spec_init */
   198     void *visit(array_type_declaration_c *symbol)       {return symbol->identifier->accept(*this);}
   200     void *visit(array_type_declaration_c      *symbol)  {return symbol->identifier->accept(*this);}
   199     /*  structure_type_name ':' structure_specification */
   201     /*  structure_type_name ':' structure_specification */
   200     void *visit(structure_type_declaration_c *symbol)   {return symbol->structure_type_name->accept(*this);}
   202     void *visit(structure_type_declaration_c  *symbol)  {return symbol->structure_type_name->accept(*this);}
   201     /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
   203     /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
   202     void *visit(string_type_declaration_c *symbol)      {return symbol->string_type_name->accept(*this);}
   204     void *visit(string_type_declaration_c     *symbol)  {return symbol->string_type_name->accept(*this);}
       
   205     /* ref_type_decl: identifier ':' ref_spec_init */
       
   206     void *visit(ref_type_decl_c               *symbol)  {return symbol->ref_type_name->accept(*this);}
   203     
   207     
   204     /*****************************/
   208     /*****************************/
   205     /* B 1.5.2 - Function Blocks */
   209     /* B 1.5.2 - Function Blocks */
   206     /*****************************/
   210     /*****************************/
   207     /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
   211     /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
   208     void *visit(function_block_declaration_c *symbol)      {return symbol->fblock_name->accept(*this);}    
   212     void *visit(function_block_declaration_c  *symbol)  {return symbol->fblock_name->accept(*this);}    
   209 };
   213 };
   210 
   214 
   211 get_datatype_id_str_c *get_datatype_id_str_c::singleton = NULL;
   215 get_datatype_id_str_c *get_datatype_id_str_c::singleton = NULL;
   212 
   216 
   213 
   217 
   237 bool get_datatype_info_c::is_type_equal(symbol_c *first_type, symbol_c *second_type) {
   241 bool get_datatype_info_c::is_type_equal(symbol_c *first_type, symbol_c *second_type) {
   238   if ((NULL == first_type) || (NULL == second_type))                 {return false;}
   242   if ((NULL == first_type) || (NULL == second_type))                 {return false;}
   239   if (typeid(* first_type) == typeid(invalid_type_name_c))           {return false;}
   243   if (typeid(* first_type) == typeid(invalid_type_name_c))           {return false;}
   240   if (typeid(*second_type) == typeid(invalid_type_name_c))           {return false;}
   244   if (typeid(*second_type) == typeid(invalid_type_name_c))           {return false;}
   241     
   245     
   242   if ((get_datatype_info_c::is_ANY_ELEMENTARY(first_type)) &&
   246   /* ANY_ELEMENTARY */
       
   247   if ((is_ANY_ELEMENTARY(first_type)) &&
   243       (typeid(*first_type) == typeid(*second_type)))                 {return true;}
   248       (typeid(*first_type) == typeid(*second_type)))                 {return true;}
       
   249 
   244   /* ANY_DERIVED */
   250   /* ANY_DERIVED */
       
   251   if (is_ref_to(first_type) && is_ref_to(second_type))
       
   252       return is_type_equal(search_base_type_c::get_basetype_decl(get_ref_to(first_type )),
       
   253                            search_base_type_c::get_basetype_decl(get_ref_to(second_type)));
       
   254 
   245   return (first_type == second_type);
   255   return (first_type == second_type);
   246 }
   256 }
   247 
   257 
   248 
   258 
   249 
   259 
   256 
   266 
   257 
   267 
   258 
   268 
   259 
   269 
   260 
   270 
       
   271 
       
   272 /* returns the datatype the REF_TO datatype references/points to... */ 
       
   273 symbol_c *get_datatype_info_c::get_ref_to(symbol_c *type_symbol) {
       
   274   ref_type_decl_c *type1 = dynamic_cast<ref_type_decl_c *>(type_symbol);
       
   275   if (NULL != type1) type_symbol = type1->ref_spec_init;
       
   276 
       
   277   ref_spec_init_c *type2 = dynamic_cast<ref_spec_init_c *>(type_symbol);
       
   278   if (NULL != type2) type_symbol = type2->ref_spec;
       
   279 
       
   280   ref_spec_c      *type3 = dynamic_cast<ref_spec_c      *>(type_symbol);
       
   281   if (NULL != type3) return type3->type_name;
       
   282   
       
   283   return NULL; /* this is not a ref datatype!! */
       
   284 }
       
   285 
       
   286 
       
   287 
       
   288 
       
   289 
       
   290 
       
   291 bool get_datatype_info_c::is_ref_to(symbol_c *type_symbol) {
       
   292   symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol);
       
   293   if (NULL == type_decl)                                                       {return false;}
       
   294   
       
   295   if (typeid(*type_decl) == typeid(ref_type_decl_c))                           {return true;}   /* identifier ':' ref_spec_init */
       
   296   if (typeid(*type_decl) == typeid(ref_spec_init_c))                           {return true;}   /* ref_spec [ ASSIGN ref_initialization ]; */
       
   297   if (typeid(*type_decl) == typeid(ref_spec_c))                                {return true;}   /* REF_TO (non_generic_type_name | function_block_type_name) */
       
   298   return false;
       
   299 }
       
   300 
       
   301 
       
   302 
       
   303 
   261 bool get_datatype_info_c::is_sfc_initstep(symbol_c *type_symbol) {
   304 bool get_datatype_info_c::is_sfc_initstep(symbol_c *type_symbol) {
   262   symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); 
   305   symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); 
   263   if (NULL == type_decl)                                             {return false;}
   306   if (NULL == type_decl)                                             {return false;}
   264   if (typeid(*type_decl) == typeid(initial_step_c))                  {return true;}   /* INITIAL_STEP step_name ':' action_association_list END_STEP */  /* A pseudo data type! */
   307   if (typeid(*type_decl) == typeid(initial_step_c))                  {return true;}   /* INITIAL_STEP step_name ':' action_association_list END_STEP */  /* A pseudo data type! */
   265   return false;
   308   return false;
   266 }
   309 }
   267 
       
   268 
       
   269 
   310 
   270 
   311 
   271 
   312 
   272 bool get_datatype_info_c::is_sfc_step(symbol_c *type_symbol) {
   313 bool get_datatype_info_c::is_sfc_step(symbol_c *type_symbol) {
   273   symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); 
   314   symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); 
   358 
   399 
   359 
   400 
   360 
   401 
   361 
   402 
   362 
   403 
   363 
       
   364 
       
   365 
       
   366 
       
   367 bool get_datatype_info_c::is_ANY_ELEMENTARY(symbol_c *type_symbol) {
   404 bool get_datatype_info_c::is_ANY_ELEMENTARY(symbol_c *type_symbol) {
   368   if (type_symbol == NULL)                                     {return false;}
   405   if (type_symbol == NULL)                                     {return false;}
   369   if (is_ANY_MAGNITUDE(type_symbol))                           {return true;}
   406   if (is_ANY_MAGNITUDE(type_symbol))                           {return true;}
   370   if (is_ANY_BIT      (type_symbol))                           {return true;}
   407   if (is_ANY_BIT      (type_symbol))                           {return true;}
   371   if (is_ANY_STRING   (type_symbol))                           {return true;}
   408   if (is_ANY_STRING   (type_symbol))                           {return true;}