stage4/generate_c/generate_location_list.cc
author Manuele Conti <conti.ma@alice.it>
Mon, 30 Jul 2012 22:59:00 +0200
changeset 622 eaa49b276e17
parent 279 c0453b7f99df
child 718 a9f8cc778444
permissions -rwxr-xr-x
Add check bison version in configure.ac file.
To build correctly matiec we need bison greater or equals than 2.4 version.
Now the "configure" script is able to check if system has correctly requirements.
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 */