stage4/generate_c/generate_c_typedecl.cc
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Sun, 14 Oct 2018 20:14:13 +0300
changeset 1073 24ef30a9bcee
parent 1041 56ebe2a31b5b
permissions -rw-r--r--
revert commits improved performance of some extensible Standard Functions (ADD, MUL, AND, OR, XOR)

Following commits are reverted:
mjsousa 0b275a2 improve performance of some extensible Standard Functions (ADD, MUL, AND, OR, XOR) -- increase hardcoded limit to 499
mjsousa 2228799 improve performance of some extensible Standard Functions (ADD, MUL, AND, OR, XOR) -- Add comments!!
mjsousa ce81fa6 improve performance of some extensible Standard Functions (ADD, MUL, AND, OR, XOR)"

The reason is that they cause regression in some cases (if function is
used as argument for function block, for example) and this is not
fixed for a long time.
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
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    26
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    27
/* Ths class contains two main classes:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    28
 *    - generate_c_typedecl_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    29
 *    - generate_c_implicit_typedecl_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    30
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    31
 * and an auxiliary class
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    32
 *    - generate_datatypes_aliasid_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    33
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    34
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    35
 * Both the generate_c_typedecl_c and the generate_c_implicit_typedecl_c may set a stage4
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    36
 * annotation (in the stage4 annotation map of each symbol_c) named 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    37
 *   "generate_c_annotaton__implicit_type_id"
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    38
 * If this annotation is set, the generate_c_base_c will print out this value instead of 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    39
 * the datatype's name!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    40
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    41
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    42
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    43
 * generate_c_typedecl_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    44
 * ---------------------
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    45
 *   Given a datatype object (i.e. an object in the AST that is also used to define a datatype,
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    46
 *    typically one that may be returned by search_basetype_c), this class will generate the 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    47
 *    C code to declare an equivakent datatype in C.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    48
 *   Note that array datatypes are handled in a special way; instead of using the name given
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    49
 *    to it in the IEC 61131-3 source code, and new alias is created for the datatype name in C.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    50
 *    Eplanations why we do this may be found further on...
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    51
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    52
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    53
 * generate_c_implicit_typedecl_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    54
 * ------------------------------
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    55
 *   Given a POU or a derived datatype declaration, it will search for any implicitly defined 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    56
 *    datatypes in that POU/datatype declaration. Implicit datatypes are datatypes that are not 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    57
 *    explicitly declared and given a name. Example:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    58
 *       VAR a: ARRAY [9..11] of INT; END_VAR
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    59
 *    Here, the array is implictly delcared.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    60
 *    For eac implicitly defined datatype, an alias for that datatype is created (by calling
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    61
 *    generate_datatypes_aliasid_c), and a C declaration is generated in C source code (by
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    62
 *    calling generate_c_typedecl_c).
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    63
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    64
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    65
 * generate_datatypes_aliasid_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    66
 * ----------------------------
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    67
 *   Given a datatype object (i.e. an object in the AST that defines a datatype), it will create
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    68
 *    an alias name for that datatype.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    69
 *    This class is used by both the generate_c_implicit_typedecl_c, and the generate_c_typedecl_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    70
 *    classes!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    71
 */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    72
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    73
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    74
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    75
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    76
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    77
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    78
/* generate an alias/name (identifier) for array and REF_TO datatypes */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    79
/*
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    80
 *  The generated alias is created based on the structure of the datatype itself, in order to
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    81
 *  guarantee that any two datatypes that have the same internal format will result in the same
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    82
 *  alias.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    83
 *   examples:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    84
 *      ARRAY [9..11] of INT        --> __ARRAY_9_11_OF_INT
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    85
 *      REF_TO INT                  --> __REF_TO_INT
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    86
 *      ARRAY [9..11] of REF_TO INT --> __ARRAY_9_11_OF___REF_TO_INT
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    87
 */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    88
