ccb@201: /* msousa@265: * matiec - a compiler for the programming languages defined in IEC 61131-3 ccb@201: * msousa@265: * Copyright (C) 2003-2011 Mario de Sousa (msousa@fe.up.pt) Edouard@279: * Copyright (C) 2007-2011 Laurent Bessard and Edouard Tisserant ccb@201: * msousa@265: * This program is free software: you can redistribute it and/or modify msousa@265: * it under the terms of the GNU General Public License as published by msousa@265: * the Free Software Foundation, either version 3 of the License, or msousa@265: * (at your option) any later version. msousa@265: * msousa@265: * This program is distributed in the hope that it will be useful, msousa@265: * but WITHOUT ANY WARRANTY; without even the implied warranty of msousa@265: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the msousa@265: * GNU General Public License for more details. msousa@265: * msousa@265: * You should have received a copy of the GNU General Public License msousa@265: * along with this program. If not, see . msousa@265: * ccb@201: * ccb@201: * This code is made available on the understanding that it will not be ccb@201: * used in safety-critical situations without a full and competent review. ccb@201: */ ccb@201: ccb@201: /* msousa@265: * An IEC 61131-3 compiler. ccb@201: * ccb@201: * Based on the ccb@201: * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) ccb@201: * ccb@201: */ ccb@201: ccb@201: ccb@201: ccb@201: ccb@201: /* Returns the data type of an il_operand. ccb@201: * ccb@201: * Note that the il_operand may be a variable, in which case ccb@201: * we return the type of the variable instance. ccb@201: * The il_operand may also be a constant, in which case ccb@201: * we return the data type of that constant. ccb@201: * ccb@201: * The variable instance may be a member of a structured variable, ccb@201: * or an element in an array, or any combination of the two. ccb@201: * ccb@201: * The class constructor must be given the search scope ccb@201: * (function, function block or program within which ccb@201: * the possible il_operand variable instance was declared). ccb@201: */ ccb@201: ccb@202: #include "absyntax_utils.hh" ccb@201: ccb@201: symbol_c *search_il_operand_type_c::get_type(symbol_c *il_operand) { ccb@201: symbol_c *res; ccb@201: ccb@201: /* We first assume that it is a constant... */ ccb@201: res = search_constant_type.get_type(il_operand); ccb@201: if (res != NULL) return res; ccb@201: ccb@201: /* Nope, now we assume it is a variable, and determine its type... */ ccb@201: res = search_varfb_instance_type.get_type(il_operand); ccb@201: if (NULL != res) return res; ccb@201: ccb@201: /* not found */ ccb@201: return NULL; ccb@201: }