stage4/generate_c/generate_location_list.cc
author Edouard Tisserant
Tue, 05 Apr 2011 15:14:19 +0200
changeset 279 c0453b7f99df
parent 185 39c23046dad6
child 718 a9f8cc778444
permissions -rwxr-xr-x
Re-generated std lib related code, with updated headers, updated all forgotten headers
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     1
/*
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     3
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     4
 *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     5
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     6
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     7
 *  This program is free software: you can redistribute it and/or modify
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     8
 *  it under the terms of the GNU General Public License as published by
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
     9
 *  the Free Software Foundation, either version 3 of the License, or
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    10
 *  (at your option) any later version.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    11
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    12
 *  This program is distributed in the hope that it will be useful,
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    15
 *  GNU General Public License for more details.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    16
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    17
 *  You should have received a copy of the GNU General Public License
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    18
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 185
diff changeset
    19
 *
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    20
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    21
 * This code is made available on the understanding that it will not be
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    22
 * used in safety-critical situations without a full and competent review.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    23
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    24
185
39c23046dad6 Newer versions of g++ require access controls to be correct!
mario
parents: 70
diff changeset
    25
class generate_location_list_c: public iterator_visitor_c {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    26
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    27
  protected:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    28
    stage4out_c &s4o;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    29
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    30
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    31
    symbol_c *current_var_type_symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    32
    generate_c_base_c *generate_c_base;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    33
    search_base_type_c search_base_type;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    34
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    35
  public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    36
    generate_location_list_c(stage4out_c *s4o_ptr): s4o(*s4o_ptr) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    37
      generate_c_base = new generate_c_base_c(s4o_ptr);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    38
      current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    39
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    40
    ~generate_location_list_c(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    41
      delete generate_c_base;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    42
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    43
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    44
    bool test_location_type(symbol_c *direct_variable) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    45
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    46
      token_c *location = dynamic_cast<token_c *>(direct_variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    47
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    48
      if (location == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    49
        /* invalid identifiers... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    50
        return false;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    51
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    52
      switch (location->value[2]) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    53
        case 'X': // bit
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    54
          if (typeid(*current_var_type_symbol) == typeid(bool_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    55
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    56
        case 'B': // Byte, 8 bits
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    57
          if (typeid(*current_var_type_symbol) == typeid(sint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    58
          if (typeid(*current_var_type_symbol) == typeid(usint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    59
          if (typeid(*current_var_type_symbol) == typeid(string_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    60
          if (typeid(*current_var_type_symbol) == typeid(byte_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    61
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    62
        case 'W': // Word, 16 bits
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    63
          if (typeid(*current_var_type_symbol) == typeid(int_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    64
          if (typeid(*current_var_type_symbol) == typeid(uint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    65
          if (typeid(*current_var_type_symbol) == typeid(word_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    66
          if (typeid(*current_var_type_symbol) == typeid(wstring_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    67
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    68
        case 'D': // Double, 32 bits
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    69
          if (typeid(*current_var_type_symbol) == typeid(dint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    70
          if (typeid(*current_var_type_symbol) == typeid(udint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    71
          if (typeid(*current_var_type_symbol) == typeid(real_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    72
          if (typeid(*current_var_type_symbol) == typeid(dword_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    73
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    74
        case 'L': // Long, 64 bits
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    75
          if (typeid(*current_var_type_symbol) == typeid(lint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    76
          if (typeid(*current_var_type_symbol) == typeid(ulint_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    77
          if (typeid(*current_var_type_symbol) == typeid(lreal_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    78
          if (typeid(*current_var_type_symbol) == typeid(lword_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    79
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    80
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    81
          if (typeid(*current_var_type_symbol) == typeid(bool_type_name_c)) return true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    82
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    83
      return false;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    84
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    85
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    86
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    87
/* B.1.4.1   Directly Represented Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    88
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    89
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    90
    void *visit(direct_variable_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    91
      if (current_var_type_symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    92
        s4o.print("__LOCATED_VAR(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    93
        current_var_type_symbol->accept(*generate_c_base);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    94
        s4o.print(",");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    95
        /* Do not use print_token() as it will change everything into uppercase */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    96
        s4o.printlocation((symbol->value)+1);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    97
        s4o.print(",");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    98
        s4o.printlocation_comasep((symbol->value)+1);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    99
        s4o.print(")\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   100
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   101
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   102
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   103
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   104
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   105
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   106
/* B.1.4.3   Declaration and initilization  */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   107
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   108
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   109
/*  [variable_name] location ':' located_var_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   110
/* variable_name -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   111
//SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   112
    void *visit(located_var_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   113
        current_var_type_symbol = spec_init_sperator_c::get_spec(symbol->located_var_spec_init);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   114
        if (current_var_type_symbol == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   115
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   116
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   117
        current_var_type_symbol = (symbol_c *)(current_var_type_symbol->accept(search_base_type));
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   118
        if (current_var_type_symbol == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   119
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   120
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   121
        symbol->location->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   122
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   123
        current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   124
        return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   125
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   126
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   127
/*| global_var_spec ':' [located_var_spec_init|function_block_type_name] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   128
/* type_specification ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   129
//SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   130
    void *visit(global_var_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   131
        current_var_type_symbol = spec_init_sperator_c::get_spec(symbol->type_specification);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   132
        if (current_var_type_symbol == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   133
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   134
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   135
        current_var_type_symbol = (symbol_c *)(current_var_type_symbol->accept(search_base_type));
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   136
        if (current_var_type_symbol == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   137
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   138
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   139
        symbol->global_var_spec->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   140
        
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   141
        current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   142
        return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   143
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   144
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   145
/*  AT direct_variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   146
//SYM_REF2(location_c, direct_variable, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   147
    void *visit(location_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   148
      if (test_location_type(symbol->direct_variable))
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   149
        symbol->direct_variable->accept(*this); 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   150
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   151
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   152
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   153
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   154
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   155
}; /* generate_location_list_c */