absyntax_utils/search_constant_type.cc
changeset 181 38d6eb056260
child 194 e18690830555
equal deleted inserted replaced
180:64334c5a00b1 181:38d6eb056260
       
     1 /*
       
     2  * (c) 2003 Mario de Sousa
       
     3  *
       
     4  * Offered to the public under the terms of the GNU General Public License
       
     5  * as published by the Free Software Foundation; either version 2 of the
       
     6  * License, or (at your option) any later version.
       
     7  *
       
     8  * This program is distributed in the hope that it will be useful, but
       
     9  * WITHOUT ANY WARRANTY; without even the implied warranty of
       
    10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
       
    11  * Public License for more details.
       
    12  *
       
    13  * This code is made available on the understanding that it will not be
       
    14  * used in safety-critical situations without a full and competent review.
       
    15  */
       
    16 
       
    17 /*
       
    18  * An IEC 61131-3 IL and ST compiler.
       
    19  *
       
    20  * Based on the
       
    21  * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
       
    22  *
       
    23  */
       
    24 
       
    25 /* Determine the data type of a specific constant or variable.
       
    26  * A reference to the relevant type definition is returned.
       
    27  *
       
    28  * For example:
       
    29  *       22          -> returns reference to a int_type_name_c object.
       
    30  *       22.2        -> returns reference to a real_type_name_c object.
       
    31  *       LREAL#22.2  -> returns reference to a lreal_type_name_c object.
       
    32  *       etc...
       
    33  */
       
    34 
       
    35 
       
    36 #include "search_constant_type.hh"
       
    37 
       
    38 #define ERROR error_exit(__FILE__,__LINE__)
       
    39 /* function defined in main.cc */
       
    40 extern void error_exit(const char *file_name, int line_no);
       
    41 
       
    42 symbol_c *search_constant_type_c::get_type(symbol_c *constant) {
       
    43   return (symbol_c *)constant->accept(*this);
       
    44 }
       
    45 
       
    46 
       
    47 /*********************/
       
    48 /* B 1.2 - Constants */
       
    49 /*********************/
       
    50 
       
    51 /******************************/
       
    52 /* B 1.2.1 - Numeric Literals */
       
    53 /******************************/
       
    54 void *search_constant_type_c::visit(real_c *symbol) {return (void *)&constant_real_type_name;}
       
    55 void *search_constant_type_c::visit(integer_c *symbol) {return (void *)&constant_int_type_name;}
       
    56 void *search_constant_type_c::visit(binary_integer_c *symbol) {return (void *)&constant_int_type_name;}
       
    57 void *search_constant_type_c::visit(octal_integer_c *symbol) {return (void *)&constant_int_type_name;}
       
    58 void *search_constant_type_c::visit(hex_integer_c *symbol) {return (void *)&constant_int_type_name;}
       
    59 
       
    60 void *search_constant_type_c::visit(numeric_literal_c *symbol)
       
    61   {return (void *)((symbol->type!=NULL)?symbol->type:symbol->value->accept(*this));}
       
    62 void *search_constant_type_c::visit(integer_literal_c *symbol)
       
    63   {return (void *)((symbol->type!=NULL)?symbol->type:symbol->value->accept(*this));}
       
    64 void *search_constant_type_c::visit(real_literal_c *symbol)
       
    65   {return (void *)((symbol->type!=NULL)?symbol->type:symbol->value->accept(*this));}
       
    66 void *search_constant_type_c::visit(bit_string_literal_c *symbol)
       
    67   {return (void *)((symbol->type!=NULL)?symbol->type:symbol->value->accept(*this));}
       
    68 void *search_constant_type_c::visit(boolean_literal_c *symbol)
       
    69   {return (void *)((symbol->type!=NULL)?symbol->type:symbol->value->accept(*this));}
       
    70 
       
    71 /*******************************/
       
    72 /* B.1.2.2   Character Strings */
       
    73 /*******************************/
       
    74 void *search_constant_type_c::visit(double_byte_character_string_c *symbol) {return (void *)&wstring_type_name;}
       
    75 void *search_constant_type_c::visit(single_byte_character_string_c *symbol) {return (void *)&string_type_name;}
       
    76 
       
    77 /***************************/
       
    78 /* B 1.2.3 - Time Literals */
       
    79 /***************************/
       
    80 /************************/
       
    81 /* B 1.2.3.1 - Duration */
       
    82 /************************/
       
    83 void *search_constant_type_c::visit(neg_time_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    84 void *search_constant_type_c::visit(duration_c *symbol) {return (void *)&time_type_name;}
       
    85 void *search_constant_type_c::visit(fixed_point_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    86 void *search_constant_type_c::visit(days_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    87 void *search_constant_type_c::visit(hours_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    88 void *search_constant_type_c::visit(minutes_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    89 void *search_constant_type_c::visit(seconds_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    90 void *search_constant_type_c::visit(milliseconds_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    91 
       
    92 /************************************/
       
    93 /* B 1.2.3.2 - Time of day and Date */
       
    94 /************************************/
       
    95 void *search_constant_type_c::visit(time_of_day_c *symbol) {return (void *)&tod_type_name;}
       
    96 void *search_constant_type_c::visit(daytime_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    97 void *search_constant_type_c::visit(date_c *symbol) {return (void *)&date_type_name;}
       
    98 void *search_constant_type_c::visit(date_literal_c *symbol) {ERROR; return NULL;}  /* this member function should never be called. */
       
    99 void *search_constant_type_c::visit(date_and_time_c *symbol) {return (void *)&dt_type_name;}
       
   100 
       
   101 real_type_name_c     search_constant_type_c::real_type_name;
       
   102 sint_type_name_c     search_constant_type_c::sint_type_name;
       
   103 lint_type_name_c     search_constant_type_c::lint_type_name;
       
   104 dint_type_name_c     search_constant_type_c::dint_type_name;
       
   105 date_type_name_c     search_constant_type_c::date_type_name;
       
   106 dword_type_name_c     search_constant_type_c::dword_type_name;
       
   107 dt_type_name_c     search_constant_type_c::dt_type_name;
       
   108 tod_type_name_c     search_constant_type_c::tod_type_name;
       
   109 udint_type_name_c     search_constant_type_c::udint_type_name;
       
   110 word_type_name_c     search_constant_type_c::word_type_name;
       
   111 wstring_type_name_c     search_constant_type_c::wstring_type_name;
       
   112 string_type_name_c     search_constant_type_c::string_type_name;
       
   113 lword_type_name_c     search_constant_type_c::lword_type_name;
       
   114 uint_type_name_c     search_constant_type_c::uint_type_name;
       
   115 lreal_type_name_c     search_constant_type_c::lreal_type_name;
       
   116 byte_type_name_c     search_constant_type_c::byte_type_name;
       
   117 usint_type_name_c     search_constant_type_c::usint_type_name;
       
   118 ulint_type_name_c     search_constant_type_c::ulint_type_name;
       
   119 bool_type_name_c     search_constant_type_c::bool_type_name;
       
   120 time_type_name_c     search_constant_type_c::time_type_name;
       
   121 int_type_name_c     search_constant_type_c::int_type_name;
       
   122 
       
   123 constant_real_type_name_c     search_constant_type_c::constant_real_type_name;
       
   124 constant_int_type_name_c      search_constant_type_c::constant_int_type_name;
       
   125 direct_variable_type_name_c   search_constant_type_c::direct_variable_type_name;