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