stage4/generate_c/function_call_param_iterator.cc
author lbessard
Wed, 24 Oct 2007 17:39:51 +0200
changeset 70 e1f0ebd2d9ec
child 146 eef5e62048c7
permissions -rwxr-xr-x
Change generate_cc to generate_c
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);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   130
          if (variable_name2 == NULL) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   131
          if (strcasecmp(search_param_name->value, variable_name2->value) == 0)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   132
            /* FOUND! This is the same parameter!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   133
            return (void *)expression;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   134
          return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   135
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   136
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   137
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   138
      ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   139
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   140
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   141
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   142
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   143
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   144
  public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   145
    /* start off at the first parameter once again... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   146
    void reset(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   147
      next_param = param_count = 0;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   148
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   149
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   150
    /* initialise the iterator object.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   151
     * We must be given a reference to the function/program/function block call
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   152
     * that will be analysed...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   153
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   154
    function_call_param_iterator_c(symbol_c *f_call) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   155
      /* It is expected that f_call will reference one of the following:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   156
       *  program_configuration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   157
       *  function_invocation_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   158
       *  fb_invocation_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   159
       *  il_function_call_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   160
       *  il_formal_funct_call_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   161
       *  ... (have I missed any?)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   162
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   163
      this->f_call = f_call;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   164
      search_param_name = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   165
      reset();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   166
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   167
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   168
    /* Skip to the next parameter. After object creation,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   169
     * the object references on parameter _before_ the first, so
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   170
     * this function must be called once to get the object to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   171
     * reference the first parameter...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   172
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   173
     * Returns whatever is being passed to the parameter!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   174
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   175
    symbol_c *next(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   176
      param_count = 0;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   177
      next_param++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   178
      current_operation = function_call_param_iterator_c::iterate_op;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   179
      void *res = f_call->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   180
      return (symbol_c *)res;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   181
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   182
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   183
    /* Search for the value passed to the parameter named <param_name>...  */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   184
    symbol_c *search(symbol_c *param_name) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   185
      if (NULL == param_name) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   186
      search_param_name = dynamic_cast<identifier_c *>(param_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   187
      if (NULL == search_param_name) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   188
      current_operation = function_call_param_iterator_c::search_op;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   189
      void *res = f_call->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   190
      return (symbol_c *)res;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   191
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   192
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   193
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   194
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   195
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   196
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   197
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   198
/* B 1.7 Configuration elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   199
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   200
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   201
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   202
CONFIGURATION configuration_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   203
   optional_global_var_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   204
   (resource_declaration_list | single_resource_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   205
   optional_access_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   206
   optional_instance_specific_initializations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   207
END_CONFIGURATION
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
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
   211
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   212
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   213
/* helper symbol for configuration_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   214
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   215
SYM_LIST(resource_declaration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   216
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   217
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   218
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   219
RESOURCE resource_name ON resource_type_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   220
   optional_global_var_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   221
   single_resource_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   222
END_RESOURCE
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   223
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   224
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   225
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
   226
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   227
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   228
/* task_configuration_list program_configuration_list */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   229
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   230
SYM_REF2(single_resource_declaration_c, task_configuration_list, program_configuration_list)
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
/* helper symbol for single_resource_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   234
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   235
SYM_LIST(task_configuration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   236
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   237
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   238
/* helper symbol for single_resource_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   239
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   240
SYM_LIST(program_configuration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   241
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   242
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   243
/* helper symbol for
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   244
 *  - access_path
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   245
 *  - instance_specific_init
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   246
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   247
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   248
SYM_LIST(any_fb_name_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   249
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   250
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   251
/*  [resource_name '.'] global_var_name ['.' structure_element_name] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   252
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   253
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
   254
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   255
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   256
/*  prev_declared_program_name '.' symbolic_variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   257
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   258
SYM_REF2(program_output_reference_c, program_name, symbolic_variable)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   259
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   260
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   261
/*  TASK task_name task_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   262
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   263
SYM_REF2(task_configuration_c, task_name, task_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   264
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   265
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   266
/*  '(' [SINGLE ASSIGN data_source ','] [INTERVAL ASSIGN data_source ','] PRIORITY ASSIGN integer ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   267
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   268
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
   269
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   270
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   271
/*  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
   272
// 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
   273
    void *visit(program_configuration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   274
      TRACE("program_configuration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   275
      return symbol->prog_conf_elements->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   276
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   277
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   278
/* prog_conf_elements ',' prog_conf_element */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   279
// SYM_LIST(prog_conf_elements_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   280
    void *visit(prog_conf_elements_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   281
      TRACE("prog_conf_elements_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   282
      return search_list(symbol);
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
/*  fb_name WITH task_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   286
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   287
SYM_REF2(fb_task_c, fb_name, task_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   288
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   289
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   290
/*  any_symbolic_variable ASSIGN prog_data_source */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   291
// SYM_REF2(prog_cnxn_assign_c, symbolic_variable, prog_data_source)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   292
    void *visit(prog_cnxn_assign_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   293
      TRACE("prog_cnxn_assign_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   294
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   295
      /* 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
   296
       *       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
   297
       *        symbolic_variable, so for the moment we simply give up!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   298
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   299
      symbolic_variable_c *symb_var = dynamic_cast<symbolic_variable_c *>(symbol->symbolic_variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   300
      if (NULL == symb_var)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   301
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   302
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   303
      return handle_parameter_assignment(symb_var->var_name, symbol->prog_data_source);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   304
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   305
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   306
/* any_symbolic_variable SENDTO data_sink */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   307
// SYM_REF2(prog_cnxn_sendto_c, symbolic_variable, prog_data_source)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   308
    void *visit(prog_cnxn_sendto_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   309
      TRACE("prog_cnxn_sendto_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   310
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   311
      /* 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
   312
       *       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
   313
       *        symbolic_variable, so for the moment we simply give up!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   314
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   315
      symbolic_variable_c *symb_var = dynamic_cast<symbolic_variable_c *>(symbol->symbolic_variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   316
      if (NULL == symb_var)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   317
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   318
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   319
      return handle_parameter_assignment(symb_var->var_name, symbol->data_sink);
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
/* VAR_CONFIG instance_specific_init_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   323
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   324
SYM_REF2(instance_specific_initializations_c, instance_specific_init_list, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   325
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   326
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   327
/* helper symbol for instance_specific_initializations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   328
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   329
SYM_LIST(instance_specific_init_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   330
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   331
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   332
/* resource_name '.' program_name '.' {fb_name '.'}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   333
    ((variable_name [location] ':' located_var_spec_init) | (fb_name ':' fb_initialization))
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
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
   337
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   338
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   339
/* helper symbol for instance_specific_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   340
/* function_block_type_name ':=' structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   341
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   342
SYM_REF2(fb_initialization_c, function_block_type_name, structure_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   343
*/
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
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   347
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
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   351
/* B.2 - Language IL (Instruction List) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   352
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   353
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   354
/* B 2.1 Instructions and Operands */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   355
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   356
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   357
/* | function_name [il_operand_list] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   358
// SYM_REF2(il_function_call_c, function_name, il_operand_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   359
    void *visit(il_function_call_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   360
      TRACE("il_function_call_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   361
      if (NULL != symbol->il_operand_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   362
        return symbol->il_operand_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   363
      return NULL;
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
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   367
/* | function_name '(' eol_list [il_param_list] ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   368
// SYM_REF2(il_formal_funct_call_c, function_name, il_param_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   369
    void *visit(il_formal_funct_call_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   370
      TRACE("il_formal_funct_call_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   371
      if (NULL != symbol->il_param_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   372
        return symbol->il_param_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   373
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   374
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   375
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   376
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   377
/*   il_call_operator prev_declared_fb_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   378
 * | il_call_operator prev_declared_fb_name '(' ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   379
 * | il_call_operator prev_declared_fb_name '(' eol_list ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   380
 * | il_call_operator prev_declared_fb_name '(' il_operand_list ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   381
 * | il_call_operator prev_declared_fb_name '(' eol_list il_param_list ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   382
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   383
// 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
   384
    void *visit(il_fb_call_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   385
      TRACE("il_fb_call_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   386
      /* the following should never occur. In reality the syntax parser
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   387
       * will guarantee that they never occur, but it makes it easier to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   388
       * understand the remaining code :-)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   389
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   390
      //if ((NULL == symbol->il_operand_list) && (NULL == symbol->il_param_list)) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   391
      //if ((NULL != symbol->il_operand_list) && (NULL != symbol->il_param_list)) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   392
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   393
      if (NULL != symbol->il_operand_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   394
        return symbol->il_operand_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   395
      if (NULL != symbol->il_param_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   396
        return symbol->il_param_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   397
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   398
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   399
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   400
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   401
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   402
/* | il_operand_list ',' il_operand */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   403
// SYM_LIST(il_operand_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   404
    void *visit(il_operand_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   405
      TRACE("il_operand_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   406
      return search_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   407
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   408
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   409
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   410
/* | il_initial_param_list il_param_instruction */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   411
// SYM_LIST(il_param_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   412
    void *visit(il_param_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   413
      TRACE("il_param_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   414
      return search_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   415
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   416
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   417
/*  il_assign_operator il_operand
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   418
 * | il_assign_operator '(' eol_list simple_instr_list ')'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   419
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   420
// 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
   421
    void *visit(il_param_assignment_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   422
      TRACE("il_param_assignment_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   423
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   424
      // TODO : We do not yet handle a instruction list passed as parameter !!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   425
      // 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
   426
      if (NULL != symbol->simple_instr_list) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   427
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   428
      return handle_parameter_assignment(symbol->il_assign_operator, symbol->il_operand);
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_out_operator variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   432
// SYM_REF2(il_param_out_assignment_c, il_assign_out_operator, variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   433
    void *visit(il_param_out_assignment_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   434
      TRACE("il_param_out_assignment_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   435
      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
   436
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   437
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   438
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   439
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   440
/* B 2.2 Operators */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   441
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   442
/*| [NOT] any_identifier SENDTO */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   443
// SYM_REF2(il_assign_out_operator_c, option, variable_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   444
    void *visit(il_assign_out_operator_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   445
      TRACE("il_assign_out_operator_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   446
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   447
      // TODO : Handle not_param !!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   448
      // 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
   449
      if (NULL != symbol->option) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   450
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   451
      return (void *)symbol->variable_name;
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
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   455
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   456
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   457
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   458
/* B.3 - Language ST (Structured Text) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   459
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   460
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   461
/* B 3.1 - Expressions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   462
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   463
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   464
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   465
SYM_REF2(function_invocation_c, function_name, parameter_assignment_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   466
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   467
    void *visit(function_invocation_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   468
      TRACE("function_invocation_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   469
      if ((symbol_c *)symbol == f_call && symbol->parameter_assignment_list != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   470
        return symbol->parameter_assignment_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   471
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   472
        return NULL;
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
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
/* B 3.2 Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   480
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   481
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   482
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   483
/* B 3.2.1 Assignment Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   484
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   485
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   486
SYM_REF2(assignment_statement_c, l_exp, r_exp)
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
/* B 3.2.2 Subprogram Control Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   491
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   492
/*  RETURN */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   493
// SYM_REF0(return_statement_c)
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
/* fb_name '(' [param_assignment_list] ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   497
/* param_assignment_list -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   498
// SYM_REF2(fb_invocation_c, fb_name, param_assignment_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   499
    void *visit(fb_invocation_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   500
      TRACE("fb_invocation_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   501
      if (symbol->param_assignment_list != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   502
        return symbol->param_assignment_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   503
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   504
        return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   505
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   506
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   507
/* helper symbol for fb_invocation */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   508
/* param_assignment_list ',' param_assignment */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   509
// SYM_LIST(param_assignment_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   510
    void *visit(param_assignment_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   511
      TRACE("param_assignment_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   512
      return search_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   513
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   514
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   515
/*  variable_name ASSIGN expression */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   516
// SYM_REF2(input_variable_param_assignment_c, variable_name, expression)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   517
    void *visit(input_variable_param_assignment_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   518
      TRACE("input_variable_param_assignment_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   519
      return handle_parameter_assignment(symbol->variable_name, symbol->expression);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   520
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   521
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   522
/* [NOT] variable_name '=>' variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   523
// SYM_REF4(output_variable_param_assignment_c, not_param, variable_name, variable, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   524
    void *visit(output_variable_param_assignment_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   525
      TRACE("output_variable_param_assignment_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   526
      // TODO : Handle not_param !!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   527
      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
   528
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   529
      return handle_parameter_assignment(symbol->variable_name, symbol->variable);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   530
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   531
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   532
/* helper CLASS for output_variable_param_assignment */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   533
// SYM_REF0(not_paramassign_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   534
// TODO... ???
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   535
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   536
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   537
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   538
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   539
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   540
};
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   541
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   542
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   543
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