absyntax_utils/search_constant_type.hh
author Manuele Conti <conti.ma@alice.it>
Mon, 30 Jul 2012 22:59:00 +0200
changeset 622 eaa49b276e17
parent 618 5e09f665c2f1
permissions -rw-r--r--
Add check bison version in configure.ac file.
To build correctly matiec we need bison greater or equals than 2.4 version.
Now the "configure" script is able to check if system has correctly requirements.
/*
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
 *
 *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *
 * This code is made available on the understanding that it will not be
 * used in safety-critical situations without a full and competent review.
 */

/*
 * An IEC 61131-3 compiler.
 *
 * Based on the
 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
 *
 */

/* NOTE: The use of this visitor class is now deprecated.
 *       The new version of stage3 data type checking adds an entry to
 *       every relevant object in the abstract syntax tree defining
 *       the data type of that object. Please use that instead!
 */



/* Determine the data type of a specific constant or variable.
 * A reference to the relevant type definition is returned.
 *
 * For example:
 *       22          -> returns reference to a int_type_name_c object.
 *       22.2        -> returns reference to a real_type_name_c object.
 *       LREAL#22.2  -> returns reference to a lreal_type_name_c object.
 *       etc...
 */


#include "../absyntax/visitor.hh"

#ifndef _SEARCH_CONSTANT_TYPE_HH
#define _SEARCH_CONSTANT_TYPE_HH

class search_constant_type_c: public search_visitor_c {

  public:
  /* object used to identify an entry in the abstract syntax tree with an invalid data type */
  /* This is only used from stage3 onwards. Stages 1 and 2 will never create any instances of invalid_type_name_c */
  static invalid_type_name_c     invalid_type_name;

  /**********************/
  /* B.1.3 - Data types */
  /**********************/
  /***********************************/
  /* B 1.3.1 - Elementary Data Types */
  /***********************************/
  static real_type_name_c     real_type_name;
  static sint_type_name_c     sint_type_name;
  static lint_type_name_c     lint_type_name;
  static dint_type_name_c     dint_type_name;
  static date_type_name_c     date_type_name;
  static dword_type_name_c    dword_type_name;
  static dt_type_name_c       dt_type_name;
  static tod_type_name_c      tod_type_name;
  static udint_type_name_c    udint_type_name;
  static word_type_name_c     word_type_name;
  static wstring_type_name_c  wstring_type_name;
  static string_type_name_c   string_type_name;
  static lword_type_name_c    lword_type_name;
  static uint_type_name_c     uint_type_name;
  static lreal_type_name_c    lreal_type_name;
  static byte_type_name_c     byte_type_name;
  static usint_type_name_c    usint_type_name;
  static ulint_type_name_c    ulint_type_name;
  static bool_type_name_c     bool_type_name;
  static time_type_name_c     time_type_name;
  static int_type_name_c      int_type_name;


  /******************************************************/
  /* Extensions to the base standard as defined in      */
  /* "Safety Software Technical Specification,          */
  /*  Part 1: Concepts and Function Blocks,             */
  /*  Version 1.0 – Official Release"                   */
  /* by PLCopen - Technical Committee 5 - 2006-01-31    */
  /******************************************************/
 
//  static safebool_type_name_c          safebool_type_name;
  /* The following is required because the expression (TOD_var - TOD_var) will result in a data type
   *  (in this case, TIME) that is neither of the expression elements...
   */
  static safetime_type_name_c     safetime_type_name;
  static safetod_type_name_c      safetod_type_name;
  static safedt_type_name_c       safedt_type_name;
  static safedate_type_name_c     safedate_type_name;
  static safereal_type_name_c     safereal_type_name;
  static safesint_type_name_c     safesint_type_name;
  static safelint_type_name_c     safelint_type_name;
  static safedint_type_name_c     safedint_type_name;
  static safedword_type_name_c    safedword_type_name;
  static safeudint_type_name_c    safeudint_type_name;
  static safeword_type_name_c     safeword_type_name;
  static safewstring_type_name_c  safewstring_type_name;
  static safestring_type_name_c   safestring_type_name;
  static safelword_type_name_c    safelword_type_name;
  static safeuint_type_name_c     safeuint_type_name;
  static safelreal_type_name_c    safelreal_type_name;
  static safebyte_type_name_c     safebyte_type_name;
  static safeusint_type_name_c    safeusint_type_name;
  static safeulint_type_name_c    safeulint_type_name;
  static safebool_type_name_c     safebool_type_name;
  static safeint_type_name_c      safeint_type_name;

  public:
    symbol_c *get_type(symbol_c *constant);


  private:
    /*********************/
    /* B 1.2 - Constants */
    /*********************/

    /******************************/
    /* B 1.2.1 - Numeric Literals */
    /******************************/
    void *visit(real_c *symbol);
    void *visit(neg_real_c *symbol);
    void *visit(integer_c *symbol);
    void *visit(neg_integer_c *symbol);
    void *visit(binary_integer_c *symbol);
    void *visit(octal_integer_c *symbol);
    void *visit(hex_integer_c *symbol);

    void *visit(integer_literal_c *symbol);
    void *visit(real_literal_c *symbol);
    void *visit(bit_string_literal_c *symbol);
    void *visit(boolean_literal_c *symbol);

    void *visit(boolean_true_c *symbol);
    void *visit(boolean_false_c *symbol);

    /*******************************/
    /* B.1.2.2   Character Strings */
    /*******************************/
    void *visit(double_byte_character_string_c *symbol);
    void *visit(single_byte_character_string_c *symbol);

    /***************************/
    /* B 1.2.3 - Time Literals */
    /***************************/
    /************************/
    /* B 1.2.3.1 - Duration */
    /************************/
    void *visit(neg_time_c *symbol);
    void *visit(duration_c *symbol);
    void *visit(interval_c *symbol);
    void *visit(fixed_point_c *symbol);

    /************************************/
    /* B 1.2.3.2 - Time of day and Date */
    /************************************/
    void *visit(time_of_day_c *symbol);
    void *visit(daytime_c *symbol);
    void *visit(date_c *symbol);
    void *visit(date_literal_c *symbol);
    void *visit(date_and_time_c *symbol);

    /********************************/
    /* B 1.3.3 - Derived data types */
    /********************************/
    void *visit(enumerated_value_c *symbol);
};  // search_constant_type_c


#endif /* ifndef _SEARCH_CONSTANT_TYPE_HH */