stage4/generate_c/generate_c_vardecl.cc
author mjsousa
Sun, 13 Jul 2014 13:47:16 +0100
changeset 910 a0518971127d
parent 885 b2604fc6d25c
child 913 1c74da17cb61
permissions -rw-r--r--
Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
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: 242
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: 242
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: 242
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: 242
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: 242
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: 242
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: 242
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: 242
diff changeset
    11
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
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: 242
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: 242
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: 242
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: 242
diff changeset
    16
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
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: 242
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: 242
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
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    25
#include <limits>  // required for std::numeric_limits<XXX>
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    26
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    27
class initialization_analyzer_c: public null_visitor_c {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    28
  public:
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    29
    typedef enum {
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    30
      simple_it,
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    31
      array_it,
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    32
      struct_it
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    33
    } initialization_type_t;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    34
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    35
  private:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    36
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    37
    initialization_type_t current_type;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    38
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    39
  public:
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    40
    initialization_analyzer_c(symbol_c* symbol) {
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    41
      current_type = simple_it;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    42
      symbol->accept(*this);
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    43
    }
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    44
    ~initialization_analyzer_c(void) {}
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    45
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    46
    initialization_type_t get_initialization_type(void) {
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    47
      return current_type;
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    48
    }
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    49
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    50
    void *visit(array_initial_elements_list_c *symbol) {
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    51
      current_type = array_it;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    52
      return NULL;
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
    53
    }
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    54
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    55
    void *visit(structure_element_initialization_list_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    56
      current_type = struct_it;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    57
      return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    58
    }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    59
};
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    60
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    61
class generate_c_array_initialization_c: public generate_c_typedecl_c {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    62
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    63
  public:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    64
    typedef enum {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    65
      none_am,
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    66
      arraysize_am,
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    67
      typedecl_am,
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    68
      initializationvalue_am
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    69
    } arrayinitialization_mode_t;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    70
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    71
    arrayinitialization_mode_t current_mode;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    72
    
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    73
    symbol_c* array_base_type;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    74
    symbol_c* array_default_value;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    75
    symbol_c* array_default_initialization;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    76
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    77
  private:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    78
    int current_dimension;
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    79
    unsigned long long int array_size;
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    80
    unsigned long long int defined_values_count;
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    81
    unsigned long long int current_initialization_count;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    82
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    83
  public:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    84
    generate_c_array_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    85
    ~generate_c_array_initialization_c(void) {}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    86
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    87
    void init_array_size(symbol_c *array_specification) {
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    88
      array_size = 1;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    89
      defined_values_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    90
      current_initialization_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    91
      array_base_type = array_default_value = array_default_initialization = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    92
      
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    93
      current_mode = arraysize_am;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    94
      array_specification->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    95
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    96
635
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
    97
    void set_array_default_initialisation(symbol_c *array_initialization) {
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
    98
      array_default_initialization = array_initialization;
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
    99
    }
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   100
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   101
    void init_array(symbol_c *var1_list, symbol_c *array_specification, symbol_c *array_initialization) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   102
      int i;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   103
      
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   104
      init_array_size(array_specification);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   105
      
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   106
      s4o.print("\n");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   107
      s4o.print(s4o.indent_spaces + "{\n");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   108
      s4o.indent_right();
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   109
      s4o.print(s4o.indent_spaces);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   110
      s4o.print("static const ");
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   111
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   112
      current_mode = typedecl_am;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   113
      array_specification->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   114
      s4o.print(" temp = ");
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   115
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   116
      init_array_values(array_initialization);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   117
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   118
      s4o.print(";\n");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   119
      var1_list->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   120
      s4o.indent_left();
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   121
      s4o.print(s4o.indent_spaces + "}");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   122
    }
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   123
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   124
    void init_array_values(symbol_c *array_initialization) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   125
      s4o.print("{{");
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   126
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   127
      current_mode = initializationvalue_am;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   128
      array_initialization->accept(*this);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   129
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   130
      if (array_default_initialization != NULL && defined_values_count < array_size)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   131
        array_default_initialization->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   132
      if (defined_values_count < array_size) {
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   133
        for (unsigned long long int i = defined_values_count; i < array_size; i++) {
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   134
          if (defined_values_count > 0)
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   135
            s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   136
          array_default_value->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   137
          defined_values_count++;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   138
        }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   139
      }
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   140
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   141
      s4o.print("}}");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   142
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   143
    
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   144
    void *visit(identifier_c *type_name) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   145
      symbol_c *type_decl;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   146
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   147
        case arraysize_am:
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   148
          /* look up the type declaration... */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   149
          type_decl = type_symtable.find_value(type_name);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   150
          if (type_decl == type_symtable.end_value())
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   151
            /* Type declaration not found!! */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   152
            ERROR;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   153
          type_decl->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   154
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   155
        default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   156
          print_token(type_name);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   157
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   158
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   159
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   160
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   161
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   162
    void *visit(var1_list_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   163
      int i, j;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   164
      
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   165
      for (i = 0; i < symbol->n; i++) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   166
        s4o.print(s4o.indent_spaces);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   167
        s4o.print(SET_VAR);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   168
        s4o.print("(");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   169
        print_variable_prefix();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   170
        s4o.print(",");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   171
        symbol->elements[i]->accept(*this);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 854
diff changeset
   172
        s4o.print(",,temp);\n");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   173
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   174
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   175
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   176
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   177
/********************************/
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   178
/* B 1.3.3 - Derived data types */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   179
/********************************/
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   180
    
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   181
    /* array_specification [ASSIGN array_initialization] */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   182
    /* array_initialization may be NULL ! */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   183
    void *visit(array_spec_init_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   184
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   185
        case arraysize_am:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   186
          array_default_initialization = symbol->array_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   187
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   188
        default:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   189
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   190
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   191
      symbol->array_specification->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   192
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   193
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   194
    
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   195
    /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   196
    void *visit(array_specification_c *symbol) {
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   197
      identifier_c* type_name;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   198
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   199
        case arraysize_am:
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   200
          symbol->array_subrange_list->accept(*this);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   201
          array_base_type = symbol->non_generic_type_name;
762
a3d917474ae4 Small code cleanup.
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
   202
          array_default_value = type_initial_value_c::get(symbol->non_generic_type_name);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   203
          if (array_default_value == NULL) ERROR;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   204
          break;
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   205
        case typedecl_am:
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   206
          s4o.print("__");
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   207
          symbol->non_generic_type_name->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   208
          symbol->array_subrange_list->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   209
          break;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   210
        default:
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   211
          symbol->array_subrange_list->accept(*this);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   212
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   213
      } 
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   214
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   215
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   216
    
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   217
    /*  signed_integer DOTDOT signed_integer */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   218
    //SYM_REF2(subrange_c, lower_limit, upper_limit)
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   219
    void *visit(subrange_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   220
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   221
        case arraysize_am:
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   222
          /* res = a * b; --->  Check for overflow by pre-condition: If (UINT_MAX / a) < b => overflow! */
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   223
          if ((std::numeric_limits< unsigned long long int >::max() / array_size) < symbol->dimension)
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   224
            STAGE4_ERROR(symbol, symbol, "The array containing this subrange has a total number of elements larger than the maximum currently supported (%llu).", 
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   225
                         std::numeric_limits< unsigned long long int >::max());
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   226
          array_size *= symbol->dimension;
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   227
          break;
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   228
        case typedecl_am:
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   229
          s4o.print("_");
594
c8092e909886 Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents: 592
diff changeset
   230
          s4o.print(symbol->dimension);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   231
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   232
        default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   233
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   234
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   235
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   236
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   237
    
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   238
    /* helper symbol for array_initialization */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   239
    /* array_initial_elements_list ',' array_initial_elements */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   240
    void *visit(array_initial_elements_list_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   241
      switch (current_mode) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   242
        case initializationvalue_am:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   243
          current_initialization_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   244
          for (int i = 0; i < symbol->n; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   245
            if (current_initialization_count >= defined_values_count) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   246
              if (defined_values_count >= array_size)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   247
                ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   248
              if (defined_values_count > 0)
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   249
                s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   250
              symbol->elements[i]->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   251
              defined_values_count++;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   252
            }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   253
            else {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   254
              array_initial_elements_c *array_initial_element = dynamic_cast<array_initial_elements_c *>(symbol->elements[i]);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   255
            
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   256
              if (array_initial_element != NULL) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   257
                symbol->elements[i]->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   258
              }
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   259
            }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   260
            current_initialization_count++;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   261
          }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   262
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   263
        default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   264
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   265
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   266
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   267
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   268
    
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   269
    /* integer '(' [array_initial_element] ')' */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   270
    /* array_initial_element may be NULL ! */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   271
    void *visit(array_initial_elements_c *symbol) {
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   272
      unsigned long long int initial_element_count;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   273
 
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   274
      /* This code assumes that unsigned long long int is >= uint64_t */
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   275
      if (std::numeric_limits< uint64_t >::max() > std::numeric_limits< unsigned long long int >::max()) 
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   276
        ERROR_MSG("Assertion (sizeof(uint64_t) > sizeof(unsigned long long int)) failed! Compiler cannot execute correctly on the current platform!");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   277
      
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   278
      switch (current_mode) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   279
        case initializationvalue_am:
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   280
          if      (VALID_CVALUE( int64, symbol->integer) && (GET_CVALUE( int64, symbol->integer) >= 0))
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   281
            initial_element_count = GET_CVALUE( int64, symbol->integer);
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   282
          else if (VALID_CVALUE(uint64, symbol->integer))
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   283
            initial_element_count = GET_CVALUE(uint64, symbol->integer);
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   284
          else ERROR;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   285
     
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   286
          if (current_initialization_count < defined_values_count) {
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   287
            unsigned long long int temp_element_number = 0;
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   288
            unsigned long long int diff = defined_values_count - current_initialization_count;
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   289
            if (diff <= initial_element_count)
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   290
              temp_element_number = initial_element_count - diff;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   291
            current_initialization_count += initial_element_count - 1;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   292
            initial_element_count = temp_element_number;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   293
            if (initial_element_count > 0) {
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   294
              defined_values_count++;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   295
              s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   296
            }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   297
          }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   298
          else
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   299
            current_initialization_count += initial_element_count - 1;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   300
          if (defined_values_count + initial_element_count > array_size)
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   301
            ERROR;
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   302
          for (unsigned long long int i = 0; i < initial_element_count; i++) {
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   303
            if (i > 0)
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   304
              s4o.print(",");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   305
            if (symbol->array_initial_element != NULL) {
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   306
              symbol->array_initial_element->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   307
            }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   308
            else {
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   309
              array_default_value->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   310
            }
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   311
          }
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   312
          if (initial_element_count > 1)
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   313
            defined_values_count += initial_element_count - 1;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   314
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   315
        default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   316
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   317
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   318
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   319
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   320
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   321
    void *visit(structure_element_initialization_list_c *symbol);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   322
};
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   323
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   324
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   325
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   326
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   327
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   328
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   329
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   330
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   331
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   332
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   333
/* given a structure_element_declaration_list_c, iterate 
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   334
 * through each element, returning the name
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   335
 * of each element...structure_element_iterator_c
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   336
 */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   337
class structure_element_iterator_c : public null_visitor_c {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   338
  
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   339
  private:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   340
    /* a pointer to the structure_element_declaration_list_c
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   341
     * currently being analysed.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   342
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   343
    symbol_c *type_decl;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   344
    int next_element, element_count;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   345
    identifier_c *current_element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   346
    symbol_c *current_element_type;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   347
    symbol_c *current_element_default_value;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   348
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   349
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   350
  public:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   351
    /* start off at the first parameter once again... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   352
    void reset(void) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   353
      next_element = element_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   354
      current_element_name = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   355
      current_element_type = current_element_default_value = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   356
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   357
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   358
    /* initialise the iterator object.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   359
     * We must be given a reference to the function declaration
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   360
     * that will be analysed...
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   361
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   362
    structure_element_iterator_c(symbol_c *type_decl) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   363
      this->type_decl = type_decl;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   364
      reset();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   365
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   366
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   367
    /* Skip to the next element. After object creation,
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   368
     * the object references on 
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   369
     * element _before_ the first, so
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   370
     * this function must be called once to get the object to
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   371
     * reference the first element...
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   372
     *
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   373
     * Returns the element's name!
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   374
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   375
    identifier_c *next(void) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   376
      void *res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   377
      identifier_c *identifier;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   378
      element_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   379
      next_element++;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   380
      res = type_decl->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   381
      if (res != NULL) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   382
        symbol_c *sym = (symbol_c *)res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   383
        identifier = dynamic_cast<identifier_c *>(sym);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   384
        if (identifier == NULL)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   385
          ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   386
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   387
      else
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   388
        return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   389
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   390
      current_element_name = identifier;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   391
      return current_element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   392
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   393
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   394
    /* Returns the currently referenced element's default value,
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   395
     * or NULL if none is specified in the structure declaration itself.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   396
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   397
    symbol_c *default_value(void) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   398
      return current_element_default_value;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   399
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   400
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   401
    /* Returns the currently referenced element's type name. */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   402
    symbol_c *element_type(void) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   403
      return current_element_type;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   404
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   405
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   406
/********************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   407
/* B 1.3.3 - Derived data types */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   408
/********************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   409
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   410
    /* helper symbol for structure_declaration */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   411
    /* structure_element_declaration_list structure_element_declaration ';' */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   412
    void *visit(structure_element_declaration_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   413
      void *res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   414
      for (int i = 0; i < symbol->n; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   415
        res = symbol->elements[i]->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   416
        if (res != NULL)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   417
          return res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   418
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   419
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   420
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   421
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   422
    /*  structure_element_name ':' *_spec_init */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   423
    void *visit(structure_element_declaration_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   424
      element_count++;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   425
      if (next_element == element_count) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   426
        current_element_default_value = spec_init_sperator_c::get_init(symbol->spec_init);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   427
        current_element_type = spec_init_sperator_c::get_spec(symbol->spec_init);
635
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   428
        if (current_element_type == NULL) ERROR;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   429
        return symbol->structure_element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   430
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   431
      /* not yet the desired element... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   432
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   433
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   434
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   435
};
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   436
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   437
/*
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   438
 * Structure init element iterator.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   439
 * It will search through the elements of a structure initialization
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   440
 */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   441
class structure_init_element_iterator_c : public null_visitor_c {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   442
  private:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   443
    /* a pointer to the structure initialization
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   444
     * currently being analysed.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   445
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   446
    symbol_c *structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   447
    identifier_c *search_element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   448
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   449
  public:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   450
    /* initialise the iterator object.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   451
     * We must be given a reference to the structure initialization
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   452
     * that will be analysed...
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   453
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   454
    structure_init_element_iterator_c(symbol_c *structure_initialization) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   455
      this->structure_initialization = structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   456
      search_element_name = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   457
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   458
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   459
    /* Search for the value passed to the element named <element_name>...  */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   460
    symbol_c *search(symbol_c *element_name) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   461
      if (NULL == element_name) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   462
      search_element_name = dynamic_cast<identifier_c *>(element_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   463
      if (NULL == search_element_name) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   464
      void *res = structure_initialization->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   465
      return (symbol_c *)res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   466
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   467
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   468
    /* helper symbol for structure_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   469
    /* structure_element_initialization_list ',' structure_element_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   470
    void *visit(structure_element_initialization_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   471
      void *res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   472
      for (int i = 0; i < symbol->n; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   473
        res = symbol->elements[i]->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   474
        if (res != NULL)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   475
          return res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   476
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   477
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   478
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   479
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   480
    /*  structure_element_name ASSIGN value */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   481
    void *visit(structure_element_initialization_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   482
      identifier_c *element_name = dynamic_cast<identifier_c *>(symbol->structure_element_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   483
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   484
      if (element_name == NULL) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   485
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   486
      if (strcasecmp(search_element_name->value, element_name->value) == 0)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   487
        /* FOUND! This is the same element!! */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   488
        return (void *)symbol->value;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   489
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   490
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   491
};
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   492
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   493
class generate_c_structure_initialization_c: public generate_c_typedecl_c {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   494
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   495
  public:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   496
    typedef enum {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   497
      none_sm,
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   498
      initdefault_sm,
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   499
      typedecl_sm,
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   500
      initializationvalue_sm
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   501
    } structureinitialization_mode_t;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   502
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   503
    structureinitialization_mode_t current_mode;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   504
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   505
  private:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   506
    symbol_c* structure_type_decl;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   507
    symbol_c* current_element_type;
635
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   508
    symbol_c* current_element_default_value;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   509
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   510
  public:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   511
    generate_c_structure_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {}
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   512
    ~generate_c_structure_initialization_c(void) {}
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   513
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   514
    void init_structure_default(symbol_c *structure_type_name) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   515
      structure_type_decl = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   516
      current_element_type = NULL;
635
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   517
      current_element_default_value = NULL;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   518
      
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   519
      current_mode = initdefault_sm;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   520
      structure_type_name->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   521
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   522
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   523
    void init_structure(symbol_c *var1_list, symbol_c *structure_type_name, symbol_c *structure_initialization) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   524
      int i;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   525
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   526
      init_structure_default(structure_type_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   527
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   528
      s4o.print("\n");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   529
      s4o.print(s4o.indent_spaces + "{\n");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   530
      s4o.indent_right();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   531
      s4o.print(s4o.indent_spaces);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   532
      s4o.print("static const ");
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   533
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   534
      current_mode = typedecl_sm;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   535
      structure_type_name->accept(*this);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   536
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   537
      s4o.print(" temp = ");
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   538
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   539
      init_structure_values(structure_initialization);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   540
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   541
      s4o.print(";\n");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   542
      var1_list->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   543
      s4o.indent_left();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   544
      s4o.print(s4o.indent_spaces + "}");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   545
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   546
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   547
    void init_structure_values(symbol_c *structure_initialization) {
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   548
      current_mode = initializationvalue_sm;
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   549
      structure_initialization->accept(*this);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   550
    }
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   551
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   552
    void *visit(identifier_c *type_name) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   553
      symbol_c *type_decl;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   554
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   555
        case initdefault_sm:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   556
          /* look up the type declaration... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   557
          type_decl = type_symtable.find_value(type_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   558
          if (type_decl == type_symtable.end_value())
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   559
            /* Type declaration not found!! */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   560
            ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   561
          type_decl->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   562
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   563
        default:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   564
          print_token(type_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   565
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   566
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   567
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   568
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   569
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   570
    void *visit(var1_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   571
      int i, j;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   572
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   573
      for (i = 0; i < symbol->n; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   574
        s4o.print(s4o.indent_spaces);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   575
        s4o.print(SET_VAR);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   576
        s4o.print("(");
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
   577
        print_variable_prefix();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   578
        s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   579
        symbol->elements[i]->accept(*this);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 854
diff changeset
   580
        s4o.print(",,temp);\n");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   581
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   582
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   583
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   584
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   585
/********************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   586
/* B 1.3.3 - Derived data types */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   587
/********************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   588
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   589
    /* helper symbol for structure_declaration */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   590
    /* structure_element_declaration_list structure_element_declaration ';' */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   591
    void *visit(structure_element_declaration_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   592
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   593
        case initdefault_sm:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   594
          structure_type_decl = (symbol_c *)symbol;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   595
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   596
        default:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   597
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   598
      } 
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   599
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   600
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   601
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   602
    /* helper symbol for structure_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   603
    /* structure_element_initialization_list ',' structure_element_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   604
    void *visit(structure_element_initialization_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   605
      s4o.print("{");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   606
      structure_element_iterator_c structure_iterator(structure_type_decl);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   607
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   608
      identifier_c *element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   609
      structure_init_element_iterator_c structure_init_element_iterator(symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   610
      for(int i = 1; (element_name = structure_iterator.next()) != NULL; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   611
        if (i > 1)
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   612
          s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   613
        
635
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   614
        current_element_type = structure_iterator.element_type();
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   615
        if (current_element_type == NULL) ERROR;
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   616
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   617
        /* Check whether default value specified in structure declaration...*/
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   618
        current_element_default_value = structure_iterator.default_value();
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   619
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   620
        /* Get the value from an initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   621
        symbol_c *element_value = structure_init_element_iterator.search(element_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   622
        
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   623
        if (element_value == NULL) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   624
          /* No value given for parameter, so we must use the default... */
635
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   625
          element_value = current_element_default_value;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   626
        }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   627
        
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   628
        if (element_value == NULL) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   629
          /* If not, get the default value of this variable's type */
762
a3d917474ae4 Small code cleanup.
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
   630
          element_value = type_initial_value_c::get(current_element_type);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   631
        }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   632
        
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   633
        if (element_value == NULL) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   634
        
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   635
        initialization_analyzer_c initialization_analyzer(element_value);
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   636
            
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   637
        if (initialization_analyzer.get_initialization_type() == initialization_analyzer_c::struct_it) {
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   638
          generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   639
          structure_initialization->init_structure_default(current_element_type);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   640
          structure_initialization->init_structure_values(element_value);
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   641
          delete structure_initialization;
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   642
        }
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   643
        else {
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   644
          element_value->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   645
        }
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   646
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   647
      s4o.print("}");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   648
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   649
    }
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   650
    
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   651
    /* helper symbol for array_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   652
    /* array_initial_elements_list ',' array_initial_elements */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   653
    void *visit(array_initial_elements_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   654
      generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   655
      array_initialization->init_array_size(current_element_type);
635
a20a70021d37 Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents: 596
diff changeset
   656
      if (current_element_default_value != NULL)
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   657
        array_initialization->set_array_default_initialisation(current_element_default_value);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   658
      array_initialization->init_array_values(symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   659
      delete array_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   660
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   661
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   662
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   663
};
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   664
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   665
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   666
/* helper symbol for array_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   667
/* structure_element_initialization_list ',' structure_element_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   668
void *generate_c_array_initialization_c::visit(structure_element_initialization_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   669
  generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   670
  structure_initialization->init_structure_default(array_base_type);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   671
  structure_initialization->init_structure_values(symbol);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   672
  delete structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   673
  return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   674
}
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   675
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   676
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   677
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   678
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   679
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   680
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   681
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   682
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   683
/***********************************************************************/
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   684
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   685
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   686
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   687
class generate_c_vardecl_c: protected generate_c_typedecl_c {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   688
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   689
  /* A Helper class to the main class... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   690
  /* print a string, except the first time it is called */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   691
  /* used to print the separator "," before each variable
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   692
   * declaration, except the first...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   693
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   694
   * Needs to be done in a seperate class because this is called
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   695
   * from within various locations within the code.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   696
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   697
  class next_var_c {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   698
    private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   699
      bool print_flag;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   700
      std::string str1, str2;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   701
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   702
      next_var_c *embedded_scope;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   703
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   704
    public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   705
      next_var_c(std::string s1, std::string s2) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   706
        str1 = s1;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   707
        str2 = s2;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   708
        print_flag = false;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   709
        embedded_scope = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   710
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   711
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   712
      std::string get(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   713
        if (NULL != embedded_scope)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   714
          return embedded_scope->get();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   715
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   716
        bool old_print_flag = print_flag;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   717
        print_flag = true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   718
        if (!old_print_flag)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   719
          return str1;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   720
        else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   721
          return str2;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   722
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   723
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   724
      /* Create a new next_var_c for an embedded scope.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   725
       * From now on, every call to get() will return the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   726
       * inner-most scope...!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   727
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   728
      void push(std::string s1, std::string s2) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   729
        if (NULL != embedded_scope)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   730
          return embedded_scope->push(s1, s2);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   731
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   732
        embedded_scope = new next_var_c(s1, s2);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   733
        if (NULL == embedded_scope)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   734
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   735
        return;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   736
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   737
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   738
      /* Remove the inner-most scope... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   739
      void pop(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   740
        if (NULL != embedded_scope)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   741
          return embedded_scope->pop();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   742
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   743
        delete embedded_scope;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   744
        embedded_scope = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   745
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   746
  };
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   747
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   748
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   749
    /* used to generate the ',' separating the parameters in a function call */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   750
    next_var_c *nv;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   751
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   752
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   753
  public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   754
    /* the types of variables that need to be processed... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   755
    static const unsigned int none_vt	  = 0x0000;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   756
    static const unsigned int input_vt	  = 0x0001;  // VAR_INPUT
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   757
    static const unsigned int output_vt	  = 0x0002;  // VAR_OUTPUT
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   758
    static const unsigned int inoutput_vt = 0x0004;  // VAR_IN_OUT
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   759
    static const unsigned int private_vt  = 0x0008;  // VAR
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   760
    static const unsigned int temp_vt	  = 0x0010;  // VAR_TEMP
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   761
    static const unsigned int external_vt = 0x0020;  // VAR_EXTERNAL
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   762
    static const unsigned int global_vt   = 0x0040;  // VAR_GLOBAL
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   763
						     //    Globals declared inside a resource will not be declared
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   764
						     //    unless global_vt is acompanied by resource_vt
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   765
    static const unsigned int located_vt  = 0x0080;  // VAR <var_name> AT <location>
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   766
    static const unsigned int program_vt  = 0x0100;  // PROGRAM (inside a configuration!)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   767
						     //    Programs declared inside a resource will not be declared
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   768
						     //    unless program_vt is acompanied by resource_vt
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   769
    static const unsigned int en_vt       = 0x0200;  // EN  declaration
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   770
    static const unsigned int eno_vt      = 0x0400;  // ENO declaration
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   771
    static const unsigned int resource_vt = 0x8000;  // RESOURCE (inside a configuration!)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   772
                                                     //    This, just of itself, will not print out any declarations!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   773
						     //    It must be acompanied by either program_vt and/or global_vt
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   774
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   775
    /* the qualifier of variables that need to be processed... */
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   776
    static const unsigned int none_vq        = 0x0000;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   777
    static const unsigned int constant_vq    = 0x0001;  // CONSTANT
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   778
    static const unsigned int retain_vq      = 0x0002;  // RETAIN
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   779
    static const unsigned int non_retain_vq  = 0x0004;  // NON_RETAIN
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   780
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   781
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   782
    /* How variables should be declared: as local variables or
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   783
     * variables within a function call interface.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   784
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   785
     * This will define the format of the output generated
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   786
     * by this class.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   787
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   788
     * finterface_vf: function interface parameters
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   789
     *               e.g.  f(  int a, long b, real c );
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   790
     *                         ---------------------
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   791
     *               This class/function will produce the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   792
     *               underlined code of the above examples,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   793
     *               and no more!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   794
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   795
     * localinit_vf: local declaration. Will include variable
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   796
     *           initialisation if it is not a located variable.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   797
     *           e.g.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   798
     *                int a = 9;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   799
     *                long b = 99;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   800
     *                real c = 99.9;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   801
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   802
     * local_vf: local declaration. Will NOT include variable
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   803
     *           initialisation.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   804
     *           e.g.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   805
     *                int a;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   806
     *                long b;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   807
     *                real c;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   808
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   809
     * init_vf: local initialisation without declaration.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   810
     *           e.g.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   811
     *                a = 9;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   812
     *                b = 99;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   813
     *                c = 99.9;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   814
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   815
     * constructorinit_vf: initialising of member variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   816
     *                e.g. for a constructor...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   817
     *                class_name_c(void)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   818
     *                : a(9), b(99), c(99.9)  { // code... }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   819
     *                  --------------------
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   820
     *               This class/function will produce the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   821
     *               underlined code of the above examples,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   822
     *               and no more!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   823
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   824
     * globalinit_vf: initialising of static c++ variables. These
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   825
     *                variables may have been declared as static inside
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   826
     *                a class, in which case the scope within which they were
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   827
     *                previously delcared must be passed as the second parameter
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   828
     *                to the print() function.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   829
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   830
     *                e.g.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   831
     *                __plc_pt_c<INT, 8*sizeof(INT)> START_P::loc = __plc_pt_c<INT, 8*sizeof(INT)>("I2");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   832
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   833
    typedef enum {finterface_vf,
145
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
   834
                  foutputassign_vf,
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
   835
                  local_vf,
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   836
                  localinit_vf,
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   837
                  init_vf,
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   838
                  constructorinit_vf,
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
   839
                  globalinit_vf,
661
f537c3315f83 Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents: 596
diff changeset
   840
                  globalprototype_vf
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   841
                 } varformat_t;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   842
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   843
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   844
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   845
    /* variable used to store the types of variables that need to be processed... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   846
    /* Only set in the constructor...! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   847
    /* Will contain a set of values of generate_c_vardecl_c::XXXX_vt */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   848
    unsigned int wanted_vartype;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   849
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   850
    /* variable used to store the type of variable currently being processed... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   851
    /* Will contain a single value of generate_c_vardecl_c::XXXX_vt */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   852
    unsigned int current_vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   853
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   854
    /* variable used to store the qualifier of variable currently being processed... */
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   855
    /* Will contain a single value of generate_c_vardecl_c::XXXX_vq */
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   856
    unsigned int current_varqualifier;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   857
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   858
    /* How variables should be declared: as local variables or
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   859
     * variables within a function interface...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   860
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   861
    /* Only set in the constructor...! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   862
    varformat_t wanted_varformat;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   863
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   864
    /* The number of variables already declared. */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   865
    /* Used to declare 'void' in case no variables are declared in a function interface... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   866
    int finterface_var_count;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   867
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
   868
    /* Current parsed resource name, for resource 
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
   869
     * specific global variable declaration (with #define...)*/
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
   870
    symbol_c *resource_name;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   871
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   872
    /* Holds the references to the type and initial value
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   873
     * of the variables currently being declared.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   874
     * Please read the comment under var1_init_decl_c for further
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   875
     * details...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   876
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   877
     * We make an effort to keep these pointers pointing to NULL
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   878
     * whenever we are outside the scope of variable declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   879
     * (i.e. when we are traversing a part of the parse tree which
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   880
     * is not part of variable declaration) in order tio try to catch
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   881
     * any bugs as soon as possible.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   882
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   883
    symbol_c *current_var_type_symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   884
    symbol_c *current_var_init_symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   885
    void update_type_init(symbol_c *symbol /* a spec_init_c, subrange_spec_init_c, etc... */ ) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   886
      this->current_var_type_symbol = spec_init_sperator_c::get_spec(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   887
      this->current_var_init_symbol = spec_init_sperator_c::get_init(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   888
      if (NULL == this->current_var_type_symbol)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   889
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   890
      if (NULL == this->current_var_init_symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   891
        /* We try to find the data type's default value... */
762
a3d917474ae4 Small code cleanup.
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
   892
        this->current_var_init_symbol = type_initial_value_c::get(this->current_var_type_symbol);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   893
      /* Note that Function Block 'data types' do not have a default value, so we cannot abort if no default value is found! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   894
      /*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   895
      if (NULL == this->current_var_init_symbol)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   896
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   897
      */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   898
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   899
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   900
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   901
    void void_type_init(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   902
      this->current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   903
      this->current_var_init_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   904
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   905
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   906
    /* Only used when wanted_varformat == globalinit_vf
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   907
     * Holds a pointer to an identifier_c, which in turns contains
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   908
     * the identifier of the scope within which the static member was
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   909
     * declared.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   910
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   911
    symbol_c *globalnamespace;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   912
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   913
    void *print_retain(void) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   914
      s4o.print(",");
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   915
      switch (current_varqualifier) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   916
        case retain_vq:
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   917
          s4o.print("1");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   918
          break;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   919
        case non_retain_vq:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   920
          s4o.print("0");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   921
          break;
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   922
        default:
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   923
          s4o.print("retain");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   924
          break;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   925
      }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   926
      return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   927
    }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   928
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   929
    /* Actually produce the output where variables are declared... */
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   930
    /* Note that located variables and EN/ENO are the exception, they
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   931
     * being declared in the located_var_decl_c,
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   932
     * en_param_declaration_c and eno_param_declaration_c visitors...
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   933
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   934
    void *declare_variables(symbol_c *symbol, bool is_fb = false) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   935
      list_c *list = dynamic_cast<list_c *>(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   936
      /* should NEVER EVER occur!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   937
      if (list == NULL) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   938
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   939
      /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   940
      if ((wanted_varformat == local_vf) ||
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   941
          (wanted_varformat == init_vf) ||
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   942
          (wanted_varformat == localinit_vf)) {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   943
        for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   944
          s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
   945
          if (wanted_varformat == local_vf) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   946
            if (!is_fb) {
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   947
              s4o.print(DECLARE_VAR);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   948
              s4o.print("(");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   949
            }
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   950
            this->current_var_type_symbol->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   951
            if (is_fb)
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   952
              s4o.print(" ");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   953
            else
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   954
              s4o.print(",");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   955
            print_variable_prefix();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
   956
          }
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
   957
          else if (wanted_varformat == localinit_vf) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   958
            this->current_var_type_symbol->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   959
            s4o.print(" ");
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   960
            print_variable_prefix();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   961
          }
334
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   962
          else if (wanted_varformat == init_vf) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   963
            s4o.print(SET_VAR);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   964
            s4o.print("(");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   965
            print_variable_prefix();
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   966
            s4o.print(",");
334
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   967
          }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   968
          list->elements[i]->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   969
          if (wanted_varformat != local_vf) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   970
            if (wanted_varformat == localinit_vf &&
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
   971
                (current_vartype & inoutput_vt) != 0) {
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   972
              s4o.print(";\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   973
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   974
              s4o.print("if (__");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   975
              list->elements[i]->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   976
              s4o.print(" != NULL) {\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   977
              s4o.indent_right();
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   978
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   979
              list->elements[i]->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   980
              s4o.print(" = *__");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   981
              list->elements[i]->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   982
              s4o.print(";\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   983
              s4o.indent_left();
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   984
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   985
              s4o.print("}\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   986
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   987
              s4o.print("else {\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   988
              s4o.indent_right();
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   989
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   990
              s4o.print("static const ");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   991
              this->current_var_type_symbol->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   992
              s4o.print(" temp = ");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   993
              this->current_var_init_symbol->accept(*this);
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   994
              s4o.print(";\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   995
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   996
              list->elements[i]->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   997
              s4o.print(" = temp;\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   998
              s4o.indent_left();
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   999
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1000
              s4o.print("}\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1001
            }
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1002
            else if (wanted_varformat == init_vf) {
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 854
diff changeset
  1003
              s4o.print(",,");
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1004
              this->current_var_init_symbol->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1005
              s4o.print(");\n");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1006
            }
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1007
            else {
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1008
              if (this->current_var_init_symbol != NULL) {
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1009
                s4o.print(" = ");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1010
                this->current_var_init_symbol->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1011
              }
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1012
              s4o.print(";\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1013
            }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1014
          }
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1015
          else if (is_fb)
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1016
            s4o.print(";\n");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1017
          else
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1018
            s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1019
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1020
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1021
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1022
      if (wanted_varformat == finterface_vf) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1023
        for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1024
          finterface_var_count++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1025
          s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1026
          s4o.print("\n" + s4o.indent_spaces);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1027
          this->current_var_type_symbol->accept(*this);
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1028
          if ((current_vartype & (output_vt | inoutput_vt)) != 0)
145
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1029
            s4o.print(" *__");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1030
          else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1031
            s4o.print(" ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1032
          list->elements[i]->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1033
          /* We do not print the initial value at function declaration!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1034
           * It is up to the caller to pass the correct default value
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1035
           * if none is specified in the ST source code
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1036
           */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1037
          /* if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1038
               s4o.print(" = "); this->current_var_init_symbol->accept(*this);}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1039
           */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1040
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1041
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1042
145
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1043
      if (wanted_varformat == foutputassign_vf) {
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1044
        for(int i = 0; i < list->n; i++) {
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1045
          if ((current_vartype & (output_vt | inoutput_vt)) != 0) {
145
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1046
            s4o.print(s4o.indent_spaces + "if (__");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1047
            list->elements[i]->accept(*this);
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1048
            s4o.print(" != NULL) {\n");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1049
            s4o.indent_right();
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1050
            s4o.print(s4o.indent_spaces + "*__");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1051
            list->elements[i]->accept(*this);
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1052
            s4o.print(" = ");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1053
            list->elements[i]->accept(*this);
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1054
            s4o.print(";\n");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1055
            s4o.indent_left();
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1056
            s4o.print(s4o.indent_spaces + "}\n");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1057
          }
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1058
        }
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1059
      }
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1060
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1061
      if (wanted_varformat == constructorinit_vf) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1062
        for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1063
          if (is_fb) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1064
            s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1065
            this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1066
            s4o.print(FB_INIT_SUFFIX);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1067
            s4o.print("(&");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1068
            this->print_variable_prefix();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1069
            list->elements[i]->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1070
            print_retain();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1071
            s4o.print(");");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1072
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1073
          else if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1074
            s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1075
            s4o.print(INIT_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1076
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1077
            this->print_variable_prefix();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1078
            list->elements[i]->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1079
            s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1080
            this->current_var_init_symbol->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1081
            print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1082
            s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1083
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1084
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1085
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1086
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1087
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1088
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1089
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1090
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1091
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1092
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1093
  public:
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1094
    generate_c_vardecl_c(stage4out_c *s4o_ptr, varformat_t varformat, unsigned int vartype, symbol_c* res_name = NULL)
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1095
    : generate_c_typedecl_c(s4o_ptr) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1096
      wanted_varformat = varformat;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1097
      wanted_vartype   = vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1098
      current_vartype  = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1099
      current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1100
      current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1101
      current_var_init_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1102
      globalnamespace         = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1103
      nv = NULL;
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1104
      resource_name = res_name;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1105
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1106
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1107
    ~generate_c_vardecl_c(void) {}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1108
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1109
    void print(symbol_c *symbol, symbol_c *scope = NULL, const char *variable_prefix = NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1110
      this->set_variable_prefix(variable_prefix);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1111
      if (globalinit_vf == wanted_varformat)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1112
        globalnamespace = scope;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1113
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1114
      finterface_var_count = 0;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1115
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1116
      switch (wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1117
        case constructorinit_vf: nv = new next_var_c("", "\n"+s4o.indent_spaces); break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1118
        case finterface_vf:      /* fall through... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1119
        case localinit_vf:       /* fall through... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1120
        case local_vf:           nv = new next_var_c("", ", "); break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1121
        default:                 nv = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1122
      } /* switch() */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1123
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1124
      symbol->accept(*this);
189
7ca02034c4f6 Bug on function without input parameters fixed
lbessard
parents: 164
diff changeset
  1125
      
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1126
      delete nv;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1127
      nv = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1128
      globalnamespace = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1129
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1130
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1131
  protected:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1132
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1133
/* B 0 - Programming Model */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1134
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1135
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1136
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1137
/*************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1138
/* B.1 - Common elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1139
/*************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1140
/*******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1141
/* B 1.1 - Letters, digits and identifiers */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1142
/*******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1143
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1144
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1145
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1146
/* B 1.2 - Constants */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1147
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1148
  /* originally empty... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1149
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1150
/******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1151
/* B 1.2.1 - Numeric Literals */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1152
/******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1153
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1154
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1155
/*******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1156
/* B.1.2.2   Character Strings */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1157
/*******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1158
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1159
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1160
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1161
/* B 1.2.3 - Time Literals */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1162
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1163
/************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1164
/* B 1.2.3.1 - Duration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1165
/************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1166
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1167
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1168
/************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1169
/* B 1.2.3.2 - Time of day and Date */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1170
/************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1171
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1172
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1173
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1174
/* B.1.3 - Data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1175
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1176
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1177
/* B 1.3.1 - Elementary Data Types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1178
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1179
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1180
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1181
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1182
/* B.1.3.2 - Generic data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1183
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1184
  /* originally empty... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1185
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1186
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1187
/* B 1.3.3 - Derived data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1188
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1189
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1190
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1191
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1192
/* B 1.4 - Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1193
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1194
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1195
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1196
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1197
/* B.1.4.1   Directly Represented Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1198
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1199
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1200
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1201
/*************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1202
/* B.1.4.2   Multi-element Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1203
/*************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1204
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1205
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1206
/******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1207
/* B 1.4.3 - Declaration & Initialisation */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1208
/******************************************/
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1209
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1210
void *visit(constant_option_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1211
  current_varqualifier = constant_vq;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1212
  return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1213
}
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1214
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1215
void *visit(retain_option_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1216
  current_varqualifier = retain_vq;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1217
  return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1218
}
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1219
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1220
void *visit(non_retain_option_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1221
  current_varqualifier = non_retain_vq;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1222
  return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1223
}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1224
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1225
void *visit(input_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1226
  TRACE("input_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1227
  if ((wanted_vartype & input_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1228
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1229
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1230
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1231
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1232
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1233
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1234
    current_vartype = input_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1235
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1236
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1237
    symbol->input_declaration_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1238
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1239
    current_varqualifier = none_vt;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1240
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1241
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1242
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1243
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1244
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1245
/* helper symbol for input_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1246
void *visit(input_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1247
  TRACE("input_declaration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1248
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1249
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1250
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1251
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1252
void *visit(edge_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1253
  TRACE("edge_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1254
  // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1255
  symbol->var1_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1256
  s4o.print(" : BOOL ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1257
  symbol->edge->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1258
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1259
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1260
805
b737cfc92614 Use simple_spec_init_c inside en_param_declaration_c (will reduce need to handle it as a special case in the future).
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
  1261
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1262
void *visit(en_param_declaration_c *symbol) {
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1263
  TRACE("en_declaration_c");
805
b737cfc92614 Use simple_spec_init_c inside en_param_declaration_c (will reduce need to handle it as a special case in the future).
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
  1264
  update_type_init(symbol->type_decl);
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1265
  if (wanted_varformat == finterface_vf) {
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1266
    finterface_var_count++;
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1267
  }  
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1268
  if ((wanted_vartype & en_vt) != 0) {
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1269
    if (wanted_varformat == finterface_vf) {
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1270
      s4o.print(nv->get());
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1271
      s4o.print("\n" + s4o.indent_spaces);
805
b737cfc92614 Use simple_spec_init_c inside en_param_declaration_c (will reduce need to handle it as a special case in the future).
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
  1272
      this->current_var_type_symbol->accept(*this);
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1273
      s4o.print(" ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1274
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1275
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1276
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1277
    if ((wanted_varformat == local_vf) ||
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1278
        (wanted_varformat == init_vf) ||
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1279
        (wanted_varformat == localinit_vf)) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1280
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1281
      if (wanted_varformat == local_vf) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1282
        s4o.print(DECLARE_VAR);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1283
        s4o.print("(");
805
b737cfc92614 Use simple_spec_init_c inside en_param_declaration_c (will reduce need to handle it as a special case in the future).
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
  1284
        this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1285
        s4o.print(",");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1286
      }
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1287
      else if (wanted_varformat == localinit_vf) {
805
b737cfc92614 Use simple_spec_init_c inside en_param_declaration_c (will reduce need to handle it as a special case in the future).
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
  1288
        this->current_var_type_symbol->accept(*this);
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1289
        s4o.print(" ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1290
      }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1291
      print_variable_prefix();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1292
      symbol->name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1293
      if (wanted_varformat == local_vf)
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1294
        s4o.print(")\n");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1295
      else {
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1296
        s4o.print(" = ");
805
b737cfc92614 Use simple_spec_init_c inside en_param_declaration_c (will reduce need to handle it as a special case in the future).
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
  1297
        this->current_var_init_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1298
        s4o.print(";\n");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1299
      }
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1300
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1301
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1302
    if (wanted_varformat == constructorinit_vf) {
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1303
      /* NOTE: I (Mario) think this is dead code - never gets executed. Must confirm it before deleting it... */
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1304
      s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1305
      s4o.print(INIT_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1306
      s4o.print("(");
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1307
      this->print_variable_prefix();
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1308
      // s4o.print("EN = __BOOL_LITERAL(TRUE);");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1309
      symbol->name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1310
      s4o.print(",");
805
b737cfc92614 Use simple_spec_init_c inside en_param_declaration_c (will reduce need to handle it as a special case in the future).
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
  1311
      this->current_var_init_symbol->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1312
      print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1313
      s4o.print(")");
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1314
    }
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1315
  }
805
b737cfc92614 Use simple_spec_init_c inside en_param_declaration_c (will reduce need to handle it as a special case in the future).
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
  1316
  void_type_init();
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1317
  return NULL;
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1318
}
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1319
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1320
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1321
void *visit(eno_param_declaration_c *symbol) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1322
  TRACE("eno_declaration_c");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1323
  if (wanted_varformat == finterface_vf) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1324
    finterface_var_count++;
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1325
  }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1326
  if ((wanted_vartype & eno_vt) != 0) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1327
    if (wanted_varformat == finterface_vf) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1328
      s4o.print(nv->get());
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1329
      // s4o.print("\n" + s4o.indent_spaces + "BOOL *ENO");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1330
      s4o.print("\n" + s4o.indent_spaces);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1331
      symbol->type->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1332
      s4o.print(" *__");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1333
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1334
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1335
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1336
    if ((wanted_varformat == local_vf) ||
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1337
        (wanted_varformat == init_vf) ||
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1338
        (wanted_varformat == localinit_vf)) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1339
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1340
      if (wanted_varformat == local_vf) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1341
        s4o.print(DECLARE_VAR);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1342
        s4o.print("(");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1343
        symbol->type->accept(*this);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1344
        s4o.print(",");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1345
      }
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1346
      else if (wanted_varformat == localinit_vf) {
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1347
        symbol->type->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1348
        s4o.print(" ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1349
      }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1350
      print_variable_prefix();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1351
      symbol->name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1352
      if (wanted_varformat == local_vf)
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1353
        s4o.print(")\n");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1354
      else
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1355
        s4o.print(" = __BOOL_LITERAL(TRUE);\n");
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1356
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1357
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1358
    if (wanted_varformat == foutputassign_vf) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1359
      s4o.print(s4o.indent_spaces + "if (__");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1360
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1361
      s4o.print(" != NULL) {\n");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1362
      s4o.indent_right();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1363
      s4o.print(s4o.indent_spaces + "*__");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1364
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1365
      s4o.print(" = ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1366
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1367
      s4o.print(";\n");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1368
      s4o.indent_left();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1369
      s4o.print(s4o.indent_spaces + "}\n");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1370
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1371
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1372
    if (wanted_varformat == constructorinit_vf) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1373
      /* NOTE: I (Mario) think this is dead code - never gets executed. Must confirm it before deleting it... */
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1374
      s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1375
      s4o.print(INIT_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1376
      s4o.print("(");
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1377
      this->print_variable_prefix();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1378
      // s4o.print("ENO = __BOOL_LITERAL(TRUE);");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1379
      symbol->name->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1380
      s4o.print(",__BOOL_LITERAL(TRUE)");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1381
      print_retain();
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1382
      s4o.print(")");
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1383
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1384
  }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1385
  return NULL;
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1386
}
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1387
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1388
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1389
void *visit(raising_edge_option_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1390
  // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1391
  s4o.print("R_EDGE");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1392
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1393
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1394
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1395
/*  var1_list ':' array_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1396
// SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init)
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1397
void *visit(array_var_init_decl_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1398
  TRACE("array_var_init_decl_c");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1399
  /* Please read the comments inside the var1_init_decl_c
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1400
   * visitor, as they apply here too.
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1401
   */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1402
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1403
  /* Start off by setting the current_var_type_symbol and
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1404
   * current_var_init_symbol private variables...
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1405
   */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1406
  update_type_init(symbol->array_spec_init);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1407
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1408
  /* now to produce the c equivalent... */
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1409
  if (wanted_varformat == constructorinit_vf) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1410
    generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1411
    array_initialization->set_variable_prefix(get_variable_prefix());
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1412
    array_initialization->init_array(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1413
    delete array_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1414
  }
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1415
  else
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1416
    symbol->var1_list->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1417
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1418
  /* Values no longer in scope, and therefore no longer used.
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1419
   * Make an effort to keep them set to NULL when not in use
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1420
   * in order to catch bugs as soon as possible...
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1421
   */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1422
  void_type_init();
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1423
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1424
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1425
}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1426
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1427
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1428
void *visit(array_specification_c *symbol) {
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1429
  s4o.print("__");
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1430
  symbol->non_generic_type_name->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1431
  symbol->array_subrange_list->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1432
  return NULL;
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1433
}
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1434
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1435
/*  signed_integer DOTDOT signed_integer */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1436
//SYM_REF2(subrange_c, lower_limit, upper_limit)
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1437
void *visit(subrange_c *symbol) {
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1438
  s4o.print("_");
594
c8092e909886 Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents: 592
diff changeset
  1439
  s4o.print(symbol->dimension);
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1440
  return NULL;
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1441
}
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1442
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1443
/*  var1_list ':' initialized_structure */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1444
// SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1445
void *visit(structured_var_init_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1446
  TRACE("structured_var_init_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1447
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1448
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1449
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1450
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1451
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1452
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1453
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1454
  update_type_init(symbol->initialized_structure);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1455
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1456
  /* now to produce the c equivalent... */
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1457
  if (wanted_varformat == constructorinit_vf) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1458
    generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1459
    structure_initialization->set_variable_prefix(get_variable_prefix());
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1460
    structure_initialization->init_structure(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1461
    delete structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1462
  }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1463
  else
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1464
    symbol->var1_list->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1465
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1466
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1467
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1468
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1469
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1470
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1471
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1472
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1473
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1474
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1475
/* fb_name_list ':' function_block_type_name ASSIGN structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1476
/* structure_initialization -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1477
void *visit(fb_name_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1478
  TRACE("fb_name_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1479
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1480
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1481
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1482
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1483
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1484
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1485
   */
810
d9c48ad646f1 Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents: 805
diff changeset
  1486
  update_type_init(symbol->fb_spec_init);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1487
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1488
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1489
  symbol->fb_name_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1490
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1491
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1492
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1493
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1494
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1495
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1496
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1497
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1498
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1499
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1500
/* fb_name_list ',' fb_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1501
void *visit(fb_name_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1502
  TRACE("fb_name_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1503
  declare_variables(symbol, true);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1504
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1505
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1506
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1507
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1508
/* VAR_OUTPUT [RETAIN | NON_RETAIN] var_init_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1509
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1510
void *visit(output_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1511
  TRACE("output_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1512
  if ((wanted_vartype & output_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1513
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1514
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1515
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1516
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1517
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1518
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1519
    current_vartype = output_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1520
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1521
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1522
    symbol->var_init_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1523
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1524
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1525
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1526
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1527
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1528
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1529
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1530
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1531
/*  VAR_IN_OUT var_declaration_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1532
void *visit(input_output_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1533
  TRACE("input_output_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1534
  if ((wanted_vartype & inoutput_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1535
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1536
    current_vartype = inoutput_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1537
    symbol->var_declaration_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1538
    current_vartype = none_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1539
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1540
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1541
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1542
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1543
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1544
/* helper symbol for input_output_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1545
/* var_declaration_list var_declaration ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1546
void *visit(var_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1547
  TRACE("var_declaration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1548
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1549
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1550
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1551
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1552
/*  var1_list ':' array_specification */
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1553
//SYM_REF2(array_var_declaration_c, var1_list, array_specification)
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1554
void *visit(array_var_declaration_c *symbol) {
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1555
  TRACE("array_var_declaration_c");
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1556
  /* Please read the comments inside the var1_init_decl_c
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1557
   * visitor, as they apply here too.
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1558
   */
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1559
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1560
  /* Start off by setting the current_var_type_symbol and
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1561
   * current_var_init_symbol private variables...
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1562
   */
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1563
  update_type_init(symbol->array_specification);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1564
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1565
  /* now to produce the c equivalent... */
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1566
  if (wanted_varformat == constructorinit_vf) {
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1567
    generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1568
    array_initialization->set_variable_prefix(get_variable_prefix());
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1569
    array_initialization->init_array(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1570
    delete array_initialization;
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1571
  }
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1572
  else
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1573
    symbol->var1_list->accept(*this);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1574
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1575
  /* Values no longer in scope, and therefore no longer used.
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1576
   * Make an effort to keep them set to NULL when not in use
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1577
   * in order to catch bugs as soon as possible...
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1578
   */
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1579
  void_type_init();
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1580
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1581
  return NULL;
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1582
}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1583
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1584
void *visit(array_initial_elements_list_c *symbol) {
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1585
  if (wanted_varformat == localinit_vf || wanted_varformat == constructorinit_vf) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1586
    generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1587
    array_initialization->init_array_size(this->current_var_type_symbol);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1588
    array_initialization->init_array_values(this->current_var_init_symbol);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1589
    delete array_initialization;
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1590
  }
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1591
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1592
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1593
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1594
/*  var1_list ':' structure_type_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1595
//SYM_REF2(structured_var_declaration_c, var1_list, structure_type_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1596
void *visit(structured_var_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1597
  TRACE("structured_var_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1598
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1599
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1600
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1601
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1602
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1603
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1604
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1605
  update_type_init(symbol->structure_type_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1606
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1607
  if (wanted_varformat == constructorinit_vf) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1608
    generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1609
    structure_initialization->set_variable_prefix(get_variable_prefix());
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1610
    structure_initialization->init_structure(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1611
    delete structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1612
  }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1613
  else
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1614
    /* now to produce the c equivalent... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1615
    symbol->var1_list->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1616
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1617
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1618
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1619
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1620
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1621
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1622
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1623
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1624
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1625
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1626
void *visit(structure_element_initialization_list_c *symbol) {
582
8495119e7271 Fix structure initialize.
Manuele conti <conti.ma@alice.it>
parents: 547
diff changeset
  1627
  if (wanted_varformat == localinit_vf || wanted_varformat == constructorinit_vf) {
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1628
    generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1629
    structure_initialization->init_structure_default(this->current_var_type_symbol);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1630
    structure_initialization->init_structure_values(this->current_var_init_symbol);
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1631
    delete structure_initialization;
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1632
  }
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1633
  return NULL;
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1634
}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1635
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1636
/* VAR [CONSTANT] var_init_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1637
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1638
/* helper symbol for input_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1639
void *visit(var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1640
  TRACE("var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1641
  if ((wanted_vartype & private_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1642
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1643
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1644
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1645
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1646
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1647
    current_vartype = private_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1648
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1649
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1650
    symbol->var_init_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1651
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1652
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1653
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1654
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1655
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1656
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1657
/*  VAR RETAIN var_init_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1658
void *visit(retentive_var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1659
  TRACE("retentive_var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1660
  if ((wanted_vartype & private_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1661
    current_vartype = private_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1662
    current_varqualifier = retain_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1663
    symbol->var_init_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1664
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1665
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1666
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1667
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1668
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1669
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1670
/*  VAR [CONSTANT|RETAIN|NON_RETAIN] located_var_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1671
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1672
//SYM_REF2(located_var_declarations_c, option, located_var_decl_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1673
void *visit(located_var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1674
  TRACE("located_var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1675
  if ((wanted_vartype & located_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1676
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1677
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1678
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1679
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1680
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1681
    current_vartype = located_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1682
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1683
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1684
    symbol->located_var_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1685
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1686
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1687
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1688
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1689
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1690
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1691
/* helper symbol for located_var_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1692
/* located_var_decl_list located_var_decl ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1693
//SYM_LIST(located_var_decl_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1694
void *visit(located_var_decl_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1695
  TRACE("located_var_decl_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1696
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1697
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1698
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1699
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1700
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1701
/*  [variable_name] location ':' located_var_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1702
/* variable_name -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1703
//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
  1704
void *visit(located_var_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1705
  TRACE("located_var_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1706
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1707
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1708
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1709
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1710
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1711
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1712
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1713
  update_type_init(symbol->located_var_spec_init);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1714
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1715
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1716
  switch(wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1717
    case local_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1718
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1719
      s4o.print(DECLARE_LOCATED);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1720
      s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1721
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1722
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1723
      if (symbol->variable_name != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1724
        symbol->variable_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1725
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1726
        symbol->location->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1727
      s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1728
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1729
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1730
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1731
      s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1732
      s4o.print(INIT_LOCATED);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1733
      s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1734
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1735
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1736
      symbol->location->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1737
      s4o.print(",");
230
816846a8d66b Bug in located variable initialization code fixed
laurent
parents: 226
diff changeset
  1738
      print_variable_prefix();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1739
      if (symbol->variable_name != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1740
        symbol->variable_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1741
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1742
        symbol->location->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1743
      print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1744
      s4o.print(")\n");
152
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1745
      if (this->current_var_init_symbol != NULL) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1746
        s4o.print(s4o.indent_spaces);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1747
        s4o.print(INIT_LOCATED_VALUE);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1748
        s4o.print("(");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1749
        print_variable_prefix();
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1750
        if (symbol->variable_name != NULL)
152
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1751
          symbol->variable_name->accept(*this);
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1752
        else
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1753
          symbol->location->accept(*this);
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1754
        s4o.print(",");
152
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1755
        this->current_var_init_symbol->accept(*this);
230
816846a8d66b Bug in located variable initialization code fixed
laurent
parents: 226
diff changeset
  1756
        s4o.print(")");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1757
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1758
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1759
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1760
    case globalinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1761
      s4o.print(s4o.indent_spaces + "__plc_pt_c<");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1762
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1763
      s4o.print(", 8*sizeof(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1764
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1765
      s4o.print(")> ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1766
      if (this->globalnamespace != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1767
        this->globalnamespace->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1768
        s4o.print("::");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1769
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1770
      if (symbol->variable_name != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1771
        symbol->variable_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1772
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1773
        symbol->location->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1774
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1775
      s4o.print(" = ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1776
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1777
      s4o.print(s4o.indent_spaces + "__plc_pt_c<");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1778
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1779
      s4o.print(", 8*sizeof(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1780
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1781
      s4o.print(")>(\"");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1782
      symbol->location->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1783
      s4o.print("\"");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1784
      if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1785
        s4o.print(", ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1786
        this->current_var_init_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1787
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1788
      s4o.print(");\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1789
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1790
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1791
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1792
      ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1793
  } /* switch() */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1794
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1795
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1796
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1797
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1798
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1799
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1800
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1801
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1802
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1803
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1804
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1805
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1806
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1807
/*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1808
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1809
//SYM_REF2(external_var_declarations_c, option, external_declaration_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1810
void *visit(external_var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1811
  TRACE("external_var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1812
  if ((wanted_vartype & external_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1813
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1814
    // TODO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1815
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1816
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1817
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1818
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1819
    current_vartype = external_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1820
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1821
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1822
    symbol->external_declaration_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1823
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1824
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1825
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1826
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1827
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1828
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1829
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1830
/* helper symbol for external_var_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1831
/*| external_declaration_list external_declaration';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1832
//SYM_LIST(external_declaration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1833
/* helper symbol for input_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1834
void *visit(external_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1835
  TRACE("external_declaration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1836
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1837
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1838
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1839
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1840
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1841
/*  global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1842
//SYM_REF2(external_declaration_c, global_var_name, specification)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1843
void *visit(external_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1844
  TRACE("external_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1845
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1846
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1847
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1848
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1849
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1850
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1851
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1852
  this->current_var_type_symbol = symbol->specification;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1853
  this->current_var_init_symbol = NULL;
854
13d0b67de111 Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 810
diff changeset
  1854
  if(!get_datatype_info_c::is_type_valid(this->current_var_type_symbol)) ERROR;
13d0b67de111 Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 810
diff changeset
  1855
  bool is_fb = get_datatype_info_c::is_function_block(this->current_var_type_symbol);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1856
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1857
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1858
  switch (wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1859
    case local_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1860
    case localinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1861
      s4o.print(s4o.indent_spaces);
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1862
      if (is_fb)
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1863
        s4o.print(DECLARE_EXTERNAL_FB);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1864
      else
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1865
        s4o.print(DECLARE_EXTERNAL);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1866
      s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1867
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1868
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1869
      symbol->global_var_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1870
      s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1871
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1872
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1873
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1874
      s4o.print(nv->get());
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1875
      if (is_fb)
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1876
        s4o.print(INIT_EXTERNAL_FB);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1877
      else
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  1878
        s4o.print(INIT_EXTERNAL);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1879
      s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1880
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1881
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1882
      symbol->global_var_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1883
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1884
      print_variable_prefix();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1885
      symbol->global_var_name->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1886
      print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1887
      s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1888
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1889
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1890
    case finterface_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1891
      finterface_var_count++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1892
      s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1893
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1894
      s4o.print(" *");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1895
      symbol->global_var_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1896
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1897
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1898
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1899
      ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1900
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1901
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1902
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1903
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1904
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1905
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1906
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1907
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1908
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1909
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1910
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1911
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1912
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1913
/*| VAR_GLOBAL [CONSTANT|RETAIN] global_var_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1914
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1915
// SYM_REF2(global_var_declarations_c, option, global_var_decl_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1916
void *visit(global_var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1917
  TRACE("global_var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1918
  if ((wanted_vartype & global_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1919
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1920
    // TODO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1921
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1922
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1923
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1924
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1925
    unsigned int previous_vartype = current_vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1926
      // previous_vartype will be either none_vt, or resource_vt
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1927
    current_vartype = global_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1928
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1929
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1930
    symbol->global_var_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1931
    current_vartype = previous_vartype;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1932
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1933
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1934
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1935
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1936
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1937
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1938
/* helper symbol for global_var_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1939
/*| global_var_decl_list global_var_decl ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1940
//SYM_LIST(global_var_decl_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1941
void *visit(global_var_decl_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1942
  TRACE("global_var_decl_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1943
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1944
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1945
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1946
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1947
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1948
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1949
/*| global_var_spec ':' [located_var_spec_init|function_block_type_name] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1950
/* type_specification ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1951
// SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1952
void *visit(global_var_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1953
  TRACE("global_var_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1954
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1955
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1956
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1957
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1958
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1959
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1960
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1961
  update_type_init(symbol->type_specification);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1962
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1963
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1964
  symbol->global_var_spec->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1965
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1966
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1967
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1968
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1969
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1970
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1971
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1972
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1973
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1974
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1975
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1976
/*| global_var_name location */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1977
// SYM_REF2(global_var_spec_c, global_var_name, location)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1978
void *visit(global_var_spec_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1979
  TRACE("global_var_spec_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1980
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1981
  switch(wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1982
    case local_vf:
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1983
      s4o.print(s4o.indent_spaces);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1984
      s4o.print(DECLARE_GLOBAL_LOCATION);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1985
      s4o.print("(");
195
66d501d7b67d Fix segmentation fault when define global with location but no name (reported by brendan)
lbessard
parents: 189
diff changeset
  1986
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1987
      s4o.print(",");
195
66d501d7b67d Fix segmentation fault when define global with location but no name (reported by brendan)
lbessard
parents: 189
diff changeset
  1988
      symbol->location->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1989
      s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1990
      if (symbol->global_var_name != NULL) {
195
66d501d7b67d Fix segmentation fault when define global with location but no name (reported by brendan)
lbessard
parents: 189
diff changeset
  1991
        s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1992
        s4o.print(DECLARE_GLOBAL_LOCATED);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1993
        s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1994
        this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1995
        s4o.print(",");
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1996
        if (this->resource_name != NULL) {
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1997
            this->resource_name->accept(*this);
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1998
        }
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1999
        s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2000
        symbol->global_var_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2001
        s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2002
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2003
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2004
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2005
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2006
      if (symbol->global_var_name != NULL) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2007
        s4o.print(nv->get());
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2008
        s4o.print(INIT_GLOBAL_LOCATED);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2009
        s4o.print("(");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2010
        if (this->resource_name != NULL) {
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2011
          this->resource_name->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2012
        }
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2013
        s4o.print(",");
128
fd5760f30682 Changed located global variable declaration and init to reflec recent change on located vars (pointers)
etisserant
parents: 122
diff changeset
  2014
        symbol->global_var_name->accept(*this);
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2015
        s4o.print(",");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2016
        symbol->location->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  2017
        print_retain();
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2018
        s4o.print(")");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2019
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2020
      if (this->current_var_init_symbol != NULL) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2021
        s4o.print(nv->get());
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2022
        s4o.print(INIT_GLOBAL);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2023
        s4o.print("(");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2024
        this->current_var_type_symbol->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2025
        s4o.print(",");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2026
        if (symbol->global_var_name != NULL)
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2027
          symbol->global_var_name->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2028
        else
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2029
	      symbol->location->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2030
        s4o.print(",");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2031
        s4o.print(INITIAL_VALUE);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2032
        s4o.print("(");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2033
        this->current_var_init_symbol->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2034
        s4o.print(")");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2035
        print_retain();
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2036
        s4o.print(")");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2037
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2038
      break;
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2039
    
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2040
    case globalprototype_vf:
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2041
      s4o.print(s4o.indent_spaces);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2042
      s4o.print(DECLARE_GLOBAL_PROTOTYPE);
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2043
      s4o.print("(");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2044
      this->current_var_type_symbol->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2045
      s4o.print(",");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2046
      if (symbol->global_var_name != NULL)
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2047
        symbol->global_var_name->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2048
      else
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2049
        symbol->location->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2050
      s4o.print(")\n");
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2051
      break;
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2052
    
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2053
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2054
      ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2055
  } /* switch() */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2056
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2057
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2058
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2059
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2060
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2061
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2062
/*  AT direct_variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2063
// SYM_REF2(location_c, direct_variable, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2064
void *visit(location_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2065
  TRACE("location_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2066
  return symbol->direct_variable->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2067
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2068
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2069
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2070
/*| global_var_list ',' global_var_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2071
//SYM_LIST(global_var_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2072
void *visit(global_var_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2073
  TRACE("global_var_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2074
  list_c *list = dynamic_cast<list_c *>(symbol);
854
13d0b67de111 Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 810
diff changeset
  2075
  if(!get_datatype_info_c::is_type_valid(this->current_var_type_symbol)) ERROR;
13d0b67de111 Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 810
diff changeset
  2076
  bool is_fb = get_datatype_info_c::is_function_block(this->current_var_type_symbol);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2077
  /* should NEVER EVER occur!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2078
  if (list == NULL) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2079
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2080
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2081
  switch (wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2082
    case local_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2083
    case localinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2084
      for(int i = 0; i < list->n; i++) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2085
        s4o.print(s4o.indent_spaces);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2086
        if (is_fb)
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2087
          s4o.print(DECLARE_GLOBAL_FB);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2088
        else
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2089
          s4o.print(DECLARE_GLOBAL);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2090
        s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2091
        this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2092
        s4o.print(",");
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2093
        if(this->resource_name != NULL)
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2094
            this->resource_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2095
        s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2096
        list->elements[i]->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2097
        s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2098
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2099
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2100
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2101
    case constructorinit_vf:
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2102
      if (this->current_var_init_symbol != NULL || is_fb) {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2103
        for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2104
          s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2105
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2106
          if (is_fb)
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2107
            s4o.print(INIT_GLOBAL_FB);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2108
          else
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2109
            s4o.print(INIT_GLOBAL);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2110
          s4o.print("(");
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  2111
          this->current_var_type_symbol->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  2112
          s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2113
          list->elements[i]->accept(*this);
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2114
          if (this->current_var_init_symbol != NULL) {
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2115
            s4o.print(",");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2116
            s4o.print(INITIAL_VALUE);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2117
            s4o.print("(");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2118
            this->current_var_init_symbol->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2119
            s4o.print(")");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2120
          }
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  2121
          print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2122
          s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2123
#if 0
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2124
      /* The following code would be for globalinit_vf !!
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2125
       * But it is not currently required...
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2126
       */
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2127
      s4o.print(s4o.indent_spaces + "__ext_element_c<");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2128
          this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2129
          s4o.print("> ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2130
          if (this->globalnamespace != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2131
            this->globalnamespace->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2132
            s4o.print("::");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2133
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2134
          list->elements[i]->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2135
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2136
          if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2137
            s4o.print(" = ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2138
            s4o.print("__ext_element_c<");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2139
            this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2140
            s4o.print(">(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2141
            this->current_var_init_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2142
            s4o.print(")");
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2143
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2144
          s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2145
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2146
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2147
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2148
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2149
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2150
    case globalprototype_vf:
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2151
      for(int i = 0; i < list->n; i++) {
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2152
        s4o.print(s4o.indent_spaces);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2153
        s4o.print(DECLARE_GLOBAL_PROTOTYPE);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2154
        s4o.print("(");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2155
        this->current_var_type_symbol->accept(*this);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2156
        s4o.print(",");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2157
        list->elements[i]->accept(*this);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2158
        s4o.print(")\n");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2159
      }
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2160
      break;
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2161
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2162
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2163
      ERROR; /* not supported, and not needed either... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2164
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2165
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2166
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2167
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2168
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2169
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2170
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2171
/*  var1_list ':' single_byte_string_spec */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2172
SYM_REF2(single_byte_string_var_declaration_c, var1_list, single_byte_string_spec)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2173
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2174
/*  STRING ['[' integer ']'] [ASSIGN single_byte_character_string] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2175
/* integer ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2176
/* single_byte_character_string ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2177
SYM_REF2(single_byte_string_spec_c, integer, single_byte_character_string)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2178
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2179
/*  var1_list ':' double_byte_string_spec */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2180
SYM_REF2(double_byte_string_var_declaration_c, var1_list, double_byte_string_spec)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2181
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2182
/*  WSTRING ['[' integer ']'] [ASSIGN double_byte_character_string] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2183
/* integer ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2184
/* double_byte_character_string ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2185
SYM_REF2(double_byte_string_spec_c, integer, double_byte_character_string)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2186
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2187
/*| VAR [RETAIN|NON_RETAIN] incompl_located_var_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2188
/* option ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2189
SYM_REF2(incompl_located_var_declarations_c, option, incompl_located_var_decl_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2190
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2191
/* helper symbol for incompl_located_var_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2192
/*| incompl_located_var_decl_list incompl_located_var_decl ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2193
SYM_LIST(incompl_located_var_decl_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2194
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2195
/*  variable_name incompl_location ':' var_spec */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2196
SYM_REF4(incompl_located_var_decl_c, variable_name, incompl_location, var_spec, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2197
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2198
/*  AT incompl_location_token */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2199
SYM_TOKEN(incompl_location_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2200
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2201
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2202
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2203
void *visit(falling_edge_option_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2204
  // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2205
  s4o.print("F_EDGE");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2206
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2207
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2208
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2209
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2210
void *visit(var1_init_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2211
  TRACE("var1_init_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2212
  /* We have several implementation alternatives here...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2213
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2214
   * The issue is that generation of c code
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2215
   * based on the abstract syntax tree requires the reversal
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2216
   * of the symbol order compared to st. For e.g.:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2217
   * (ST) a, b, c: INT := 98;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2218
   * (C ) int a=98, b=98, c=98;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2219
   * The spec_init contains the references to 'INT' and '98'.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2220
   * The var1_list contains the references to 'a', 'b', and 'c'.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2221
   * The var1_init_decl_c contains the references to spec_init and var1_list.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2222
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2223
   * For c code generation, the var1_init_decl_c visitor
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2224
   * would need to access the internals of other classes
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2225
   * (e.g. the simple_spec_init_c).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2226
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2227
   * We can do this using one of three methods:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2228
   *   1) Create the abstract syntax tree differently;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2229
   *   2) Access other classes from within the var1_init_decl_c;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2230
   *   3) Pass info between the visitors using global variables
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2231
   *       only acessible by this class (private vars)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2232
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2233
   * In 1), the abstract syntax tree would be built so that
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2234
   * var1_init_decl_c would contain direct references to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2235
   * var1_list_c, to the var type 'INT' and to the initialiser '98'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2236
   * (as per the example above).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2237
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2238
   * 2) would have several sub-options to obtain the references
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2239
   * to 'INT' and '98' from within var1_init_decl_c.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2240
   *  In 2a), the var1_init_decl_c would use dynamic casts to determine
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2241
   * the class of spec_init (simple_spec_init_c, subrange_spec_init_c or
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2242
   * enumerated_spec_init_c), and from there obtain the 'INT' and '98'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2243
   *  In 2b) var1_init_decl_c would have one reference for each
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2244
   * simple_spec_init_c, subrange_spec_init_c and enumerated_spec_init_c,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2245
   * the apropriate one being initialised by the var1_init_decl_c constructor.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2246
   * Note that the constructor would use dynamic casts. In essence, we
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2247
   * would merely be changing the location of the code with the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2248
   * dynamic casts.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2249
   *  In 2c) we would use three overloaded constructors for var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2250
   * one each for simple_spec_init_c, etc... This implies
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2251
   * use type specific pointers to each symbol in the bison
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2252
   * parser, instead of simply using a symbol_c * for all symbols;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2253
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2254
   * In 3), we use two global but private variables with references to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2255
   * 'INT' and '98', that would be initiliased by the visitors to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2256
   * simple_spec_init_c, subrange_spec_init_c and enumerated_spec_init_c.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2257
   * The visitor to var1_list_c would then use the references in the global
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2258
   * variables.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2259
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2260
   * I (Mario) have chosen to use 3).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2261
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2262
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2263
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2264
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2265
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2266
  update_type_init(symbol->spec_init);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2267
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2268
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2269
  symbol->var1_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2270
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2271
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2272
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2273
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2274
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2275
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2276
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2277
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2278
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2279
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2280
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2281
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2282
void *visit(var1_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2283
  TRACE("var1_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2284
  declare_variables(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2285
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2286
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2287
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2288
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2289
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2290
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2291
/* intermediate helper symbol for:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2292
 *  - non_retentive_var_decls
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2293
 *  - output_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2294
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2295
void *visit(var_init_decl_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2296
  TRACE("var_init_decl_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2297
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2298
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2299
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2300
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2301
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2302
/**************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2303
/* B.1.5 - Program organization units */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2304
/**************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2305
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2306
/* B 1.5.1 - Functions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2307
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2308
/* The missing function_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2309
 * is handled in derived classes
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2310
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2311
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2312
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2313
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2314
/* intermediate helper symbol for function_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2315
void *visit(var_declarations_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2316
  TRACE("var_declarations_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2317
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2318
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2319
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2320
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2321
void *visit(function_var_decls_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2322
  TRACE("function_var_decls_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2323
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2324
  if ((wanted_vartype & private_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2325
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2326
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2327
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2328
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2329
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2330
    current_vartype = private_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2331
    symbol->decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2332
    current_vartype = none_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2333
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2334
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2335
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2336
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2337
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2338
/* intermediate helper symbol for function_var_decls */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2339
void *visit(var2_init_decl_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2340
  TRACE("var2_init_decl_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2341
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2342
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2343
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2344
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2345
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2346
/*****************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2347
/* B 1.5.2 - Function Blocks */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2348
/*****************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2349
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2350
/* The missing function_block_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2351
 * is handled in derived classes
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2352
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2353
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2354
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2355
/*  VAR_TEMP temp_var_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2356
void *visit(temp_var_decls_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2357
  TRACE("temp_var_decls_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2358
  if ((wanted_vartype & temp_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2359
    current_vartype = temp_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2360
    symbol->var_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2361
    current_vartype = none_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2362
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2363
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2364
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2365
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2366
/* intermediate helper symbol for temp_var_decls */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2367
void *visit(temp_var_decls_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2368
  TRACE("temp_var_decls_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2369
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2370
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2371
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2372
/*  VAR NON_RETAIN var_init_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2373
void *visit(non_retentive_var_decls_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2374
  TRACE("non_retentive_var_decls_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2375
  // TODO ... guarantee the non-retain semantics!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2376
  if ((wanted_vartype & private_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2377
    current_vartype = private_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2378
    symbol->var_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2379
    current_vartype = none_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2380
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2381
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2382
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2383
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2384
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2385
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2386
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2387
/* B 1.5.3 - Programs */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2388
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2389
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2390
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2391
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2392
/* B.1.6  Sequential function chart elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2393
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2394
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2395
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2396
/* B 1.7 Configuration elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2397
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2398
  /* Programs instantiated inside configurations are declared as variables!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2399
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2400
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2401
CONFIGURATION configuration_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2402
   optional_global_var_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2403
   (resource_declaration_list | single_resource_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2404
   optional_access_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2405
   optional_instance_specific_initializations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2406
END_CONFIGURATION
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2407
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2408
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2409
SYM_REF6(configuration_declaration_c, configuration_name, global_var_declarations, resource_declarations, access_declarations, instance_specific_initializations, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2410
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2411
void *visit(configuration_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2412
  TRACE("configuration_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2413
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2414
  if(symbol->global_var_declarations)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2415
    symbol->global_var_declarations->accept(*this); // will contain VAR_GLOBAL declarations!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2416
  symbol->resource_declarations->accept(*this);   // will contain PROGRAM declarations!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2417
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2418
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2419
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2420
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2421
/* helper symbol for configuration_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2422
// SYM_LIST(resource_declaration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2423
void *visit(resource_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2424
  TRACE("resource_declaration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2425
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2426
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2427
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2428
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2429
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2430
RESOURCE resource_name ON resource_type_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2431
   optional_global_var_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2432
   single_resource_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2433
END_RESOURCE
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2434
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2435
// SYM_REF4(resource_declaration_c, resource_name, resource_type_name, global_var_declarations, resource_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2436
void *visit(resource_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2437
  TRACE("resource_declaration_c");
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2438
//// Not used anymore. Even resource list are processed as single resource
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2439
//  if ((wanted_vartype & resource_vt) != 0) {
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2440
//    s4o.print(s4o.indent_spaces + "struct {\n");
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2441
//    s4o.indent_right();
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2442
//
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2443
//    current_vartype = resource_vt;
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2444
//    if (NULL != symbol->global_var_declarations)
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2445
//      symbol->global_var_declarations->accept(*this); // will contain VAR_GLOBAL declarations!!
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2446
//    if (NULL != symbol->resource_declaration)
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2447
//      symbol->resource_declaration->accept(*this);    // will contain PROGRAM declarations!!
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2448
//    current_vartype = none_vt;
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2449
//
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2450
//    s4o.indent_left();
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2451
//    s4o.print(s4o.indent_spaces + "} ");
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2452
//    symbol->resource_name->accept(*this);
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2453
//    s4o.print(";\n");
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2454
//  }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2455
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2456
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2457
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2458
/* task_configuration_list program_configuration_list */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2459
// SYM_REF2(single_resource_declaration_c, task_configuration_list, program_configuration_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2460
void *visit(single_resource_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2461
  TRACE("single_resource_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2462
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2463
  if ((wanted_vartype & program_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2464
    unsigned int previous_vartype = current_vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2465
      // previous_vartype will be resource_vt
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2466
    current_vartype = program_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2467
    symbol->program_configuration_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2468
    current_vartype = previous_vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2469
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2470
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2471
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2472
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2473
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2474
/* helper symbol for single_resource_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2475
// SYM_LIST(task_configuration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2476
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2477
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2478
/* helper symbol for single_resource_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2479
/* | program_configuration_list program_configuration ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2480
// SYM_LIST(program_configuration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2481
void *visit(program_configuration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2482
  TRACE("program_configuration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2483
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2484
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2485
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2486
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2487
/* helper symbol for
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2488
 *  - access_path
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2489
 *  - instance_specific_init
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2490
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2491
// SYM_LIST(any_fb_name_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2492
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2493
/*  [resource_name '.'] global_var_name ['.' structure_element_name] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2494
// SYM_REF4(global_var_reference_c, resource_name, global_var_name, structure_element_name, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2495
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2496
/*  prev_declared_program_name '.' symbolic_variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2497
// SYM_REF2(program_output_reference_c, program_name, symbolic_variable)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2498
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2499
/*  TASK task_name task_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2500
// SYM_REF2(task_configuration_c, task_name, task_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2501
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2502
/*  '(' [SINGLE ASSIGN data_source ','] [INTERVAL ASSIGN data_source ','] PRIORITY ASSIGN integer ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2503
// SYM_REF4(task_initialization_c, single_data_source, interval_data_source, priority_data_source, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2504
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2505
/*  PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2506
// SYM_REF6(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2507
private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2508
  /* a helper function to the program_configuration_c visitor... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2509
  void program_constructor_call(program_configuration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2510
  program_declaration_c *p_decl = program_type_symtable.find_value(symbol->program_type_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2511
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2512
  if (p_decl == program_type_symtable.end_value())
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2513
    /* should never occur. The program being called MUST be in the symtable... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2514
    ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2515
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2516
  symbol->program_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2517
  s4o.print("(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2518
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2519
  /* loop through each function parameter, find the value we should pass
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2520
   * to it, and then output the c equivalent...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2521
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2522
  function_param_iterator_c fp_iterator(p_decl);
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  2523
#if 0
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2524
  function_call_param_iterator_c function_call_param_iterator(symbol);
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  2525
#endif
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2526
  identifier_c *param_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2527
  nv->push("", ", ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2528
  for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2529
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2530
    symbol_c *param_type = fp_iterator.param_type();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2531
    if (param_type == NULL) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2532
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2533
    function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2534
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2535
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2536
    /* Get the value from a foo(<param_name> = <param_value>) style call */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2537
    symbol_c *param_value = function_call_param_iterator.search(param_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2538
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2539
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2540
    switch (param_direction) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2541
      case function_param_iterator_c::direction_in:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2542
      case function_param_iterator_c::direction_out:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2543
      case function_param_iterator_c::direction_inout:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2544
        /* ignore them all!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2545
        break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2546
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2547
      case function_param_iterator_c::direction_extref:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2548
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2549
        if (param_value == NULL)
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2550
      /* This is illegal in ST and IL languages.
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2551
       * All variables declared in a VAR_EXTERNAL __must__
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2552
       * be initialised to reference a specific VAR_GLOBAL variable!!
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2553
       *
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2554
       * The semantic checker should have caught this, we check again just the
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2555
       * same (especially since the semantic checker has not yet been written!).
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2556
       */
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2557
      ERROR;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2558
        s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2559
        s4o.print("&");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2560
        param_value->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2561
#endif
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 635
diff changeset
  2562
    break;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2563
    } /* switch */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2564
  } /* for(...) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2565
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2566
  // symbol->parameter_assignment->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2567
  s4o.print(")");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2568
  nv->pop();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2569
  return;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2570
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2571
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2572
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2573
public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2574
void *visit(program_configuration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2575
  TRACE("program_configuration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2576
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2577
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2578
  switch (wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2579
    case local_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2580
    case localinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2581
      s4o.print(s4o.indent_spaces);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2582
      symbol->program_type_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2583
      s4o.print(" ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2584
      symbol->program_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2585
      if (wanted_varformat == localinit_vf) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2586
        // TODO...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2587
        // program_call(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2588
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2589
      s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2590
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2591
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2592
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2593
      s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2594
      program_constructor_call(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2595
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2596
      symbol->program_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2597
      s4o.print("(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2598
      symbol->prog_conf_elements->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2599
      nv->pop();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2600
      s4o.print(")");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2601
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2602
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2603
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2604
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2605
      ERROR; /* not supported, and not needed either... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2606
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2607
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2608
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2609
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2610
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2611
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2612
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2613
/* prog_conf_elements ',' prog_conf_element */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2614
//SYM_LIST(prog_conf_elements_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2615
void *visit(prog_conf_elements_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2616
  TRACE("prog_conf_elements_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2617
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2618
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2619
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2620
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2621
/*  fb_name WITH task_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2622
//SYM_REF2(fb_task_c, fb_name, task_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2623
void *visit(fb_task_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2624
  TRACE("fb_task_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2625
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2626
  /* TODO...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2627
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2628
   * NOTE: Not yet supported...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2629
   *       We do not support allocating specific function blocks declared
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2630
   *       inside a program to be executed by a different task from the one
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2631
   *       already executing the program itself.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2632
   *       This is mostly because I (Mario) simply do not understand the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2633
   *       semantics the standard expects us to implement in this case. It is all
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2634
   *       very confusing, and very poorly defined in the standard!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2635
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2636
  ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2637
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2638
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2639
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2640
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2641
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2642
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2643
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2644
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2645
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2646
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2647
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2648
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2649
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2650
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2651
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2652
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2653
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2654
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2655
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2656
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2657
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2658
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2659
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2660
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2661
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2662
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2663
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2664
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2665
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2666
/*  any_symbolic_variable ASSIGN prog_data_source */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2667
// SYM_REF2(prog_cnxn_assign_c, symbolic_variable, prog_data_source)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2668
void *visit(prog_cnxn_assign_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2669
  TRACE("prog_cnxn_assign_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2670
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2671
  /* TODO... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2672
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2673
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2674
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2675
/* any_symbolic_variable SENDTO data_sink */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2676
// SYM_REF2(prog_cnxn_sendto_c, symbolic_variable, prog_data_source)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2677
void *visit(prog_cnxn_sendto_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2678
  TRACE("prog_cnxn_sendto_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2679
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2680
  /* TODO... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2681
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2682
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2683
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2684
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2685
/* VAR_CONFIG instance_specific_init_list END_VAR_BOGUS */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2686
SYM_REF2(instance_specific_initializations_c, instance_specific_init_list, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2687
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2688
/* helper symbol for instance_specific_initializations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2689
SYM_LIST(instance_specific_init_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2690
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2691
/* resource_name '.' program_name '.' {fb_name '.'}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2692
    ((variable_name [location] ':' located_var_spec_init) | (fb_name ':' fb_initialization))
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2693
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2694
SYM_REF6(instance_specific_init_c, resource_name, program_name, any_fb_name_list, variable_name, location, initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2695
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2696
/* helper symbol for instance_specific_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2697
/* function_block_type_name ':=' structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2698
SYM_REF2(fb_initialization_c, function_block_type_name, structure_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2699
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2700
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2701
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2702
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2703
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2704
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2705
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2706
/* B.2 - Language IL (Instruction List) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2707
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2708
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2709
/* B 2.1 Instructions and Operands */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2710
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2711
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2712
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2713
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2714
/* B 2.2 Operators */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2715
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2716
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2717
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2718
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2719
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2720
/* B.3 - Language ST (Structured Text) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2721
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2722
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2723
/* B 3.1 - Expressions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2724
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2725
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2726
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2727
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2728
/* B 3.2 Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2729
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2730
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2731
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2732
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2733
/* B 3.2.1 Assignment Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2734
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2735
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2736
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2737
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2738
/* B 3.2.2 Subprogram Control Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2739
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2740
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2741
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2742
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2743
/* B 3.2.3 Selection Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2744
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2745
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2746
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2747
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2748
/* B 3.2.4 Iteration Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2749
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2750
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2751
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2752
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2753
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2754
}; /* generate_c_vardecl_c */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2755
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2756
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2757