stage4/generate_c/generate_c_typedecl.cc
author mjsousa
Sun, 13 Jul 2014 13:47:16 +0100
changeset 910 a0518971127d
parent 909 8b2a31dea131
child 913 1c74da17cb61
permissions -rw-r--r--
Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     1
/*
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 221
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 221
diff changeset
     3
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 221
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: 221
diff changeset
     5
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 221
diff changeset
     6
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 221
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: 221
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: 221
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: 221
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: 221
diff changeset
    11
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 221
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: 221
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: 221
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: 221
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: 221
diff changeset
    16
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 221
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: 221
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: 221
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
 */
139
668a54686827 added missing includes on some platform (gentoo/gcc-4.3.1)
etisserant
parents: 123
diff changeset
    24
#include <stdlib.h>
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    25
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    26
class generate_c_typedecl_c: public generate_c_base_c {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    27
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    28
  protected:
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    29
    stage4out_c &s4o_incl;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    30
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    31
  private:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    32
    symbol_c* current_type_name;
309
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
    33
    bool array_is_derived;
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    34
    generate_c_base_c *basedecl;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    35
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    36
  public:
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    37
    generate_c_typedecl_c(stage4out_c *s4o_ptr): generate_c_base_c(s4o_ptr), s4o_incl(*s4o_ptr) {
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    38
      current_typedefinition = none_td;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    39
      current_basetypedeclaration = none_bd;
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
    40
      current_type_name = NULL;
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    41
      basedecl = new generate_c_base_c(&s4o_incl);
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    42
    }
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    43
    ~generate_c_typedecl_c(void) {
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    44
      delete basedecl;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    45
    }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    46
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    47
    typedef enum {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    48
      none_td,
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
    49
      enumerated_td,
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    50
      subrange_td,
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
    51
      array_td,
661
f537c3315f83 Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents: 594
diff changeset
    52
      struct_td
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    53
    } typedefinition_t;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    54
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    55
    typedefinition_t current_typedefinition;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    56
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    57
    typedef enum {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    58
      none_bd,
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    59
      subrangebasetype_bd,
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    60
      subrangetest_bd,
309
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
    61
      arrayderiveddeclaration_bd,
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    62
      arraybasetype_bd,
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    63
      arraybasetypeincl_bd,
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
    64
      arraysubrange_bd
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    65
    } basetypedeclaration_t;
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
    66
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    67
    basetypedeclaration_t current_basetypedeclaration;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    68
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    69
    void *print_list_incl(list_c *list,
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    70
         std::string pre_elem_str = "",
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    71
         std::string inter_elem_str = "",
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    72
         std::string post_elem_str = "",
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    73
         visitor_c *visitor = NULL) {
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    74
      if (visitor == NULL) visitor = this;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    75
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    76
      if (list->n > 0) {
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    77
//std::cout << "generate_c_base_c::print_list(n = " << list->n << ")   000\n";
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    78
        s4o_incl.print(pre_elem_str);
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    79
        list->elements[0]->accept(*visitor);
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    80
      }
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    81
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    82
      for(int i = 1; i < list->n; i++) {
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    83
//std::cout << "generate_c_base_c::print_list   " << i << "\n";
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    84
        s4o_incl.print(inter_elem_str);
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    85
        list->elements[i]->accept(*visitor);
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    86
      }
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    87
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    88
      if (list->n > 0)
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    89
        s4o_incl.print(post_elem_str);
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    90
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    91
      return NULL;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    92
    }
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    93
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
    94
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    95
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    96
/* B 0 - Programming Model */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    97
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    98
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    99
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   100
/*************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   101
/* B.1 - Common elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   102
/*************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   103
/*******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   104
/* B 1.1 - Letters, digits and identifiers */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   105
/*******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   106
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   107
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   108
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   109
/* B 1.2 - Constants */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   110
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   111
  /* originally empty... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   112
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   113
/******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   114
/* B 1.2.1 - Numeric Literals */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   115
/******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   116
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   117
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   118
/*******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   119
/* B.1.2.2   Character Strings */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   120
/*******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   121
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   122
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   123
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   124
/* B 1.2.3 - Time Literals */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   125
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   126
/************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   127
/* B 1.2.3.1 - Duration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   128
/************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   129
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   130
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   131
/************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   132
/* B 1.2.3.2 - Time of day and Date */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   133
/************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   134
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   135
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   136
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   137
/* B.1.3 - Data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   138
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   139
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   140
/* B 1.3.1 - Elementary Data Types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   141
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   142
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   143
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   144
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   145
/* B.1.3.2 - Generic data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   146
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   147
  /* originally empty... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   148
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   149
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   150
/* B 1.3.3 - Derived data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   151
/********************************/
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   152
/*  subrange_type_name ':' subrange_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   153
void *visit(subrange_type_declaration_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   154
  TRACE("subrange_type_declaration_c");  
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   155
  
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   156
  current_typedefinition = subrange_td;
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   157
  current_type_name = symbol->subrange_type_name;
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   158
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 178
diff changeset
   159
  s4o_incl.print("__DECLARE_DERIVED_TYPE(");
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   160
  current_type_name->accept(*basedecl);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   161
  s4o_incl.print(",");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   162
  current_basetypedeclaration = subrangebasetype_bd;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   163
  symbol->subrange_spec_init->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   164
  current_basetypedeclaration = none_bd;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 178
diff changeset
   165
  s4o_incl.print(")\n");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   166
  
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   167
  current_basetypedeclaration = subrangetest_bd;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   168
  symbol->subrange_spec_init->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   169
  current_basetypedeclaration = none_bd;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   170
  
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   171
  current_type_name = NULL;
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   172
  current_typedefinition = none_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   173
98
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
/* subrange_specification ASSIGN signed_integer */
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   178
void *visit(subrange_spec_init_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   179
  TRACE("subrange_spec_init_c");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   180
  symbol->subrange_specification->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   181
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   182
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   183
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   184
/*  integer_type_name '(' subrange')' */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   185
void *visit(subrange_specification_c *symbol) {
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   186
  TRACE("subrange_specification_c");
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   187
  if (current_typedefinition == subrange_td) {
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   188
    switch (current_basetypedeclaration) {
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   189
      case subrangebasetype_bd:
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   190
        symbol->integer_type_name->accept(*basedecl);
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   191
        break;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   192
      case subrangetest_bd:
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   193
        if (symbol->subrange != NULL) {
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   194
          s4o_incl.print("static inline ");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   195
          current_type_name->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   196
          s4o_incl.print(" __CHECK_");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   197
          current_type_name->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   198
          s4o_incl.print("(");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   199
          current_type_name->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   200
          s4o_incl.print(" value) {\n");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   201
          s4o_incl.indent_right();
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   202
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   203
          /* NOTE: IEC 61131-3 v2 syntax mandates that the integer type name be one of SINT, ..., LINT, USINT, ... ULIT */
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   204
          /*       For this reason, the following condition will always be false, and therefore this is a block
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   205
           *       of dead code. However, let's not delete it for now. It might come in useful for IEC 61131-3 v3.
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   206
           *       For the moment, we just comment it out!
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   207
           */
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   208
          /*
854
13d0b67de111 Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
   209
          if (get_datatype_info_c::is_subrange(symbol->integer_type_name)) {
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   210
            s4o_incl.print(s4o_incl.indent_spaces + "value = __CHECK_");
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   211
            symbol->integer_type_name->accept(*this);
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   212
            s4o_incl.print("(value);\n");
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   213
          }
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   214
          */
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   215
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   216
          symbol->subrange->accept(*this);
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   217
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   218
          s4o_incl.indent_left();
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   219
          s4o_incl.print("}\n");
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   220
        }
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   221
        else {
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   222
          s4o_incl.print("#define __CHECK_");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   223
          current_type_name->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   224
          s4o_incl.print(" __CHECK_");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   225
          symbol->integer_type_name->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   226
          s4o_incl.print("\n");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   227
        }
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   228
        break;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   229
      default:
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   230
        break;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   231
    }
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   232
  }
860
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   233
  return NULL;
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   234
}
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   235
98
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
/*  signed_integer DOTDOT signed_integer */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   238
void *visit(subrange_c *symbol) {
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   239
  TRACE("subrange_c");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   240
  int dimension;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   241
  switch (current_typedefinition) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   242
    case array_td:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   243
      if (current_basetypedeclaration == arraysubrange_bd) {
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   244
        s4o_incl.print("[");
594
c8092e909886 Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents: 592
diff changeset
   245
        s4o_incl.print(symbol->dimension);
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   246
        s4o_incl.print("]");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   247
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   248
      else
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   249
        symbol->lower_limit->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   250
      break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   251
    case subrange_td:
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   252
      s4o_incl.print(s4o_incl.indent_spaces + "if (value < ");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   253
      symbol->lower_limit->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   254
      s4o_incl.print(")\n");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   255
      s4o_incl.indent_right();
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   256
      s4o_incl.print(s4o_incl.indent_spaces + "return ");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   257
      symbol->lower_limit->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   258
      s4o_incl.print(";\n");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   259
      s4o_incl.indent_left();
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   260
      s4o_incl.print(s4o_incl.indent_spaces + "else if (value > ");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   261
      symbol->upper_limit->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   262
      s4o_incl.print(")\n");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   263
      s4o_incl.indent_right();
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   264
      s4o_incl.print(s4o_incl.indent_spaces + "return ");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   265
      symbol->upper_limit->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   266
      s4o_incl.print(";\n");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   267
      s4o_incl.indent_left();
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   268
      s4o_incl.print(s4o_incl.indent_spaces + "else\n");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   269
      s4o_incl.indent_right();
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   270
      s4o_incl.print(s4o_incl.indent_spaces + "return value;\n");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   271
      s4o_incl.indent_left();
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   272
    default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   273
      break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   274
  }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   275
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   276
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   277
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   278
/*  enumerated_type_name ':' enumerated_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   279
void *visit(enumerated_type_declaration_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   280
  TRACE("enumerated_type_declaration_c");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   281
  
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   282
  current_typedefinition = enumerated_td;
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   283
  current_type_name = symbol->enumerated_type_name;
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   284
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   285
  s4o_incl.print("__DECLARE_ENUMERATED_TYPE(");
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   286
  current_type_name->accept(*basedecl);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   287
  s4o_incl.print(",\n");
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   288
  s4o_incl.indent_right();
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   289
  symbol->enumerated_spec_init->accept(*this);
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   290
  s4o_incl.indent_left();
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   291
  s4o_incl.print(")\n");
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   292
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   293
  current_type_name = NULL;
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   294
  current_typedefinition = none_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   295
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   296
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   297
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   298
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   299
/* enumerated_specification ASSIGN enumerated_value */
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   300
void *visit(enumerated_spec_init_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   301
  TRACE("enumerated_spec_init_c");
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   302
  if (current_typedefinition == enumerated_td)
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   303
    symbol->enumerated_specification->accept(*this);
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   304
  else
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   305
    symbol->enumerated_specification->accept(*basedecl);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   306
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   307
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   308
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   309
/* helper symbol for enumerated_specification->enumerated_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   310
/* enumerated_value_list ',' enumerated_value */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   311
void *visit(enumerated_value_list_c *symbol) {
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   312
  TRACE("enumerated_value_list_c");
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   313
  print_list_incl(symbol, s4o_incl.indent_spaces, ",\n"+s4o_incl.indent_spaces, "\n");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   314
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   315
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   316
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   317
/* enumerated_type_name '#' identifier */
860
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   318
/* Handled by generate_c_base_c class!!
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   319
void *visit(enumerated_value_c *symbol) {}
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   320
*/
98
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
/*  identifier ':' array_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   323
void *visit(array_type_declaration_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   324
  TRACE("array_type_declaration_c");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   325
  
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   326
  current_typedefinition = array_td;
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   327
  current_type_name = symbol->identifier;
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   328
309
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   329
  array_is_derived = false;
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   330
  current_basetypedeclaration = arrayderiveddeclaration_bd;
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   331
  symbol->array_spec_init->accept(*this);
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   332
  current_basetypedeclaration = none_bd;
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   333
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   334
  if (array_is_derived)
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   335
    s4o_incl.print("__DECLARE_DERIVED_TYPE(");
309
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   336
  else
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   337
    s4o_incl.print("__DECLARE_ARRAY_TYPE(");
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   338
  current_type_name->accept(*basedecl);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   339
  s4o_incl.print(",");
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   340
  current_basetypedeclaration = arraybasetypeincl_bd;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   341
  symbol->array_spec_init->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   342
  current_basetypedeclaration = none_bd;
309
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   343
  if (!array_is_derived) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   344
    s4o_incl.print(",");
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   345
    current_basetypedeclaration = arraysubrange_bd;
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   346
    symbol->array_spec_init->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   347
    current_basetypedeclaration = none_bd;
309
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   348
  }
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 178
diff changeset
   349
  s4o_incl.print(")\n");
322
293967b9277d Fix bug with array attribute in structure declaration
laurent
parents: 310
diff changeset
   350
328
66cd5d9893dd Add support for finding type of a constant enumerated value and managing conflict between same identifiers defined in different enumerated data types
laurent
parents: 327
diff changeset
   351
  current_type_name = NULL;
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   352
  current_typedefinition = none_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   353
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   354
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   355
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   356
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   357
/* array_specification [ASSIGN array_initialization] */
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   358
/* array_initialization may be NULL ! */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   359
void *visit(array_spec_init_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   360
  TRACE("array_spec_init_c");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   361
  
322
293967b9277d Fix bug with array attribute in structure declaration
laurent
parents: 310
diff changeset
   362
  if (current_typedefinition == array_td) {
293967b9277d Fix bug with array attribute in structure declaration
laurent
parents: 310
diff changeset
   363
    switch (current_basetypedeclaration) {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   364
      case arrayderiveddeclaration_bd:
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   365
        array_is_derived = dynamic_cast<identifier_c *>(symbol->array_specification) != NULL;
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   366
        break;
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   367
      default:
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   368
        if (array_is_derived)
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   369
          symbol->array_specification->accept(*basedecl);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   370
        else
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   371
          symbol->array_specification->accept(*this);
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   372
        break;
322
293967b9277d Fix bug with array attribute in structure declaration
laurent
parents: 310
diff changeset
   373
    }
293967b9277d Fix bug with array attribute in structure declaration
laurent
parents: 310
diff changeset
   374
  }
293967b9277d Fix bug with array attribute in structure declaration
laurent
parents: 310
diff changeset
   375
  else {
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   376
    symbol->array_specification->accept(*basedecl);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   377
  }
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   378
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   379
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   380
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   381
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   382
void *visit(array_specification_c *symbol) {
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   383
  TRACE("array_specification_c");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   384
  switch (current_basetypedeclaration) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   385
    case arraybasetype_bd:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   386
      symbol->non_generic_type_name->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   387
      break;
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   388
    case arraybasetypeincl_bd:
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   389
      symbol->non_generic_type_name->accept(*basedecl);
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   390
      break;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   391
    case arraysubrange_bd:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   392
      symbol->array_subrange_list->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   393
      break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   394
    default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   395
      break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   396
  }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   397
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   398
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   399
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   400
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   401
/*  TYPE type_declaration_list END_TYPE */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   402
void *visit(data_type_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   403
  TRACE("data_type_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   404
  symbol->type_declaration_list->accept(*this);
857
70c4c259bc3e fix a couple of typos.
mjsousa
parents: 854
diff changeset
   405
  s4o_incl.print("\n\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   406
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   407
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   408
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   409
/* helper symbol for data_type_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   410
void *visit(type_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   411
  TRACE("type_declaration_list_c");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   412
  return print_list_incl(symbol, "", "\n", "\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   413
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   414
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   415
/*  simple_type_name ':' simple_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   416
void *visit(simple_type_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   417
  TRACE("simple_type_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   418
307
6ea381792f59 Fix missing '(' when declaring new simple derived data type.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   419
  s4o_incl.print("__DECLARE_DERIVED_TYPE(");
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   420
  symbol->simple_type_name->accept(*basedecl);
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   421
  s4o_incl.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   422
  symbol->simple_spec_init->accept(*this);
309
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   423
  s4o_incl.print(")\n");
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
   424
854
13d0b67de111 Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
   425
  if (get_datatype_info_c::is_subrange(symbol->simple_type_name)) {
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   426
    s4o_incl.print("#define __CHECK_");
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   427
    current_type_name->accept(*basedecl);
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   428
    s4o_incl.print(" __CHECK_");
706
31553c22f318 Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents: 594
diff changeset
   429
    symbol->simple_spec_init->accept(*this);
859
41d11bacfc9b Code cleanup (part 1): subrange check functions are now declared in POUS.h (as static inline functions or #define)
mjsousa
parents: 857
diff changeset
   430
    s4o_incl.print("\n");
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
   431
  }
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
   432
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   433
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   434
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   435
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   436
/* simple_specification [ASSIGN constant] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   437
//SYM_REF2(simple_spec_init_c, simple_specification, constant)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   438
// <constant> may be NULL
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   439
void *visit(simple_spec_init_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   440
  TRACE("simple_spec_init_c");
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   441
  symbol->simple_specification->accept(*basedecl);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   442
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   443
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   444
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   445
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   446
/*  subrange_type_name ':' subrange_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   447
SYM_REF2(subrange_type_declaration_c, subrange_type_name, subrange_spec_init)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   448
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   449
/* subrange_specification ASSIGN signed_integer */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   450
SYM_REF2(subrange_spec_init_c, subrange_specification, signed_integer)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   451
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   452
/*  integer_type_name '(' subrange')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   453
SYM_REF2(subrange_specification_c, integer_type_name, subrange)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   454
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   455
/*  signed_integer DOTDOT signed_integer */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   456
SYM_REF2(subrange_c, lower_limit, upper_limit)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   457
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   458
/*  enumerated_type_name ':' enumerated_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   459
SYM_REF2(enumerated_type_declaration_c, enumerated_type_name, enumerated_spec_init)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   460
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   461
/* enumerated_specification ASSIGN enumerated_value */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   462
SYM_REF2(enumerated_spec_init_c, enumerated_specification, enumerated_value)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   463
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   464
/* helper symbol for enumerated_specification->enumerated_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   465
/* enumerated_value_list ',' enumerated_value */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   466
SYM_LIST(enumerated_value_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   467
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   468
/* enumerated_type_name '#' identifier */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   469
SYM_REF2(enumerated_value_c, type, value)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   470
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   471
/*  identifier ':' array_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   472
SYM_REF2(array_type_declaration_c, identifier, array_spec_init)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   473
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   474
/* array_specification [ASSIGN array_initialization} */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   475
/* array_initialization may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   476
SYM_REF2(array_spec_init_c, array_specification, array_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   477
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   478
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   479
SYM_REF2(array_specification_c, array_subrange_list, non_generic_type_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   480
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   481
/* helper symbol for array_specification */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   482
/* array_subrange_list ',' subrange */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   483
SYM_LIST(array_subrange_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   484
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   485
/* array_initialization:  '[' array_initial_elements_list ']' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   486
/* helper symbol for array_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   487
/* array_initial_elements_list ',' array_initial_elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   488
SYM_LIST(array_initial_elements_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   489
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   490
/* integer '(' [array_initial_element] ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   491
/* array_initial_element may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   492
SYM_REF2(array_initial_elements_c, integer, array_initial_element)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   493
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   494
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   495
/*  structure_type_name ':' structure_specification */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   496
//SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   497
void *visit(structure_type_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   498
  TRACE("structure_type_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   499
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   500
  current_typedefinition = struct_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   501
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 178
diff changeset
   502
  s4o_incl.print("__DECLARE_STRUCT_TYPE(");
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   503
  symbol->structure_type_name->accept(*basedecl);
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   504
  s4o_incl.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   505
  symbol->structure_specification->accept(*this);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   506
  s4o_incl.print(")\n");
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   507
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   508
  current_typedefinition = none_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   509
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   510
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   511
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   512
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   513
/* structure_type_name ASSIGN structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   514
/* structure_initialization may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   515
//SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   516
void *visit(initialized_structure_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   517
  TRACE("initialized_structure_c");
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   518
  
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   519
  symbol->structure_type_name->accept(*basedecl);
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   520
  
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   521
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   522
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   523
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   524
/* helper symbol for structure_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   525
/* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   526
/* structure_element_declaration_list structure_element_declaration ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   527
//SYM_LIST(structure_element_declaration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   528
void *visit(structure_element_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   529
  TRACE("structure_element_declaration_list_c");
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   530
  s4o_incl.print("\n");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   531
  s4o_incl.indent_right();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   532
  s4o_incl.print(s4o_incl.indent_spaces);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   533
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   534
  print_list_incl(symbol, "", s4o_incl.indent_spaces, "");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   535
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   536
  s4o_incl.indent_left();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   537
  s4o_incl.print(s4o_incl.indent_spaces);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   538
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   539
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   540
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   541
/*  structure_element_name ':' spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   542
//SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   543
void *visit(structure_element_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   544
  TRACE("structure_element_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   545
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   546
  symbol->spec_init->accept(*this);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   547
  s4o_incl.print(" ");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   548
  symbol->structure_element_name->accept(*basedecl);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   549
  s4o_incl.print(";\n");
857
70c4c259bc3e fix a couple of typos.
mjsousa
parents: 854
diff changeset
   550
  s4o_incl.print(s4o_incl.indent_spaces);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   551
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   552
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   553
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   554
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   555
/* helper symbol for structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   556
/* structure_initialization: '(' structure_element_initialization_list ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   557
/* structure_element_initialization_list ',' structure_element_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   558
//SYM_LIST(structure_element_initialization_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   559
void *visit(structure_element_initialization_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   560
  TRACE("structure_element_initialization_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   561
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   562
  // TODO ???
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   563
  //ERROR;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   564
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   565
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   566
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   567
/*  structure_element_name ASSIGN value */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   568
//SYM_REF2(structure_element_initialization_c, structure_element_name, value)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   569
void *visit(structure_element_initialization_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   570
  TRACE("structure_element_initialization_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   571
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   572
  // TODO ???
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   573
  //ERROR;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   574
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   575
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   576
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   577
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   578
/*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   579
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   580
 * NOTE:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   581
 * (Summary: Contrary to what is expected, the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   582
 *           string_type_declaration_c is not used to store
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   583
 *           simple string type declarations that do not include
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   584
 *           size limits.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   585
 *           For e.g.:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   586
 *             str1_type: STRING := "hello!"
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   587
 *           will be stored in a simple_type_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   588
 *           instead of a string_type_declaration_c.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   589
 *           The following:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   590
 *             str2_type: STRING [64] := "hello!"
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   591
 *           will be stored in a sring_type_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   592
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   593
 *           Read on for why this is done...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   594
 * End Summary)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   595
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   596
 * According to the spec, the valid construct
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   597
 * TYPE new_str_type : STRING := "hello!"; END_TYPE
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   598
 * has two possible routes to type_declaration...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   599
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   600
 * Route 1:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   601
 * type_declaration: single_element_type_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   602
 * single_element_type_declaration: simple_type_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   603
 * simple_type_declaration: identifier ':' simple_spec_init
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   604
 * simple_spec_init: simple_specification ASSIGN constant
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   605
 * (shift:  identifier <- 'new_str_type')
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   606
 * simple_specification: elementary_type_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   607
 * elementary_type_name: STRING
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   608
 * (shift: elementary_type_name <- STRING)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   609
 * (reduce: simple_specification <- elementary_type_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   610
 * (shift: constant <- "hello!")
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   611
 * (reduce: simple_spec_init: simple_specification ASSIGN constant)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   612
 * (reduce: ...)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   613
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   614
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   615
 * Route 2:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   616
 * type_declaration: string_type_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   617
 * string_type_declaration: identifier ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   618
 * (shift:  identifier <- 'new_str_type')
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   619
 * elementary_string_type_name: STRING
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   620
 * (shift: elementary_string_type_name <- STRING)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   621
 * (shift: string_type_declaration_size <-  empty )
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   622
 * string_type_declaration_init: ASSIGN character_string
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   623
 * (shift: character_string <- "hello!")
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   624
 * (reduce: string_type_declaration_init <- ASSIGN character_string)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   625
 * (reduce: string_type_declaration <- identifier ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init )
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   626
 * (reduce: type_declaration <- string_type_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   627
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   628
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   629
 * At first glance it seems that removing route 1 would make
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   630
 * the most sense. Unfortunately the construct 'simple_spec_init'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   631
 * shows up multiple times in other rules, so changing this construct
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   632
 * would also mean changing all the rules in which it appears.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   633
 * I (Mario) therefore chose to remove route 2 instead. This means
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   634
 * that the above declaration gets stored in a
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   635
 * simple_type_declaration_c, and not in a string_type_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   636
 * as would be expected!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   637
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   638
/*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   639
SYM_REF4(string_type_declaration_c,	string_type_name,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   640
					elementary_string_type_name,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   641
					string_type_declaration_size,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   642
					string_type_declaration_init) /* may be == NULL! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   643
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   644
909
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   645
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   646
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   647
/* ref_spec:  REF_TO (non_generic_type_name | function_block_type_name) */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   648
// SYM_REF1(ref_spec_c, type_name)
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   649
void *visit(ref_spec_c *symbol) {
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   650
  return symbol->type_name->accept(*this);
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   651
}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   652
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   653
/* For the moment, we do not support initialising reference data types */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   654
/* ref_spec_init: ref_spec [ ASSIGN ref_initialization ] */ 
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   655
/* NOTE: ref_initialization may be NULL!! */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   656
// SYM_REF2(ref_spec_init_c, ref_spec, ref_initialization)
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   657
void *visit(ref_spec_init_c *symbol) {
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   658
  return symbol->ref_spec->accept(*this);
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   659
}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   660
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   661
/* ref_type_decl: identifier ':' ref_spec_init */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   662
// SYM_REF2(ref_type_decl_c, ref_type_name, ref_spec_init)
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   663
void *visit(ref_type_decl_c *symbol) {
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   664
  TRACE("ref_type_decl_c");
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   665
  
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   666
  current_type_name = NULL;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   667
  current_typedefinition = none_td;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   668
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   669
  s4o_incl.print("__DECLARE_REFTO_TYPE(");
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   670
  symbol->ref_type_name->accept(*basedecl);
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   671
  s4o_incl.print(", ");
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   672
  symbol->ref_spec_init->accept(*this);
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   673
  s4o_incl.print(") ");
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   674
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   675
  current_type_name = NULL;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   676
  current_typedefinition = none_td;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   677
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   678
  return NULL;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   679
}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   680
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   681
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   682
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   683
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   684
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   685
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   686
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   687
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   688
/* B 1.4 - Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   689
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   690
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   691
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   692
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   693
/* B.1.4.1   Directly Represented Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   694
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   695
// direct_variable: direct_variable_token	{$$ = new direct_variable_c($1);};
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   696
void *visit(direct_variable_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   697
  TRACE("direct_variable_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   698
  /* Do not use print_token() as it will change everything into uppercase */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   699
  if (strlen(symbol->value) == 0) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   700
  return s4o.printlocation(symbol->value + 1);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   701
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   702
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   703
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   704
/*************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   705
/* B.1.4.2   Multi-element Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   706
/*************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   707
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   708
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   709
/******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   710
/* B 1.4.3 - Declaration & Initialisation */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   711
/******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   712
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   713
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   714
/**************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   715
/* B.1.5 - Program organization units */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   716
/**************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   717
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   718
/* B 1.5.1 - Functions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   719
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   720
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   721
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   722
/*****************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   723
/* B 1.5.2 - Function Blocks */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   724
/*****************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   725
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   726
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   727
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   728
/* B 1.5.3 - Programs */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   729
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   730
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   731
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   732
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   733
/* B.1.6  Sequential function chart elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   734
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   735
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   736
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   737
/* B 1.7 Configuration elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   738
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   739
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   740
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   741
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   742
/* B.2 - Language IL (Instruction List) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   743
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   744
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   745
/* B 2.1 Instructions and Operands */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   746
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   747
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   748
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   749
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   750
/* B 2.2 Operators */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   751
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   752
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   753
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   754
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   755
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   756
/* B.3 - Language ST (Structured Text) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   757
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   758
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   759
/* B 3.1 - Expressions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   760
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   761
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   762
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   763
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   764
/* B 3.2 Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   765
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   766
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   767
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   768
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   769
/* B 3.2.1 Assignment Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   770
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   771
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   772
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   773
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   774
/* B 3.2.2 Subprogram Control Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   775
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   776
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   777
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   778
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   779
/* B 3.2.3 Selection Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   780
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   781
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   782
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   783
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   784
/* B 3.2.4 Iteration Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   785
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   786
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   787
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   788
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   789
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   790
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   791
}; /* generate_c_typedecl_c */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   792
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   793
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   794