absyntax_utils/array_dimension_iterator.hh
author mjsousa
Sun, 14 Dec 2014 19:15:29 +0000
changeset 964 5f4dfe6670da
parent 562 044238931066
permissions -rwxr-xr-x
Fix bugs introduced in previous commit (once again do constant folding of all literals in type declarations)
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     1
/*
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     3
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     4
 *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     5
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     6
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     7
 *  This program is free software: you can redistribute it and/or modify
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     8
 *  it under the terms of the GNU General Public License as published by
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
     9
 *  the Free Software Foundation, either version 3 of the License, or
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    10
 *  (at your option) any later version.
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    11
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    12
 *  This program is distributed in the hope that it will be useful,
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    15
 *  GNU General Public License for more details.
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    16
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    17
 *  You should have received a copy of the GNU General Public License
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    18
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    19
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    20
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    21
 * This code is made available on the understanding that it will not be
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    22
 * used in safety-critical situations without a full and competent review.
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    23
 */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    24
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    25
/*
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    26
 * An IEC 61131-3 compiler.
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    27
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    28
 * Based on the
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    29
 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    30
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    31
 */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    32
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    33
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    34
/*
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    35
 * Array dimension iterator.
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    36
 * Iterate through the dimensions of array specification.
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    37
 *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    38
 * This is part of the 4th stage that generates
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    39
 * a c++ source program equivalent to the IL and ST
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    40
 * code.
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    41
 */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    42
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    43
/* Given a array_specification_c, iterate through
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    44
 * each subrange, returning the symbol of each subrange
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    45
 * ...array_dimension_iterator_c
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    46
 */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    47
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    48
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    49
#include "../absyntax/visitor.hh"
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    50
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    51
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    52
class array_dimension_iterator_c : public null_visitor_c {
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    53
  private:
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    54
    /* a pointer to the array_specification_c currently being analyzed */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    55
    symbol_c *array_specification;
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    56
    /* used when called to iterate() for a parameter */
562
044238931066 Change return data type of array_dimension_iterator_c.next()
Mario de Sousa <msousa@fe.up.pt>
parents: 377
diff changeset
    57
    subrange_c *current_array_dimension;
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    58
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    59
  private:
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    60
    void* iterate_list(list_c *list);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    61
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    62
  public:
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    63
    /* start off at the first dimension once again... */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    64
    void reset(void);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    65
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    66
    /* initialize the iterator object.
562
044238931066 Change return data type of array_dimension_iterator_c.next()
Mario de Sousa <msousa@fe.up.pt>
parents: 377
diff changeset
    67
     * We must be given a reference to a array_specification_c that will be analyzed...
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    68
     */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    69
    array_dimension_iterator_c(symbol_c *symbol);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    70
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    71
    /* Skip to the next subrange. After object creation,
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    72
     * the object references on subrange _before_ the first, so
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    73
     * this function must be called once to get the object to
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    74
     * reference the first subrange...
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    75
     *
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    76
     * Returns the subrange symbol!
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    77
     */
562
044238931066 Change return data type of array_dimension_iterator_c.next()
Mario de Sousa <msousa@fe.up.pt>
parents: 377
diff changeset
    78
    subrange_c *next(void);
044238931066 Change return data type of array_dimension_iterator_c.next()
Mario de Sousa <msousa@fe.up.pt>
parents: 377
diff changeset
    79
    
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    80
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    81
    private:
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    82
    
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    83
    /********************************/
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    84
    /* B 1.3.3 - Derived data types */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    85
    /********************************/
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    86
    /*  signed_integer DOTDOT signed_integer */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    87
    void *visit(subrange_c *symbol);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    88
    
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    89
    /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    90
    void *visit(array_specification_c *symbol);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    91
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    92
    /* array_subrange_list ',' subrange */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    93
    void *visit(array_subrange_list_c *symbol);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    94
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    95
}; // function_param_iterator_c
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    96
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    97
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    98
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
    99
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
   100
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
   101
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents:
diff changeset
   102