stage4/generate_c/function_call_param_iterator.cc
author lbessard
Fri, 26 Sep 2008 14:42:05 +0200
changeset 146 eef5e62048c7
parent 70 e1f0ebd2d9ec
permissions -rwxr-xr-x
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     1
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     2
 * (c) 2003 Mario de Sousa
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     3
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     4
 * Offered to the public under the terms of the GNU General Public License
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     5
 * as published by the Free Software Foundation; either version 2 of the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     6
 * License, or (at your option) any later version.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     7
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     8
 * This program is distributed in the hope that it will be useful, but
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     9
 * WITHOUT ANY WARRANTY; without even the implied warranty of
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    11
 * Public License for more details.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    12
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    13
 * This code is made available on the understanding that it will not be
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    14
 * used in safety-critical situations without a full and competent review.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    15
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    16
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    17
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    18
 * An IEC 61131-3 IL and ST compiler.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    19
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    20
 * Based on the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    21
 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    22
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    23
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    24
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    25
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    26
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    27
 * Function call parameter iterator.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    28
 * It will iterate through the formal parameters of a function call
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    29
 * (i.e. function calls using the foo(<param1>, <param2>, ...) syntax).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    30
 * and/or search through the non-formal parameters of a function call
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    31
 * (i.e. function calls using the foo(<name1> = <param1>, <name2> = <param2>, ...) syntax).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    32
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    33
 * Calls to function blocks and programs are also supported.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    34
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    35
 * This is part of the 4th stage that generates
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    36
 * a c++ source program equivalent to the IL and ST
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    37
 * code.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    38
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    39
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    40
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    41
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    42
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    43
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    44
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    45
//#include <stdio.h>  /* required for NULL */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    46
//#include <string>
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    47
//#include <iostream>
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    48
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    49
//#include "../../util/symtable.hh"
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    50
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    51
//#include "generate_c.hh"
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    52
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    53
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    54
#include "../../absyntax/visitor.hh"
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    55
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    56
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    57
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    58
 * Function call parameter iterator.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    59
 * It will iterate through the formal parameters of a function call
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    60
 * (i.e. function calls using the foo(<param1>, <param2>, ...) syntax).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    61
 * and/or search through the non-formal parameters of a function call
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    62
 * (i.e. function calls using the foo(<name1> = <param1>, <name2> = <param2>, ...) syntax).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    63
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    64
 * Calls to function blocks and programs are also supported.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    65
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    66
 * Note that calls to next() will only iterate through formal parameters,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    67
 * and calls to search()  will only serach through non-formal parameters.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    68
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    69
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    70
class function_call_param_iterator_c : public null_visitor_c {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    71
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    72
      /* a pointer to the function call
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    73
       * (or function block or program call!)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    74
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    75
    symbol_c *f_call;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    76
    int next_param, param_count;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    77
    identifier_c *search_param_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    78
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    79
    /* Which operation of the class was called...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    80
     * Search a parameter, or iterate to the next parameter.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    81
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    82
    typedef enum {iterate_op, search_op} operation_t;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    83
    operation_t current_operation;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    84
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    85
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    86
    void *search_list(list_c *list) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    87
      switch (current_operation) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    88
        case iterate_op:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    89
          for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    90
            void *res = list->elements[i]->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    91
            if (NULL != res) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    92
              /* It went through the handle_parameter_assignment() function,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    93
               * and is therefore a parameter assignment (<param> = <value>),
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    94
               * and not a simple expression (<value>).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    95
               */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    96
              /* we do nothing... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    97
            } else {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    98
              param_count++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    99
              if (param_count == next_param) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   100
                return list->elements[i];
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   101
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   102
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   103
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   104
          return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   105
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   106
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   107
        case search_op:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   108
          for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   109
            void *res = list->elements[i]->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   110
            if (res != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   111
              return res;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   112
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   113
          return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   114
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   115
      } /* switch */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   116
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   117
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   118
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   119
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   120
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   121
    void *handle_parameter_assignment(symbol_c *variable_name, symbol_c *expression) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   122
      switch (current_operation) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   123
        case iterate_op:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   124
	        /* UGLY HACK -> this will be detected in the search_list() function */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   125
          return (void *)this; /* anything, as long as it is not NULL!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   126
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   127
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   128
        case search_op:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   129
          identifier_c *variable_name2 = dynamic_cast<identifier_c *>(variable_name);
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   130
          
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   131
          if (variable_name2 == NULL) {
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   132
            en_param_c *en_param = dynamic_cast<en_param_c *>(variable_name);
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   133
            if (en_param != NULL)
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   134
              variable_name2 = new identifier_c("EN");
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   135
          }
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   136
          
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   137
          if (variable_name2 == NULL) {
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   138
            eno_param_c *eno_param = dynamic_cast<eno_param_c *>(variable_name);
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   139
            if (eno_param != NULL)
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   140
              variable_name2 = new identifier_c("ENO");
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   141
          }
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   142
          
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   143
          if (variable_name2 == NULL) ERROR;
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 70
diff changeset
   144
          
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   145
          if (strcasecmp(search_param_name->value, variable_name2->value) == 0)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   146
            /* FOUND! This is the same parameter!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   147
            return (void *)expression;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   148
          return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   149
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   150
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   151
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   152
      ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   153
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   154
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   155
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   156
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   157
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   158
  public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   159
    /* start off at the first parameter once again... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   160
    void reset(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   161
      next_param = param_count = 0;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   162
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   163
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   164
    /* initialise the iterator object.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   165
     * We must be given a reference to the function/program/function block call
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   166
     * that will be analysed...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   167
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   168
    function_call_param_iterator_c(symbol_c *f_call) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   169
      /* It is expected that f_call will reference one of the following:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   170
       *  program_configuration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   171
       *  function_invocation_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   172
       *  fb_invocation_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   173
       *  il_function_call_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   174
       *  il_formal_funct_call_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   175
       *  ... (have I missed any?)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   176
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   177
      this->f_call = f_call;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   178
      search_param_name = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   179
      reset();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   180
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   181
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   182
    /* Skip to the next parameter. After object creation,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   183
     * the object references on parameter _before_ the first, so
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   184
     * this function must be called once to get the object to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   185
     * reference the first parameter...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   186
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   187
     * Returns whatever is being passed to the parameter!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   188
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   189
    symbol_c *next(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   190
      param_count = 0;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   191
      next_param++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   192
      current_operation = function_call_param_iterator_c::iterate_op;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   193
      void *res = f_call->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   194
      return (symbol_c *)res;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   195
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   196
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   197
    /* Search for the value passed to the parameter named <param_name>...  */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   198
    symbol_c *search(symbol_c *param_name) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   199
      if (NULL == param_name) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   200
      search_param_name = dynamic_cast<identifier_c *>(param_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   201
      if (NULL == search_param_name) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   202
      current_operation = function_call_param_iterator_c::search_op;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   203
      void *res = f_call->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   204
      return (symbol_c *)res;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   205
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   206
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   207
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   208
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   209
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   210
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   211
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   212
/* B 1.7 Configuration elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   213
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   214
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   215
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   216
CONFIGURATION configuration_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   217
   optional_global_var_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   218
   (resource_declaration_list | single_resource_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   219
   optional_access_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   220
   optional_instance_specific_initializations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   221
END_CONFIGURATION
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   222
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   223
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   224
SYM_REF6(configuration_declaration_c, configuration_name, global_var_declarations, resource_declarations, access_declarations, instance_specific_initializations, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   225
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   226
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   227
/* helper symbol for configuration_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   228
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   229
SYM_LIST(resource_declaration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   230
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   231
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   232
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   233
RESOURCE resource_name ON resource_type_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   234
   optional_global_var_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   235
   single_resource_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   236
END_RESOURCE
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   237
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   238
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   239
SYM_REF4(resource_declaration_c, resource_name, resource_type_name, global_var_declarations, resource_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   240
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   241
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   242
/* task_configuration_list program_configuration_list */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   243
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   244
SYM_REF2(single_resource_declaration_c, task_configuration_list, program_configuration_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   245
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   246
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   247
/* helper symbol for single_resource_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   248
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   249
SYM_LIST(task_configuration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   250
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   251
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   252
/* helper symbol for single_resource_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   253
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   254
SYM_LIST(program_configuration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   255
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   256
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   257
/* helper symbol for
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   258
 *  - access_path
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   259
 *  - instance_specific_init
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   260
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   261
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   262
SYM_LIST(any_fb_name_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   263
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   264
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   265
/*  [resource_name '.'] global_var_name ['.' structure_element_name] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   266
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   267
SYM_REF4(global_var_reference_c, resource_name, global_var_name, structure_element_name, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   268
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   269
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   270
/*  prev_declared_program_name '.' symbolic_variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   271
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   272
SYM_REF2(program_output_reference_c, program_name, symbolic_variable)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   273
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   274
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   275
/*  TASK task_name task_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   276
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   277
SYM_REF2(task_configuration_c, task_name, task_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   278
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   279
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   280
/*  '(' [SINGLE ASSIGN data_source ','] [INTERVAL ASSIGN data_source ','] PRIORITY ASSIGN integer ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   281
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   282
SYM_REF4(task_initialization_c, single_data_source, interval_data_source, priority_data_source, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   283
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   284
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   285
/*  PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   286
// SYM_REF6(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   287
    void *visit(program_configuration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   288
      TRACE("program_configuration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   289
      return symbol->prog_conf_elements->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   290
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   291
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   292
/* prog_conf_elements ',' prog_conf_element */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   293
// SYM_LIST(prog_conf_elements_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   294
    void *visit(prog_conf_elements_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   295
      TRACE("prog_conf_elements_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   296
      return search_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   297
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   298
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   299
/*  fb_name WITH task_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   300
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   301
SYM_REF2(fb_task_c, fb_name, task_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   302
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   303
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   304
/*  any_symbolic_variable ASSIGN prog_data_source */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   305
// SYM_REF2(prog_cnxn_assign_c, symbolic_variable, prog_data_source)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   306
    void *visit(prog_cnxn_assign_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   307
      TRACE("prog_cnxn_assign_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   308
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   309
      /* NOTE: symbolic_variable may be something other than a symbolic_variable_c, but I (Mario)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   310
       *       do not understand the semantics that should be implmeneted if it is not a
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   311
       *        symbolic_variable, so for the moment we simply give up!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   312
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   313
      symbolic_variable_c *symb_var = dynamic_cast<symbolic_variable_c *>(symbol->symbolic_variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   314
      if (NULL == symb_var)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   315
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   316
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   317
      return handle_parameter_assignment(symb_var->var_name, symbol->prog_data_source);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   318
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   319
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   320
/* any_symbolic_variable SENDTO data_sink */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   321
// SYM_REF2(prog_cnxn_sendto_c, symbolic_variable, prog_data_source)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   322
    void *visit(prog_cnxn_sendto_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   323
      TRACE("prog_cnxn_sendto_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   324
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   325
      /* NOTE: symbolic_variable may be something other than a symbolic_variable_c, but I (Mario)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   326
       *       do not understand the semantics that should be implmeneted if it is not a
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   327
       *        symbolic_variable, so for the moment we simply give up!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   328
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   329
      symbolic_variable_c *symb_var = dynamic_cast<symbolic_variable_c *>(symbol->symbolic_variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   330
      if (NULL == symb_var)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   331
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   332
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   333
      return handle_parameter_assignment(symb_var->var_name, symbol->data_sink);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   334
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   335
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   336
/* VAR_CONFIG instance_specific_init_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   337
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   338
SYM_REF2(instance_specific_initializations_c, instance_specific_init_list, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   339
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   340
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   341
/* helper symbol for instance_specific_initializations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   342
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   343
SYM_LIST(instance_specific_init_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   344
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   345
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   346
/* resource_name '.' program_name '.' {fb_name '.'}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   347
    ((variable_name [location] ':' located_var_spec_init) | (fb_name ':' fb_initialization))
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   348
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   349
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   350
SYM_REF6(instance_specific_init_c, resource_name, program_name, any_fb_name_list, variable_name, location, initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   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
/* helper symbol for instance_specific_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   354
/* function_block_type_name ':=' structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   355
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   356
SYM_REF2(fb_initialization_c, function_block_type_name, structure_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   357
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   358
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
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   362
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   363
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   364
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   365
/* B.2 - Language IL (Instruction List) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   366
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   367
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   368
/* B 2.1 Instructions and Operands */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   369
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   370
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   371
/* | function_name [il_operand_list] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   372
// SYM_REF2(il_function_call_c, function_name, il_operand_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   373
    void *visit(il_function_call_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   374
      TRACE("il_function_call_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   375
      if (NULL != symbol->il_operand_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   376
        return symbol->il_operand_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   377
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   378
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   379
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   380
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   381
/* | function_name '(' eol_list [il_param_list] ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   382
// SYM_REF2(il_formal_funct_call_c, function_name, il_param_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   383
    void *visit(il_formal_funct_call_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   384
      TRACE("il_formal_funct_call_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   385
      if (NULL != symbol->il_param_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   386
        return symbol->il_param_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   387
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   388
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   389
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   390
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   391
/*   il_call_operator prev_declared_fb_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   392
 * | il_call_operator prev_declared_fb_name '(' ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   393
 * | il_call_operator prev_declared_fb_name '(' eol_list ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   394
 * | il_call_operator prev_declared_fb_name '(' il_operand_list ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   395
 * | il_call_operator prev_declared_fb_name '(' eol_list il_param_list ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   396
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   397
// SYM_REF4(il_fb_call_c, il_call_operator, fb_name, il_operand_list, il_param_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   398
    void *visit(il_fb_call_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   399
      TRACE("il_fb_call_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   400
      /* the following should never occur. In reality the syntax parser
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   401
       * will guarantee that they never occur, but it makes it easier to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   402
       * understand the remaining code :-)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   403
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   404
      //if ((NULL == symbol->il_operand_list) && (NULL == symbol->il_param_list)) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   405
      //if ((NULL != symbol->il_operand_list) && (NULL != symbol->il_param_list)) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   406
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   407
      if (NULL != symbol->il_operand_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   408
        return symbol->il_operand_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   409
      if (NULL != symbol->il_param_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   410
        return symbol->il_param_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   411
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   412
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   413
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   414
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   415
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   416
/* | il_operand_list ',' il_operand */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   417
// SYM_LIST(il_operand_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   418
    void *visit(il_operand_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   419
      TRACE("il_operand_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   420
      return search_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   421
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   422
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   423
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   424
/* | il_initial_param_list il_param_instruction */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   425
// SYM_LIST(il_param_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   426
    void *visit(il_param_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   427
      TRACE("il_param_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   428
      return search_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   429
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   430
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   431
/*  il_assign_operator il_operand
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   432
 * | il_assign_operator '(' eol_list simple_instr_list ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   433
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   434
// SYM_REF4(il_param_assignment_c, il_assign_operator, il_operand, simple_instr_list, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   435
    void *visit(il_param_assignment_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   436
      TRACE("il_param_assignment_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   437
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   438
      // TODO : We do not yet handle a instruction list passed as parameter !!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   439
      // since we do not yet support it, it is best to simply stop than to fail silently...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   440
      if (NULL != symbol->simple_instr_list) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   441
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   442
      return handle_parameter_assignment(symbol->il_assign_operator, symbol->il_operand);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   443
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   444
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   445
/*  il_assign_out_operator variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   446
// SYM_REF2(il_param_out_assignment_c, il_assign_out_operator, variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   447
    void *visit(il_param_out_assignment_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   448
      TRACE("il_param_out_assignment_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   449
      return handle_parameter_assignment((symbol_c *)symbol->il_assign_out_operator->accept(*this), symbol->variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   450
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   451
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   452
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   453
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   454
/* B 2.2 Operators */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   455
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   456
/*| [NOT] any_identifier SENDTO */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   457
// SYM_REF2(il_assign_out_operator_c, option, variable_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   458
    void *visit(il_assign_out_operator_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   459
      TRACE("il_assign_out_operator_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   460
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   461
      // TODO : Handle not_param !!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   462
      // we do not yet support it, so it is best to simply stop than to fail silently...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   463
      if (NULL != symbol->option) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   464
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   465
      return (void *)symbol->variable_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   466
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   467
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   468
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   469
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   470
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   471
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   472
/* B.3 - Language ST (Structured Text) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   473
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   474
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   475
/* B 3.1 - Expressions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   476
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   477
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   478
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   479
SYM_REF2(function_invocation_c, function_name, parameter_assignment_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   480
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   481
    void *visit(function_invocation_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   482
      TRACE("function_invocation_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   483
      if ((symbol_c *)symbol == f_call && symbol->parameter_assignment_list != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   484
        return symbol->parameter_assignment_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   485
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   486
        return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   487
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   488
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   489
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   490
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   491
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   492
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   493
/* B 3.2 Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   494
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   495
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   496
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   497
/* B 3.2.1 Assignment Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   498
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   499
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   500
SYM_REF2(assignment_statement_c, l_exp, r_exp)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   501
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   502
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   503
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   504
/* B 3.2.2 Subprogram Control Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   505
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   506
/*  RETURN */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   507
// SYM_REF0(return_statement_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   508
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   509
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   510
/* fb_name '(' [param_assignment_list] ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   511
/* param_assignment_list -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   512
// SYM_REF2(fb_invocation_c, fb_name, param_assignment_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   513
    void *visit(fb_invocation_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   514
      TRACE("fb_invocation_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   515
      if (symbol->param_assignment_list != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   516
        return symbol->param_assignment_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   517
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   518
        return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   519
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   520
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   521
/* helper symbol for fb_invocation */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   522
/* param_assignment_list ',' param_assignment */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   523
// SYM_LIST(param_assignment_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   524
    void *visit(param_assignment_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   525
      TRACE("param_assignment_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   526
      return search_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   527
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   528
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   529
/*  variable_name ASSIGN expression */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   530
// SYM_REF2(input_variable_param_assignment_c, variable_name, expression)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   531
    void *visit(input_variable_param_assignment_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   532
      TRACE("input_variable_param_assignment_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   533
      return handle_parameter_assignment(symbol->variable_name, symbol->expression);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   534
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   535
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   536
/* [NOT] variable_name '=>' variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   537
// SYM_REF4(output_variable_param_assignment_c, not_param, variable_name, variable, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   538
    void *visit(output_variable_param_assignment_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   539
      TRACE("output_variable_param_assignment_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   540
      // TODO : Handle not_param !!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   541
      if (NULL != symbol->not_param) ERROR;  // we do not yet support it, so it is best to simply stop than to fail silently...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   542
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   543
      return handle_parameter_assignment(symbol->variable_name, symbol->variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   544
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   545
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   546
/* helper CLASS for output_variable_param_assignment */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   547
// SYM_REF0(not_paramassign_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   548
// TODO... ???
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   549
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   550
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   551
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   552
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   553
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   554
};
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   555
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   556
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   557
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   558
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   559
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   560