class generate_datatypes_aliasid_c: fcall_visitor_c {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    89
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    90
  private:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    91
    //std::map<std::string, int> inline_array_defined;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    92
    std::string current_array_name;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    93
    static generate_datatypes_aliasid_c *singleton_;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    94
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    95
  public:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    96
    generate_datatypes_aliasid_c(void) {};
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    97
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    98
    virtual ~generate_datatypes_aliasid_c(void) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
    99
      //inline_array_defined.clear(); // Not really necessary...
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   100
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   101
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   102
    /* implement the virtual member function declared in fcall_visitor_c */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   103
    // by default generate an ERROR if a visit method is called, unless it is explicitly handled in generate_datatypes_aliasid_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   104
    void fcall(symbol_c *symbol) {ERROR;} 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   105
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   106
    static identifier_c *create_id(symbol_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   107
      if (NULL == singleton_) singleton_ = new generate_datatypes_aliasid_c();
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   108
      if (NULL == singleton_) ERROR;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   109
      singleton_->current_array_name = "";
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   110
      symbol->accept(*singleton_);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   111
      const char *str1 = singleton_->current_array_name.c_str();
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   112
      char       *str2 = (char *)malloc(strlen(str1)+1);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   113
      if (NULL == str2) ERROR;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   114
      strcpy(str2, str1);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   115
      identifier_c *id = new identifier_c(str2);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   116
      /* Copy all the anotations in the symbol_c object 'symbol' to the newly created 'id' object
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   117
       *   This includes the location (in the IEC 61131-3 source file) annotations set in stage1_2,
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   118
       *   the symbol->datatype set in stage3, and any other anotaions that may be created in the future!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   119
       */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   120
      *(dynamic_cast<symbol_c *>(id)) = *(dynamic_cast<symbol_c *>(symbol));
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   121
      return id;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   122
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   123
    
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   124
    /*************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   125
    /* B.1 - Common elements */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   126
    /*************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   127
    /**********************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   128
    /* B.1.3 - Data types */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   129
    /**********************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   130
    /***********************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   131
    /* B 1.3.1 - Elementary Data Types */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   132
    /***********************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   133
    /***********************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   134
    /* B 1.3.2 - Generic Data Types    */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   135
    /***********************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   136
    /********************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   137
    /* B 1.3.3 - Derived data types */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   138
    /********************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   139
    /* ref_spec:  REF_TO (non_generic_type_name | function_block_type_name) */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   140
    void *visit(ref_spec_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   141
      current_array_name = "__REF_TO_";
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   142
      current_array_name += get_datatype_info_c::get_id_str(symbol->type_name);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   143
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   144
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   145
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   146
    /******************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   147
    /* B 1.4.3 - Declaration & Initialization */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   148
    /******************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   149
    /* array_specification [ASSIGN array_initialization] */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   150
    /* array_initialization may be NULL ! */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   151
    void *visit(array_spec_init_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   152
      if (NULL == symbol->datatype) ERROR;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   153
      symbol->datatype->accept(*this); // the base datatype should be an array_specification_c !!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   154
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   155
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   156
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   157
    /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   158
    void *visit(array_specification_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   159
      current_array_name = "__ARRAY_OF_";
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   160
      if (    get_datatype_info_c::is_ref_to(symbol->non_generic_type_name)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   161
          && (get_datatype_info_c::get_ref_to(symbol->non_generic_type_name) != NULL)) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   162
        /* handle situations where we have 2 impliclitly defined datatype, namely a REF_TO inside an ARRAY
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   163
         *    e.g. TYPE array_of_ref_to_sint : ARRAY [1..3] OF  REF_TO  SINT; END_TYPE
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   164
         * The second condition (get_datatype_info_c::get_ref_to(symbol->non_generic_type_name) != NULL)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   165
         * in the above if() is to make sure we use the standard algorithm if the array is of a previously 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   166
         * defined REF_TO type, in which case symbol->non_generic_type_name will reference an identifier_c!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   167
         *    e.g. TYPE array_of_ref_to_sint : ARRAY [1..3] OF  REF_TO  SINT; END_TYPE
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   168
         */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   169
        current_array_name += "__REF_TO_";
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   170
        current_array_name += get_datatype_info_c::get_id_str(get_datatype_info_c::get_ref_to(symbol->non_generic_type_name));
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   171
      } else {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   172
        current_array_name += get_datatype_info_c::get_id_str(symbol->non_generic_type_name);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   173
      }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   174
      symbol->array_subrange_list->accept(*this);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   175
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   176
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   177
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   178
    /* helper symbol for array_specification */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   179
    /* array_subrange_list ',' subrange */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   180
    void *visit(array_subrange_list_c *symbol) {
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 958
diff changeset
   181
      for(int i = 0; i < symbol->n; i++) {symbol->get_element(i)->accept(*this);}
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   182
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   183
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   184
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   185
    /*  signed_integer DOTDOT signed_integer */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   186
    //SYM_REF2(subrange_c, lower_limit, upper_limit)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   187
    void *visit(subrange_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   188
      current_array_name += "_";
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   189
      std::stringstream ss;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   190
      ss << symbol->dimension;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   191
      current_array_name += ss.str();
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   192
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   193
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   194
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   195
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   196
};
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   197
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   198
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   199
generate_datatypes_aliasid_c *generate_datatypes_aliasid_c::singleton_ = NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   200
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   201
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   202
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   203
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   204
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   205
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   206
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   207
/***************************************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   208
/***************************************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   209
/***************************************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   210
/***************************************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   211
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   212
/* Given an object in the AST that defines a datatype, generate the C source code that declares an
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   213
 * equivalent dataype in C.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   214
 * WARNING: This class maintains internal state in the datatypes_already_defined map.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   215
 *          Using multiple isntances of this class may result in different C source code
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   216
 *          compared to when a single instance of this class is used for all datatype declarations!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   217
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   218
 * Except for arrays, the C datatype will have the same name as the name of the datatype in the
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   219
 * IEC 61131-3 source code.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   220
 * For arrays an alias is created for each datatype. This alias has the property of being equal
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   221
 * for arrays with the same internal structure.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   222
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   223
 * Example:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   224
 *  TYPE
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   225
 *      array1: ARRAY [9..11] of INT;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   226
 *      array2: ARRAY [9..11] of INT;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   227
 *  END_TYPE
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   228
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   229
 * will result in both arrays having the same name (__ARRAY_9_11_OF_INT) in the C source code.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   230
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   231
 * A single C datatype declaration will be generated for both arrays
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   232
 *  (the datatypes_already_defined keeps track of which datatypes have already been declared in C)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   233
 * This method of handling arrays is needed when the relaxed datatype model is used 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   234
 * (see get_datatype_info_c for explanation on the relaxed datatype model).
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   235
 */
950
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   236
/* The generate_c_typedecl_c inherits from generate_c_base_and_typeid_c because it will need the visitor's() to
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   237
 *   identifier_c, derived_datatype_identifier_c, and enumerated_value_c
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   238
 */
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   239
class generate_c_typedecl_c: public generate_c_base_and_typeid_c {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   240
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   241
  protected:
950
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   242
    /* The following member variable is completely useless - the s4o variable inherited from generate_c_base_and_typeid_c
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   243
     * could be used to the same effect. We keep it here merely because this generate_c_typedecl_c will typically be called
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   244
     * with s4o referencing an include file (typically POUS.h), and using s4o_incl throughout this code will help the reader
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   245
     * of the code to keep this fact in mind.
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   246
     */
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   247
    stage4out_c &s4o_incl;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   248
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   249
  private:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   250
    symbol_c* current_type_name;
950
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   251
    std::map<std::string, int> datatypes_already_defined;
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   252
    /* Although this generate_c_typedecl_c inherits directly from generate_c_base_and_typeid_c, we still need an independent
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   253
     * instance of that base class. This is because generate_c_typedecl_c will overload some of the visitors in the base class
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   254
     * generate_c_base_and_typeid_c.
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   255
     *  When we want the to use the version of these visitors() in generate_c_typedecl_c,        we call accept(*this);
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   256
     *  When we want the to use the version of these visitors() in generate_c_base_and_typeid_c, we call accept(*generate_c_typeid);
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   257
     */
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   258
    generate_c_base_and_typeid_c *generate_c_typeid;
950
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   259
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   260
    
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   261
  public:
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   262
    generate_c_typedecl_c(stage4out_c *s4o_ptr): generate_c_base_and_typeid_c(s4o_ptr), s4o_incl(*s4o_ptr) /*, generate_c_print_typename(s4o_ptr) */{
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   263
      current_typedefinition = none_td;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   264
      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
   265
      current_type_name = NULL;
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   266
      generate_c_typeid = new generate_c_base_and_typeid_c(&s4o_incl);
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   267
    }
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   268
    ~generate_c_typedecl_c(void) {
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   269
      delete generate_c_typeid;
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   270
    }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   271
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   272
    typedef enum {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   273
      none_td,
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   274
      enumerated_td,
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   275
      subrange_td,
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   276
      array_td,
661
f537c3315f83 Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents: 594
diff changeset
   277
      struct_td
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   278
    } typedefinition_t;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   279
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   280
    typedefinition_t current_typedefinition;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   281
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   282
    typedef enum {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   283
      none_bd,
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   284
      subrangebasetype_bd,
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   285
      subrangetest_bd,
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
   286
      arraysubrange_bd
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   287
    } basetypedeclaration_t;
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
   288
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   289
    basetypedeclaration_t current_basetypedeclaration;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   290
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   291
    void *print_list_incl(list_c *list,
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   292
         std::string pre_elem_str = "",
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   293
         std::string inter_elem_str = "",
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   294
         std::string post_elem_str = "") {
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   295
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   296
      if (list->n > 0) {
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   297
        s4o_incl.print(pre_elem_str);
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 958
diff changeset
   298
        list->get_element(0)->accept(*this);
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   299
      }
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   300
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   301
      for(int i = 1; i < list->n; i++) {
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   302
        s4o_incl.print(inter_elem_str);
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 958
diff changeset
   303
        list->get_element(i)->accept(*this);
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   304
      }
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   305
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   306
      if (list->n > 0)
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   307
        s4o_incl.print(post_elem_str);
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   308
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   309
      return NULL;
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   310
    }
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   311
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   312
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   313
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   314
/* B 0 - Programming Model */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   315
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   316
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   317
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   318
/*************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   319
/* B.1 - Common elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   320
/*************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   321
/*******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   322
/* B 1.1 - Letters, digits and identifiers */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   323
/*******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   324
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   325
/* B 1.2 - Constants */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   326
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   327
  /* originally empty... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   328
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   329
/******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   330
/* B 1.2.1 - Numeric Literals */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   331
/******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   332
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   333
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   334
/*******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   335
/* B.1.2.2   Character Strings */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   336
/*******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   337
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   338
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   339
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   340
/* B 1.2.3 - Time Literals */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   341
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   342
/************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   343
/* B 1.2.3.1 - Duration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   344
/************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   345
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   346
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   347
/************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   348
/* B 1.2.3.2 - Time of day and Date */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   349
/************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   350
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   351
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   352
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   353
/* B.1.3 - Data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   354
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   355
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   356
/* B 1.3.1 - Elementary Data Types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   357
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   358
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   359
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   360
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   361
/* B.1.3.2 - Generic data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   362
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   363
  /* originally empty... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   364
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   365
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   366
/* B 1.3.3 - Derived data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   367
/********************************/
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   368
/*  subrange_type_name ':' subrange_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   369
void *visit(subrange_type_declaration_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   370
  TRACE("subrange_type_declaration_c");  
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   371
  
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   372
  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
   373
  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
   374
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
   375
  s4o_incl.print("__DECLARE_DERIVED_TYPE(");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   376
  current_type_name->accept(*generate_c_typeid);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   377
  s4o_incl.print(",");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   378
  current_basetypedeclaration = subrangebasetype_bd;
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   379
  symbol->subrange_spec_init->accept(*this); // always calls subrange_spec_init_c
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   380
  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
   381
  s4o_incl.print(")\n");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   382
  
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   383
  current_basetypedeclaration = subrangetest_bd;
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   384
  symbol->subrange_spec_init->accept(*this); // always calls subrange_spec_init_c
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   385
  current_basetypedeclaration = none_bd;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   386
  
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
   387
  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
   388
  current_typedefinition = none_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   389
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   390
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   391
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   392
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   393
/* subrange_specification ASSIGN signed_integer */
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   394
void *visit(subrange_spec_init_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   395
  TRACE("subrange_spec_init_c");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   396
  symbol->subrange_specification->accept(*this); // always calls subrange_specification_c
98
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
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   400
/*  integer_type_name '(' subrange')' */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   401
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
   402
  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
   403
  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
   404
    switch (current_basetypedeclaration) {
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   405
      case subrangebasetype_bd:
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   406
        symbol->integer_type_name->accept(*generate_c_typeid);
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   407
        break;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   408
      case subrangetest_bd:
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   409
        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
   410
          s4o_incl.print("static inline ");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   411
          current_type_name->accept(*generate_c_typeid);
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
   412
          s4o_incl.print(" __CHECK_");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   413
          current_type_name->accept(*generate_c_typeid);
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
   414
          s4o_incl.print("(");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   415
          current_type_name->accept(*generate_c_typeid);
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
   416
          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
   417
          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
   418
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
   419
          /* 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
   420
          /*       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
   421
           *       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
   422
           *       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
   423
           */
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
   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->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
   426
            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
   427
            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
   428
            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
   429
          }
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
          */
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   431
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   432
          symbol->subrange->accept(*this); // always calls subrange_c
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   433
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
   434
          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
   435
          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
   436
        }
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   437
        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
   438
          s4o_incl.print("#define __CHECK_");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   439
          current_type_name->accept(*generate_c_typeid);
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
   440
          s4o_incl.print(" __CHECK_");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   441
          symbol->integer_type_name->accept(*generate_c_typeid);
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
   442
          s4o_incl.print("\n");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   443
        }
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   444
        break;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   445
      default:
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   446
        break;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   447
    }
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   448
  }
860
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   449
  return NULL;
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   450
}
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   451
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   452
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   453
/*  signed_integer DOTDOT signed_integer */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   454
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
   455
  TRACE("subrange_c");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   456
  int dimension;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   457
  switch (current_typedefinition) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   458
    case array_td:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   459
      if (current_basetypedeclaration == arraysubrange_bd) {
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   460
        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
   461
        s4o_incl.print(symbol->dimension);
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   462
        s4o_incl.print("]");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   463
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   464
      else
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   465
        symbol->lower_limit->accept(*this);  // always calls neg_integer_c or integer_c
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   466
      break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   467
    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
   468
      s4o_incl.print(s4o_incl.indent_spaces + "if (value < ");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   469
      symbol->lower_limit->accept(*generate_c_typeid);
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
   470
      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
   471
      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
   472
      s4o_incl.print(s4o_incl.indent_spaces + "return ");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   473
      symbol->lower_limit->accept(*generate_c_typeid);
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
   474
      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
   475
      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
   476
      s4o_incl.print(s4o_incl.indent_spaces + "else if (value > ");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   477
      symbol->upper_limit->accept(*generate_c_typeid);
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
   478
      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
   479
      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
   480
      s4o_incl.print(s4o_incl.indent_spaces + "return ");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   481
      symbol->upper_limit->accept(*generate_c_typeid);
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
   482
      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
   483
      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
   484
      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
   485
      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
   486
      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
   487
      s4o_incl.indent_left();
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   488
    default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   489
      break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   490
  }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   491
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   492
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   493
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   494
/*  enumerated_type_name ':' enumerated_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   495
void *visit(enumerated_type_declaration_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   496
  TRACE("enumerated_type_declaration_c");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   497
  
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   498
  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
   499
  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
   500
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   501
  s4o_incl.print("__DECLARE_ENUMERATED_TYPE(");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   502
  current_type_name->accept(*generate_c_typeid);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   503
  s4o_incl.print(",\n");
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   504
  s4o_incl.indent_right();
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   505
  symbol->enumerated_spec_init->accept(*this); // always calls enumerated_spec_init_c
121
9e8ce092e169 Adding support for POU struct definition in POUS.h
lbessard
parents: 98
diff changeset
   506
  s4o_incl.indent_left();
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   507
  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
   508
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
   509
  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
   510
  current_typedefinition = none_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   511
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   512
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   513
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   514
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
   515
/* enumerated_specification ASSIGN enumerated_value */
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   516
void *visit(enumerated_spec_init_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   517
  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
   518
  if (current_typedefinition == enumerated_td)
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   519
    symbol->enumerated_specification->accept(*this); // always calls enumerated_value_list_c or derived_datatype_identifier_c
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   520
  else
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   521
    symbol->enumerated_specification->accept(*generate_c_typeid);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   522
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   523
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   524
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   525
/* helper symbol for enumerated_specification->enumerated_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   526
/* enumerated_value_list ',' enumerated_value */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   527
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
   528
  TRACE("enumerated_value_list_c");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   529
  print_list_incl(symbol, s4o_incl.indent_spaces, ",\n"+s4o_incl.indent_spaces, "\n");  // will always call enumerated_value_c
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   530
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   531
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   532
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   533
/* enumerated_type_name '#' identifier */
860
7669a8d43c11 Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents: 859
diff changeset
   534
/* 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
   535
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
   536
*/
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   537
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   538
/*  identifier ':' array_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   539
void *visit(array_type_declaration_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   540
  TRACE("array_type_declaration_c");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   541
  
958
7474d2cd1d6e Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents: 950
diff changeset
   542
  // NOTE: remeber that symbol->array_spec_init may point to a derived_datatype_identifier_c, which is why we use symbol->array_spec_init->datatype instead!
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   543
  if (NULL == symbol->array_spec_init->datatype) ERROR;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   544
  identifier_c *id = generate_datatypes_aliasid_c::create_id(symbol->array_spec_init->datatype);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   545
  
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   546
  /* NOTE  An array_type_declaration_c will be created in stage4 for each implicitly defined array,
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   547
   *       and this generate_c_typedecl_c will be called to define that array in C.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   548
   *       However, every implictly defined array with the exact same parameters will be mapped
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   549
   *       to the same identifier (e.g: __ARRAY_OF_INT_33 where 33 is the number of elements in the array).
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   550
   *       In order for the C compiler not to find the same datatype being defined two or more times, 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   551
   *       we will keep track of the array datatypes that have already been declared, and henceforth
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   552
   *       only declare arrays that have not been previously defined.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   553
   */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   554
  if (datatypes_already_defined.find(id->value) != datatypes_already_defined.end())
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   555
    goto end; // already defined. No need to define it again!!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   556
  datatypes_already_defined[id->value] = 1; // insert this datatype into the list of already defined arrays!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   557
  
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   558
  current_typedefinition = array_td;
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   559
  current_type_name = id;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   560
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   561
  s4o_incl.print("__DECLARE_ARRAY_TYPE(");
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   562
  current_type_name->accept(*generate_c_typeid);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   563
  s4o_incl.print(",");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   564
  symbol->array_spec_init->accept(*this); // always calls array_spec_init_c
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
   565
  s4o_incl.print(")\n");
322
293967b9277d Fix bug with array attribute in structure declaration
laurent
parents: 310
diff changeset
   566
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
   567
  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
   568
  current_typedefinition = none_td;
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   569
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   570
end:  
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   571
  symbol                 ->anotations_map["generate_c_annotaton__implicit_type_id"] = id;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   572
  symbol->datatype       ->anotations_map["generate_c_annotaton__implicit_type_id"] = id;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   573
  symbol->array_spec_init->anotations_map["generate_c_annotaton__implicit_type_id"] = id; // probably not needed, bu let's play safe.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   574
  
913
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   575
  return NULL;
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   576
}
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   577
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   578
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   579
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   580
/* array_specification [ASSIGN array_initialization] */
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   581
/* array_initialization may be NULL ! */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   582
void *visit(array_spec_init_c *symbol) {
913
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   583
  TRACE("array_spec_init_c");  
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   584
  symbol->array_specification->accept(*this); // always calls array_specification_c or derived_datatype_identifier_c
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   585
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   586
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   587
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   588
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   589
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
   590
  TRACE("array_specification_c");
913
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   591
  // The 2nd and 3rd argument of a call to the __DECLARE_ARRAY_TYPE macro!
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   592
  symbol->non_generic_type_name->accept(/*generate_c_print_typename*/*generate_c_typeid);
913
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   593
  s4o_incl.print(",");
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   594
  current_basetypedeclaration = arraysubrange_bd;
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   595
  symbol->array_subrange_list->accept(*this); // always calls array_subrange_list_c, which the iterator_visitor_c base class will call subrange_c
913
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   596
  current_basetypedeclaration = none_bd;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   597
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   598
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   599
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   600
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   601
/*  TYPE type_declaration_list END_TYPE */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   602
void *visit(data_type_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   603
  TRACE("data_type_declaration_c");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   604
  symbol->type_declaration_list->accept(*this); // will always call type_declaration_list_c
857
70c4c259bc3e fix a couple of typos.
mjsousa
parents: 854
diff changeset
   605
  s4o_incl.print("\n\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   606
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   607
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   608
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   609
/* helper symbol for data_type_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   610
void *visit(type_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   611
  TRACE("type_declaration_list_c");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   612
  return print_list_incl(symbol, "", "\n", "\n"); // will always call string_type_declaration_c, structure_type_declaration_c, array_type_declaration_c, simple_type_declaration_c, subrange_type_declaration_c, enumerated_type_declaration_c, ref_type_decl_c
70
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
/*  simple_type_name ':' simple_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   616
void *visit(simple_type_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   617
  TRACE("simple_type_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   618
307
6ea381792f59 Fix missing '(' when declaring new simple derived data type.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   619
  s4o_incl.print("__DECLARE_DERIVED_TYPE(");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   620
  symbol->simple_type_name->accept(*generate_c_typeid);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   621
  s4o_incl.print(",");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   622
  symbol->simple_spec_init->accept(*this); // always calls simple_spec_init_c
309
f93bcada0f51 Fix bug when declaring data type directly derived from array type
laurent
parents: 307
diff changeset
   623
  s4o_incl.print(")\n");
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
   624
854
13d0b67de111 Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 793
diff changeset
   625
  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
   626
    s4o_incl.print("#define __CHECK_");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   627
    current_type_name->accept(*generate_c_typeid);
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
   628
    s4o_incl.print(" __CHECK_");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   629
    symbol->simple_spec_init->accept(*this); // always calls simple_spec_init_c
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
   630
    s4o_incl.print("\n");
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
   631
  }
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 350
diff changeset
   632
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   633
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   634
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   635
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   636
/* simple_specification [ASSIGN constant] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   637
//SYM_REF2(simple_spec_init_c, simple_specification, constant)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   638
// <constant> may be NULL
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   639
void *visit(simple_spec_init_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   640
  TRACE("simple_spec_init_c");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   641
  symbol->simple_specification->accept(*generate_c_typeid);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   642
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   643
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   644
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   645
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   646
/*  subrange_type_name ':' subrange_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   647
SYM_REF2(subrange_type_declaration_c, subrange_type_name, subrange_spec_init)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   648
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   649
/* subrange_specification ASSIGN signed_integer */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   650
SYM_REF2(subrange_spec_init_c, subrange_specification, signed_integer)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   651
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   652
/*  integer_type_name '(' subrange')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   653
SYM_REF2(subrange_specification_c, integer_type_name, subrange)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   654
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   655
/*  signed_integer DOTDOT signed_integer */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   656
SYM_REF2(subrange_c, lower_limit, upper_limit)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   657
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   658
/*  enumerated_type_name ':' enumerated_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   659
SYM_REF2(enumerated_type_declaration_c, enumerated_type_name, enumerated_spec_init)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   660
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   661
/* enumerated_specification ASSIGN enumerated_value */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   662
SYM_REF2(enumerated_spec_init_c, enumerated_specification, enumerated_value)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   663
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   664
/* helper symbol for enumerated_specification->enumerated_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   665
/* enumerated_value_list ',' enumerated_value */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   666
SYM_LIST(enumerated_value_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   667
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   668
/* enumerated_type_name '#' identifier */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   669
SYM_REF2(enumerated_value_c, type, value)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   670
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   671
/*  identifier ':' array_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   672
SYM_REF2(array_type_declaration_c, identifier, array_spec_init)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   673
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   674
/* array_specification [ASSIGN array_initialization} */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   675
/* array_initialization may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   676
SYM_REF2(array_spec_init_c, array_specification, array_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   677
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   678
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   679
SYM_REF2(array_specification_c, array_subrange_list, non_generic_type_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   680
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   681
/* helper symbol for array_specification */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   682
/* array_subrange_list ',' subrange */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   683
SYM_LIST(array_subrange_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   684
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   685
/* array_initialization:  '[' array_initial_elements_list ']' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   686
/* helper symbol for array_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   687
/* array_initial_elements_list ',' array_initial_elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   688
SYM_LIST(array_initial_elements_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   689
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   690
/* integer '(' [array_initial_element] ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   691
/* array_initial_element may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   692
SYM_REF2(array_initial_elements_c, integer, array_initial_element)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   693
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   694
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   695
/*  structure_type_name ':' structure_specification */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   696
//SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   697
void *visit(structure_type_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   698
  TRACE("structure_type_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   699
310
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   700
  current_typedefinition = struct_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   701
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
   702
  s4o_incl.print("__DECLARE_STRUCT_TYPE(");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   703
  symbol->structure_type_name->accept(*generate_c_typeid);
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   704
  s4o_incl.print(",");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   705
  symbol->structure_specification->accept(*this); // always calls initialized_structure_c or structure_element_declaration_list
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   706
  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
   707
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   708
  current_typedefinition = none_td;
f111a6986c22 Fix bug when using an enumerated or subrange type to define a structure element
laurent
parents: 309
diff changeset
   709
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   710
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   711
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   712
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   713
/* structure_type_name ASSIGN structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   714
/* structure_initialization may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   715
//SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   716
void *visit(initialized_structure_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   717
  TRACE("initialized_structure_c");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   718
  symbol->structure_type_name->accept(*generate_c_typeid);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   719
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   720
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   721
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   722
/* helper symbol for structure_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   723
/* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   724
/* structure_element_declaration_list structure_element_declaration ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   725
//SYM_LIST(structure_element_declaration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   726
void *visit(structure_element_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   727
  TRACE("structure_element_declaration_list_c");
327
da78d0d93c75 Fix bug in declaring variable of enumerated type
laurent
parents: 322
diff changeset
   728
  s4o_incl.print("\n");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   729
  s4o_incl.indent_right();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   730
  s4o_incl.print(s4o_incl.indent_spaces);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   731
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   732
  print_list_incl(symbol, "", s4o_incl.indent_spaces, ""); // will always call structure_element_declaration_c
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   733
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   734
  s4o_incl.indent_left();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   735
  s4o_incl.print(s4o_incl.indent_spaces);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   736
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   737
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   738
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   739
/*  structure_element_name ':' spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   740
//SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   741
void *visit(structure_element_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   742
  TRACE("structure_element_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   743
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   744
  symbol->spec_init->accept(/*generate_c_print_typename*/*generate_c_typeid);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   745
  s4o_incl.print(" ");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   746
  symbol->structure_element_name->accept(*generate_c_typeid);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   747
  s4o_incl.print(";\n");
857
70c4c259bc3e fix a couple of typos.
mjsousa
parents: 854
diff changeset
   748
  s4o_incl.print(s4o_incl.indent_spaces);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   749
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   750
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   751
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   752
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   753
/* helper symbol for structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   754
/* structure_initialization: '(' structure_element_initialization_list ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   755
/* structure_element_initialization_list ',' structure_element_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   756
//SYM_LIST(structure_element_initialization_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   757
void *visit(structure_element_initialization_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   758
  TRACE("structure_element_initialization_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   759
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   760
  // TODO ???
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   761
  //ERROR;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   762
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   763
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   764
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   765
/*  structure_element_name ASSIGN value */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   766
//SYM_REF2(structure_element_initialization_c, structure_element_name, value)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   767
void *visit(structure_element_initialization_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   768
  TRACE("structure_element_initialization_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   769
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   770
  // TODO ???
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 139
diff changeset
   771
  //ERROR;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   772
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   773
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   774
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   775
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   776
/*  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
   777
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   778
 * NOTE:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   779
 * (Summary: Contrary to what is expected, the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   780
 *           string_type_declaration_c is not used to store
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   781
 *           simple string type declarations that do not include
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   782
 *           size limits.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   783
 *           For e.g.:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   784
 *             str1_type: STRING := "hello!"
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   785
 *           will be stored in a simple_type_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   786
 *           instead of a string_type_declaration_c.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   787
 *           The following:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   788
 *             str2_type: STRING [64] := "hello!"
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   789
 *           will be stored in a sring_type_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   790
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   791
 *           Read on for why this is done...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   792
 * End Summary)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   793
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   794
 * According to the spec, the valid construct
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   795
 * TYPE new_str_type : STRING := "hello!"; END_TYPE
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   796
 * has two possible routes to type_declaration...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   797
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   798
 * Route 1:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   799
 * type_declaration: single_element_type_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   800
 * single_element_type_declaration: simple_type_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   801
 * simple_type_declaration: identifier ':' simple_spec_init
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   802
 * simple_spec_init: simple_specification ASSIGN constant
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   803
 * (shift:  identifier <- 'new_str_type')
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   804
 * simple_specification: elementary_type_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   805
 * elementary_type_name: STRING
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   806
 * (shift: elementary_type_name <- STRING)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   807
 * (reduce: simple_specification <- elementary_type_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   808
 * (shift: constant <- "hello!")
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   809
 * (reduce: simple_spec_init: simple_specification ASSIGN constant)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   810
 * (reduce: ...)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   811
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   812
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   813
 * Route 2:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   814
 * type_declaration: string_type_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   815
 * 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
   816
 * (shift:  identifier <- 'new_str_type')
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   817
 * elementary_string_type_name: STRING
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   818
 * (shift: elementary_string_type_name <- STRING)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   819
 * (shift: string_type_declaration_size <-  empty )
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   820
 * string_type_declaration_init: ASSIGN character_string
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   821
 * (shift: character_string <- "hello!")
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   822
 * (reduce: string_type_declaration_init <- ASSIGN character_string)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   823
 * (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
   824
 * (reduce: type_declaration <- string_type_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   825
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   826
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   827
 * At first glance it seems that removing route 1 would make
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   828
 * the most sense. Unfortunately the construct 'simple_spec_init'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   829
 * shows up multiple times in other rules, so changing this construct
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   830
 * would also mean changing all the rules in which it appears.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   831
 * I (Mario) therefore chose to remove route 2 instead. This means
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   832
 * that the above declaration gets stored in a
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   833
 * simple_type_declaration_c, and not in a string_type_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   834
 * as would be expected!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   835
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   836
/*  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
   837
SYM_REF4(string_type_declaration_c,	string_type_name,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   838
					elementary_string_type_name,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   839
					string_type_declaration_size,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   840
					string_type_declaration_init) /* may be == NULL! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   841
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   842
909
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   843
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   844
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   845
/* 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
   846
// SYM_REF1(ref_spec_c, type_name)
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   847
void *visit(ref_spec_c *symbol) { 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   848
  symbol->type_name->accept(/*generate_c_print_typename*/*generate_c_typeid);
932
061824c45a5b Add support for REF_TO inside arrays and structs (a non-standard feature!)
mjsousa
parents: 930
diff changeset
   849
  s4o_incl.print("*");
061824c45a5b Add support for REF_TO inside arrays and structs (a non-standard feature!)
mjsousa
parents: 930
diff changeset
   850
  return NULL;
909
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   851
}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   852
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   853
/* 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
   854
/* 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
   855
/* NOTE: ref_initialization may be NULL!! */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   856
// 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
   857
void *visit(ref_spec_init_c *symbol) {
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   858
  return symbol->ref_spec->accept(*generate_c_typeid);
909
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   859
}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   860
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   861
/* ref_type_decl: identifier ':' ref_spec_init */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   862
// 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
   863
void *visit(ref_type_decl_c *symbol) {
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   864
  TRACE("ref_type_decl_c");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   865
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   866
  /* NOTE  An ref_type_decl_c will be created in stage4 for each implicitly defined REF_TO datatype,
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   867
   *       and this generate_c_typedecl_c will be called to define that REF_TO datatype in C.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   868
   *       However, every implictly defined REF_TO datatype with the exact same parameters will be mapped
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   869
   *       to the same identifier (e.g: __REF_TO_INT).
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   870
   *       In order for the C compiler not to find the same datatype being defined two or more times, 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   871
   *       we will keep track of the datatypes that have already been declared, and henceforth
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   872
   *       only declare the datatypes that have not been previously defined.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   873
   */
958
7474d2cd1d6e Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents: 950
diff changeset
   874
  identifier_c *tmp_id;
7474d2cd1d6e Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents: 950
diff changeset
   875
  tmp_id = dynamic_cast<identifier_c *>(symbol->ref_type_name);
7474d2cd1d6e Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents: 950
diff changeset
   876
  if (NULL == tmp_id) ERROR;
7474d2cd1d6e Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents: 950
diff changeset
   877
  if (datatypes_already_defined.find(tmp_id->value) != datatypes_already_defined.end())
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   878
    return NULL; // already defined. No need to define it again!!
958
7474d2cd1d6e Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents: 950
diff changeset
   879
  datatypes_already_defined[tmp_id->value] = 1; // insert this datatype into the list of already defined arrays!
909
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   880
  
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   881
  current_type_name = NULL;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   882
  current_typedefinition = none_td;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   883
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   884
  s4o_incl.print("__DECLARE_REFTO_TYPE(");
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
   885
  symbol->ref_type_name->accept(*generate_c_typeid);
909
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   886
  s4o_incl.print(", ");
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
   887
  symbol->ref_spec_init->accept(*this); // always calls ref_spec_init_c
913
1c74da17cb61 Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents: 909
diff changeset
   888
  s4o_incl.print(")\n");
909
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   889
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   890
  current_type_name = NULL;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   891
  current_typedefinition = none_td;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   892
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   893
  return NULL;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   894
}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   895
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   896
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 860
diff changeset
   897
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   898
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   899
/* B 1.4 - Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   900
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   901
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   902
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   903
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   904
/* B.1.4.1   Directly Represented Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   905
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   906
// direct_variable: direct_variable_token	{$$ = new direct_variable_c($1);};
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   907
void *visit(direct_variable_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   908
  TRACE("direct_variable_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   909
  /* Do not use print_token() as it will change everything into uppercase */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   910
  if (strlen(symbol->value) == 0) ERROR;
950
935c8b6ba3c5 Update the comments in source code.
mjsousa
parents: 949
diff changeset
   911
  return s4o_incl.printlocation(symbol->value + 1);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   912
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   913
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   914
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   915
/*************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   916
/* B.1.4.2   Multi-element Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   917
/*************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   918
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   919
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   920
/******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   921
/* B 1.4.3 - Declaration & Initialisation */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   922
/******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   923
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   924
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   925
/**************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   926
/* B.1.5 - Program organization units */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   927
/**************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   928
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   929
/* B 1.5.1 - Functions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   930
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   931
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   932
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   933
/*****************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   934
/* B 1.5.2 - Function Blocks */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   935
/*****************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   936
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   937
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   938
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   939
/* B 1.5.3 - Programs */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   940
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   941
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   942
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   943
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   944
/* B.1.6  Sequential function chart elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   945
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   946
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   947
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   948
/* B 1.7 Configuration elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   949
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   950
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   951
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   952
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   953
/* B.2 - Language IL (Instruction List) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   954
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   955
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   956
/* B 2.1 Instructions and Operands */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   957
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   958
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   959
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   960
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   961
/* B 2.2 Operators */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   962
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   963
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   964
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   965
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   966
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   967
/* B.3 - Language ST (Structured Text) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   968
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   969
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   970
/* B 3.1 - Expressions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   971
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   972
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   973
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   974
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   975
/* B 3.2 Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   976
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   977
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   978
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   979
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   980
/* B 3.2.1 Assignment Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   981
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   982
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   983
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   984
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   985
/* B 3.2.2 Subprogram Control Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   986
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   987
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   988
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   989
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   990
/* B 3.2.3 Selection Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   991
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   992
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   993
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   994
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   995
/* B 3.2.4 Iteration Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   996
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   997
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   998
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   999
}; /* generate_c_typedecl_c */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1000
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1001
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1002
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1003
/***********************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1004
/***********************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1005
/***********************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1006
/***********************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1007
/***********************************************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1008
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1009
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1010
/* This class will generate a new datatype for each implicitly declared array datatype
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1011
 * (i.e. arrays declared in a variable declaration, or a struct datatype declaration...)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1012
 * It will do the same for implicitly declared REF_TO datatypes.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1013
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1014
 * Each new implicitly datatype will be atributed an alias, and a C datatype will be declared for that alias.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1015
 * The alias itself will be stored (annotated) in the datatype object in the AST, using the annotation
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1016
 * map reserved for stage4 anotations. The alias is stored under the "generate_c_annotaton__implicit_type_id"
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1017
 * entry, and this entry will then be used whenever the name of the datatype is needed (to declare a varable,
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1018
 * for example). 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1019
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1020
 * The class will be called once for each POU declaration, and once for each derived datatype declaration.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1021
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1022
 * e.g.:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1023
 *      VAR  x: ARRAY [1..3] OF INT; END_VAR   <---- ARRAY  datatype is implicitly declared inside the variable declaration
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1024
 *      VAR  y: REF_TO INT;          END_VAR   <---- REF_TO datatype is implicitly declared inside the variable declaration
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1025
 *      TYPE STRUCT
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1026
 *               a: ARRAY [1..3] OF INT;       <---- ARRAY  datatype is implicitly declared inside the struct type declaration  
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1027
 *               b: REF_TO INT;                <---- REF_TO datatype is implicitly declared inside the struct type declaration
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1028
 *               c: INT;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1029
 *            END_STRUCT
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1030
 *      END_TYPE
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1031
 */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1032
class generate_c_implicit_typedecl_c: public iterator_visitor_c {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1033
  private:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1034
    generate_c_typedecl_c *generate_c_typedecl_;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1035
    generate_c_typedecl_c  generate_c_typedecl_local;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1036
    symbol_c *prefix;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1037
  public:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1038
    generate_c_implicit_typedecl_c(stage4out_c *s4o, generate_c_typedecl_c *generate_c_typedecl=NULL) 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1039
      : generate_c_typedecl_local(s4o) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1040
        generate_c_typedecl_ = generate_c_typedecl;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1041
        if (NULL == generate_c_typedecl_) 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1042
          generate_c_typedecl_ = &generate_c_typedecl_local;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1043
        prefix = NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1044
    };
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1045
    virtual ~generate_c_implicit_typedecl_c(void) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1046
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1047
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1048
    /*************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1049
    /* B.1 - Common elements */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1050
    /*************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1051
    /**********************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1052
    /* B.1.3 - Data types */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1053
    /**********************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1054
    /********************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1055
    /* B 1.3.3 - Derived data types */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1056
    /********************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1057
    /*  identifier ':' array_spec_init */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1058
    void *visit(array_type_declaration_c *symbol) {return NULL;} // This is not an implicitly defined array!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1059
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1060
    /* ref_spec:  REF_TO (non_generic_type_name | function_block_type_name) */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1061
    void *visit(ref_spec_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1062
      identifier_c *id = generate_datatypes_aliasid_c::create_id(symbol);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1063
      /* Warning: The following is dangerous... 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1064
       * We are asking the generate_c_typedecl_c visitor to visit a newly created ref_spec_init_c object
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1065
       * that has not been through stage 3, and therefore does not have stage 3 annotations filled in.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1066
       * This will only work if generate_c_typedecl_c does ot depend on the stage 3 annotations!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1067
       */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1068
      ref_spec_init_c   ref_spec(symbol, NULL);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1069
      ref_type_decl_c   ref_decl(id, &ref_spec);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1070
      ref_decl.accept(*generate_c_typedecl_);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1071
      symbol->anotations_map["generate_c_annotaton__implicit_type_id"] = id;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1072
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1073
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1074
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1075
    /* For the moment, we do not support initialising reference data types */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1076
    /* ref_spec_init: ref_spec [ ASSIGN ref_initialization ] */ 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1077
    /* NOTE: ref_initialization may be NULL!! */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1078
    // SYM_REF2(ref_spec_init_c, ref_spec, ref_initialization)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1079
    void *visit(ref_spec_init_c *symbol) {
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
  1080
      symbol->ref_spec->accept(*this); //--> always calls ref_spec_c or derived_datatype_identifier_c
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1081
      int implicit_id_count = symbol->ref_spec->anotations_map.count("generate_c_annotaton__implicit_type_id");
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1082
      if (implicit_id_count  > 1) ERROR;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1083
      if (implicit_id_count == 1)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1084
        symbol->anotations_map["generate_c_annotaton__implicit_type_id"] = symbol->ref_spec->anotations_map["generate_c_annotaton__implicit_type_id"];
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1085
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1086
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1087
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1088
    /* ref_type_decl: identifier ':' ref_spec_init */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1089
    void *visit(ref_type_decl_c *symbol) {return NULL;} // This is not an implicitly defined REF_TO!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1090
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1091
    /******************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1092
    /* B 1.4.3 - Declaration & Initialization */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1093
    /******************************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1094
    void *visit(edge_declaration_c           *symbol) {return NULL;}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1095
    void *visit(en_param_declaration_c       *symbol) {return NULL;}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1096
    void *visit(eno_param_declaration_c      *symbol) {return NULL;}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1097
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1098
    /* array_specification [ASSIGN array_initialization] */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1099
    /* array_initialization may be NULL ! */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1100
    void *visit(array_spec_init_c *symbol) {
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
  1101
      symbol->array_specification->accept(*this); //--> always calls array_specification_c or derived_datatype_identifier_c
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1102
      int implicit_id_count = symbol->array_specification->anotations_map.count("generate_c_annotaton__implicit_type_id");
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1103
      if (implicit_id_count  > 1) ERROR;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1104
      if (implicit_id_count == 1)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1105
        symbol->anotations_map["generate_c_annotaton__implicit_type_id"] = symbol->array_specification->anotations_map["generate_c_annotaton__implicit_type_id"];
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1106
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1107
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1108
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1109
    /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1110
    void *visit(array_specification_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1111
      identifier_c *id = generate_datatypes_aliasid_c::create_id(symbol);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1112
      /* Warning: The following is dangerous... 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1113
       * We are asking the generate_c_typedecl_c visitor to visit a newly created array_type_declaration_c object
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1114
       * that has not been through stage 3, and therefore does not have stage 3 annotations filled in.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1115
       * This will only work if generate_c_typedecl_c does ot depend on the stage 3 annotations!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1116
       */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1117
      array_spec_init_c        array_spec(symbol, NULL);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1118
      array_type_declaration_c array_decl(id, &array_spec);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1119
      array_decl.datatype = symbol->datatype;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1120
      array_spec.datatype = symbol->datatype;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1121
      array_decl.accept(*generate_c_typedecl_);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1122
      symbol->anotations_map["generate_c_annotaton__implicit_type_id"] = id;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1123
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1124
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1125
    
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1126
    /*  var1_list ':' initialized_structure */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1127
    // SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1128
    void *visit(structured_var_init_decl_c   *symbol) {return NULL;}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1129
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1130
    /* fb_name_list ':' function_block_type_name ASSIGN structure_initialization */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1131
    /* structure_initialization -> may be NULL ! */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1132
    void *visit(fb_name_decl_c               *symbol) {return NULL;}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1133
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1134
    /*  var1_list ':' structure_type_name */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1135
    //SYM_REF2(structured_var_declaration_c, var1_list, structure_type_name)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1136
    void *visit(structured_var_declaration_c *symbol) {return NULL;}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1137
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1138
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1139
    /***********************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1140
    /* B 1.5.1 - Functions */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1141
    /***********************/      
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1142
    void *visit(function_declaration_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1143
      prefix = symbol->derived_function_name;
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
  1144
      symbol->var_declarations_list->accept(*this); //--> always calls var_declarations_list_c
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1145
      prefix = NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1146
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1147
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1148
    /*****************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1149
    /* B 1.5.2 - Function Blocks */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1150
    /*****************************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1151
    void *visit(function_block_declaration_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1152
      prefix = symbol->fblock_name;
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
  1153
      symbol->var_declarations->accept(*this); //--> always calls var_declarations_list_c
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1154
      prefix = NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1155
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1156
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1157
    /**********************/
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1158
    /* B 1.5.3 - Programs */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1159
    /**********************/    
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1160
    void *visit(program_declaration_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1161
      prefix = symbol->program_type_name;
949
734c255d863c Fix bug introduced when adding support for relaxed datatype model. Code cleanup.
mjsousa
parents: 945
diff changeset
  1162
      symbol->var_declarations->accept(*this); //--> always calls var_declarations_list_c
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1163
      prefix = NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1164
      return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1165
    }
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1166
};
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1167
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1168
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1169
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1170
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 932
diff changeset
  1171