stage3/narrow_candidate_datatypes.cc
author Mario de Sousa <msousa@fe.up.pt>
Mon, 03 Jul 2017 20:31:47 +0100
changeset 1054 57c08195c962
parent 1047 34b733cb6641
permissions -rw-r--r--
Fix bug in datatype narrowing algorithm affecting IL code.
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     1
/*
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     3
 *
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     4
 *  Copyright (C) 2009-2012  Mario de Sousa (msousa@fe.up.pt)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     5
 *  Copyright (C) 2012       Manuele Conti (manuele.conti@sirius-es.it)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     6
 *  Copyright (C) 2012       Matteo Facchinetti (matteo.facchinetti@sirius-es.it)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     7
 *
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     8
 *  This program is free software: you can redistribute it and/or modify
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
     9
 *  it under the terms of the GNU General Public License as published by
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    10
 *  the Free Software Foundation, either version 3 of the License, or
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    11
 *  (at your option) any later version.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    12
 *
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    13
 *  This program is distributed in the hope that it will be useful,
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    16
 *  GNU General Public License for more details.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    17
 *
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    18
 *  You should have received a copy of the GNU General Public License
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    19
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    20
 *
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    21
 *
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    22
 * This code is made available on the understanding that it will not be
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    23
 * used in safety-critical situations without a full and competent review.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    24
 */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    25
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    26
/*
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    27
 * An IEC 61131-3 compiler.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    28
 *
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    29
 * Based on the
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    30
 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    31
 *
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    32
 */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    33
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    34
552
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    35
/* NOTE: The algorithm implemented here assumes that candidate datatype lists have already been filled!
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    36
 *       BEFORE running this visitor, be sure to CALL the fill_candidate_datatype_c visitor!
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    37
 */
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    38
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    39
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    40
/*
552
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    41
 *  Choose, from the list of all the possible datatypes each expression may take, the single datatype that it will in fact take.
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    42
 *  The resulting (chosen) datatype, will be stored in the symbol_c.datatype variable, leaving the candidate datatype list untouched!
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    43
 * 
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    44
 *  For rvalue expressions, this decision will be based on the datatype of the lvalue expression.
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    45
 *  For lvalue expressions, the candidate datatype list should have a single entry.
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    46
 * 
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    47
 *  For example, the very simple literal '0' in 'foo := 0', may represent a:
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    48
 *    BOOL, BYTE, WORD, DWORD, LWORD, USINT, SINT, UINT, INT, UDINT, DINT, ULINT, LINT (as well as the SAFE versions of these data tyes too!)
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    49
 * 
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    50
 *  In this class, the datatype of '0' will be set to the same datatype as the 'foo' variable.
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    51
 *  If the intersection of the candidate datatype lists of the left and right side expressions is empty, 
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    52
 *  then a datatype error has been found, and the datatype is either left at NULL, or set to a pointer of an invalid_type_name_c object!
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    53
 */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    54
552
3c39d80fdede Add high level comments.
mjsousa <msousa@fe.up.pt>
parents: 534
diff changeset
    55
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    56
#include "narrow_candidate_datatypes.hh"
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    57
#include "datatype_functions.hh"
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    58
#include <typeinfo>
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    59
#include <list>
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    60
#include <string>
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    61
#include <string.h>
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    62
#include <strings.h>
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    63
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    64
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    65
/* set to 1 to see debug info during execution */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    66
static int debug = 0;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    67
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    68
narrow_candidate_datatypes_c::narrow_candidate_datatypes_c(symbol_c *ignore) {
661
f537c3315f83 Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents: 652
diff changeset
    69
	search_varfb_instance_type = NULL;
f537c3315f83 Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents: 652
diff changeset
    70
	fake_prev_il_instruction = NULL;
674
b221168a36f1 Set datatype of il_intruction_c objects containing an ST operator.
Mario de Sousa <msousa@fe.up.pt>
parents: 673
diff changeset
    71
	current_il_instruction   = NULL;
661
f537c3315f83 Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents: 652
diff changeset
    72
	il_operand = NULL;
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    73
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    74
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    75
narrow_candidate_datatypes_c::~narrow_candidate_datatypes_c(void) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    76
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
    77
425
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
    78
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
    79
/* Only set the symbol's desired datatype to 'datatype' if that datatype is in the candidate_datatype list */
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
    80
static void set_datatype(symbol_c *datatype, symbol_c *symbol) {
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    81
  
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    82
	/* If we are trying to set to the undefined type, and the symbol's datatype has already been set to something else, 
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    83
	 * we abort the compoiler as I don't think this should ever occur. 
466
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
    84
	 * NOTE: In order to handle JMPs to labels that come before the JMP itself, we run the narrow algorithm twice.
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
    85
	 *       This means that this situation may legally occur, so we cannot abort the compiler here!
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
    86
	 */
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
    87
// 	if ((NULL == datatype) && (NULL != symbol->datatype)) ERROR;
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
    88
 	if ((NULL == datatype) && (NULL != symbol->datatype)) return;
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    89
	if ((NULL == datatype) && (NULL == symbol->datatype)) return;
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    90
	
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    91
	if (search_in_candidate_datatype_list(datatype, symbol->candidate_datatypes) < 0)
693
51a2fa6441b9 Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 690
diff changeset
    92
		symbol->datatype = &(get_datatype_info_c::invalid_type_name);   
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    93
	else {
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    94
		if (NULL == symbol->datatype)   
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    95
			/* not yet set to anything, so we set it to the requested data type */
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    96
			symbol->datatype = datatype; 
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    97
		else {
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
    98
			/* had already been set previously to some data type. Let's check if they are the same! */
676
ca4f17211251 Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 675
diff changeset
    99
			if (!get_datatype_info_c::is_type_equal(symbol->datatype, datatype))
693
51a2fa6441b9 Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 690
diff changeset
   100
				symbol->datatype = &(get_datatype_info_c::invalid_type_name);
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   101
// 			else 
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   102
				/* we leave it unchanged, as it is the same as the requested data type! */
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   103
		}
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   104
	}
425
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   105
}
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   106
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   107
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   108
457
67d8b07bac22 Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents: 456
diff changeset
   109
/* Only set the symbol's desired datatype to 'datatype' if that datatype is in the candidate_datatype list */
1054
57c08195c962 Fix bug in datatype narrowing algorithm affecting IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1047
diff changeset
   110
// NOTE: This function is virtual! The forced_narrow_candidate_datatypes_c has a slightly different version of this fuinction!!
57c08195c962 Fix bug in datatype narrowing algorithm affecting IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1047
diff changeset
   111
void narrow_candidate_datatypes_c::set_datatype_in_prev_il_instructions(symbol_c *datatype, il_instruction_c *symbol) {
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   112
	if (NULL == symbol) ERROR;
457
67d8b07bac22 Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents: 456
diff changeset
   113
	for (unsigned int i = 0; i < symbol->prev_il_instruction.size(); i++)
67d8b07bac22 Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents: 456
diff changeset
   114
		set_datatype(datatype, symbol->prev_il_instruction[i]);
67d8b07bac22 Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents: 456
diff changeset
   115
}
67d8b07bac22 Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents: 456
diff changeset
   116
67d8b07bac22 Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents: 456
diff changeset
   117
425
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   118
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
   119
bool narrow_candidate_datatypes_c::is_widening_compatible(const struct widen_entry widen_table[], symbol_c *left_type, symbol_c *right_type, symbol_c *result_type, bool *deprecated_status) {
515
fdef852a6565 Fix bug when handling code with data type errors.
Mario de Sousa <msousa@fe.up.pt>
parents: 502
diff changeset
   120
	/* NOTE: According to our algorithm, left_type and right_type should never by NULL (if they are, we have an internal compiler error!
fdef852a6565 Fix bug when handling code with data type errors.
Mario de Sousa <msousa@fe.up.pt>
parents: 502
diff changeset
   121
	 *       However, result_type may be NULL if the code has a data type semantic error!
fdef852a6565 Fix bug when handling code with data type errors.
Mario de Sousa <msousa@fe.up.pt>
parents: 502
diff changeset
   122
	 */
fdef852a6565 Fix bug when handling code with data type errors.
Mario de Sousa <msousa@fe.up.pt>
parents: 502
diff changeset
   123
	if ((NULL == left_type) || (NULL == right_type) || (NULL == result_type))
fdef852a6565 Fix bug when handling code with data type errors.
Mario de Sousa <msousa@fe.up.pt>
parents: 502
diff changeset
   124
		return false;
fdef852a6565 Fix bug when handling code with data type errors.
Mario de Sousa <msousa@fe.up.pt>
parents: 502
diff changeset
   125
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   126
	for (int k = 0; NULL != widen_table[k].left;  k++) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   127
		if        ((typeid(*left_type)   == typeid(*widen_table[k].left))
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   128
		        && (typeid(*right_type)  == typeid(*widen_table[k].right))
478
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
   129
			&& (typeid(*result_type) == typeid(*widen_table[k].result))) {
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
   130
			if (NULL != deprecated_status)
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
   131
				*deprecated_status = (widen_table[k].status == widen_entry::deprecated);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   132
			return true;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   133
		}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   134
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   135
	return false;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   136
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   137
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   138
/*
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   139
 * All parameters being passed to the called function MUST be in the parameter list to which f_call points to!
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   140
 * This means that, for non formal function calls in IL, de current (default value) must be artificially added to the
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   141
 * beginning of the parameter list BEFORE calling handle_function_call().
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   142
 */
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   143
void narrow_candidate_datatypes_c::narrow_nonformal_call(symbol_c *f_call, symbol_c *f_decl, int *ext_parm_count) {
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   144
	symbol_c *call_param_value,  *param_type;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   145
	identifier_c *param_name;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   146
	function_param_iterator_c       fp_iterator(f_decl);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   147
	function_call_param_iterator_c fcp_iterator(f_call);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   148
	int extensible_parameter_highest_index = -1;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   149
	unsigned int i;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   150
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   151
	if (NULL != ext_parm_count) *ext_parm_count = -1;
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   152
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   153
	/* Iterating through the non-formal parameters of the function call */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   154
	while((call_param_value = fcp_iterator.next_nf()) != NULL) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   155
		/* Obtaining the type of the value being passed in the function call */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   156
		/* Iterate to the next parameter of the function being called.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   157
		 * Get the name of that parameter, and ignore if EN or ENO.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   158
		 */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   159
		do {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   160
			param_name = fp_iterator.next();
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   161
			/* If there is no other parameter declared, then we are passing too many parameters... */
424
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   162
			/* This error should have been caught in fill_candidate_datatypes_c, but may occur here again when we handle FB invocations! 
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   163
			 * In this case, we carry on analysing the code in order to be able to provide relevant error messages
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   164
			 * for that code too!
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   165
			 */
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   166
			if(param_name == NULL) break;
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   167
		} while ((strcmp(param_name->value, "EN") == 0) || (strcmp(param_name->value, "ENO") == 0));
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   168
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   169
		/* Set the desired datatype for this parameter, and call it recursively. */
424
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   170
		/* Note that if the call has more parameters than those declared in the function/FB declaration,
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   171
		 * we may be setting this to NULL!
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   172
		 */
425
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   173
		symbol_c *desired_datatype = base_type(fp_iterator.param_type());
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   174
		if ((NULL != param_name) && (NULL == desired_datatype)) ERROR;
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   175
		if ((NULL == param_name) && (NULL != desired_datatype)) ERROR;
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   176
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   177
		/* NOTE: When we are handling a nonformal function call made from IL, the first parameter is the 'default' or 'current'
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   178
		 *       il value. However, a pointer to a copy of the prev_il_instruction is pre-pended into the operand list, so 
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   179
		 *       the call 
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   180
		 *       call_param_value->accept(*this);
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   181
		 *       may actually be calling an object of the base symbol_c .
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   182
		 */
425
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   183
		set_datatype(desired_datatype, call_param_value);
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   184
		call_param_value->accept(*this);
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   185
424
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   186
		if (NULL != param_name) 
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   187
			if (extensible_parameter_highest_index < fp_iterator.extensible_param_index())
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   188
				extensible_parameter_highest_index = fp_iterator.extensible_param_index();
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   189
	}
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   190
	/* In the case of a call to an extensible function, we store the highest index 
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   191
	 * of the extensible parameters this particular call uses, in the symbol_c object
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   192
	 * of the function call itself!
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   193
	 * In calls to non-extensible functions, this value will be set to -1.
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   194
	 * This information is later used in stage4 to correctly generate the
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   195
	 * output code.
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   196
	 */
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   197
	if ((NULL != ext_parm_count) && (extensible_parameter_highest_index >=0) /* if call to extensible function */)
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   198
		*ext_parm_count = 1 + extensible_parameter_highest_index - fp_iterator.first_extensible_param_index();
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   199
}
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   200
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   201
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   202
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   203
void narrow_candidate_datatypes_c::narrow_formal_call(symbol_c *f_call, symbol_c *f_decl, int *ext_parm_count) {
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   204
	symbol_c *call_param_value, *call_param_name, *param_type;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   205
	symbol_c *verify_duplicate_param;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   206
	identifier_c *param_name;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   207
	function_param_iterator_c       fp_iterator(f_decl);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   208
	function_call_param_iterator_c fcp_iterator(f_call);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   209
	int extensible_parameter_highest_index = -1;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   210
	identifier_c *extensible_parameter_name;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   211
	unsigned int i;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   212
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   213
	if (NULL != ext_parm_count) *ext_parm_count = -1;
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   214
	/* Iterating through the formal parameters of the function call */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   215
	while((call_param_name = fcp_iterator.next_f()) != NULL) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   216
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   217
		/* Obtaining the value being passed in the function call */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   218
		call_param_value = fcp_iterator.get_current_value();
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   219
		/* the following should never occur. If it does, then we have a bug in our code... */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   220
		if (NULL == call_param_value) ERROR;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   221
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   222
		/* Find the corresponding parameter in function declaration */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   223
		param_name = fp_iterator.search(call_param_name);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   224
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   225
		/* Set the desired datatype for this parameter, and call it recursively. */
424
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   226
		/* NOTE: When handling a FB call, this narrow_formal_call() may be called to analyse
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   227
		 *       an invalid FB call (call with parameters that do not exist on the FB declaration).
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   228
		 *       For this reason, the param_name may come out as NULL!
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   229
		 */
425
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   230
		symbol_c *desired_datatype = base_type(fp_iterator.param_type());
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   231
		if ((NULL != param_name) && (NULL == desired_datatype)) ERROR;
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   232
		if ((NULL == param_name) && (NULL != desired_datatype)) ERROR;
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   233
450
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
   234
		/* set the desired data type for this parameter */
425
c8e6cf57324a Print error messages when datatype erros found in ST function/FB calls.
Mario de Sousa <msousa@fe.up.pt>
parents: 424
diff changeset
   235
		set_datatype(desired_datatype, call_param_value);
450
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
   236
		/* And recursively call that parameter/expression, so it can propagate that info */
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   237
		call_param_value->accept(*this);
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   238
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   239
		/* set the extensible_parameter_highest_index, which will be needed in stage 4 */
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   240
		/* This value says how many extensible parameters are being passed to the standard function */
424
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   241
		if (NULL != param_name) 
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   242
			if (extensible_parameter_highest_index < fp_iterator.extensible_param_index())
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
   243
				extensible_parameter_highest_index = fp_iterator.extensible_param_index();
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   244
	}
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   245
	/* call is compatible! */
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   246
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   247
	/* In the case of a call to an extensible function, we store the highest index 
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   248
	 * of the extensible parameters this particular call uses, in the symbol_c object
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   249
	 * of the function call itself!
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   250
	 * In calls to non-extensible functions, this value will be set to -1.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   251
	 * This information is later used in stage4 to correctly generate the
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   252
	 * output code.
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   253
	 */
421
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   254
	if ((NULL != ext_parm_count) && (extensible_parameter_highest_index >=0) /* if call to extensible function */)
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   255
		*ext_parm_count = 1 + extensible_parameter_highest_index - fp_iterator.first_extensible_param_index();
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   256
}
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   257
840cb1e1e177 Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 417
diff changeset
   258
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   259
/*
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   260
typedef struct {
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   261
  symbol_c *function_name,
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   262
  symbol_c *nonformal_operand_list,
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   263
  symbol_c *   formal_operand_list,
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   264
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   265
  std::vector <symbol_c *> &candidate_functions,  
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   266
  symbol_c &*called_function_declaration,
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   267
  int      &extensible_param_count
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   268
} generic_function_call_t;
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   269
*/
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   270
void narrow_candidate_datatypes_c::narrow_function_invocation(symbol_c *fcall, generic_function_call_t fcall_data) {
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   271
	/* set the called_function_declaration. */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   272
	fcall_data.called_function_declaration = NULL;
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   273
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   274
	/* set the called_function_declaration taking into account the datatype that we need to return */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   275
	for(unsigned int i = 0; i < fcall->candidate_datatypes.size(); i++) {
676
ca4f17211251 Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 675
diff changeset
   276
		if (get_datatype_info_c::is_type_equal(fcall->candidate_datatypes[i], fcall->datatype)) {
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   277
			fcall_data.called_function_declaration = fcall_data.candidate_functions[i];
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   278
			break;
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   279
		}
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   280
	}
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   281
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   282
	/* NOTE: If we can't figure out the declaration of the function being called, this is not 
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   283
	 *       necessarily an internal compiler error. It could be because the symbol->datatype is NULL
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   284
	 *       (because the ST code being analysed has an error _before_ this function invocation).
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   285
	 *       However, we don't just give, up, we carry on recursivly analysing the code, so as to be
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   286
	 *       able to print out any error messages related to the parameters being passed in this function 
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   287
	 *       invocation.
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   288
	 */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   289
	/* if (NULL == symbol->called_function_declaration) ERROR; */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   290
	if (fcall->candidate_datatypes.size() == 1) {
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   291
		/* If only one function declaration, then we use that (even if symbol->datatypes == NULL)
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   292
		 * so we can check for errors in the expressions used to pass parameters in this
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   293
		 * function invocation.
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   294
		 */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   295
		fcall_data.called_function_declaration = fcall_data.candidate_functions[0];
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   296
	}
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   297
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   298
	/* If an overloaded function is being invoked, and we cannot determine which version to use,
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   299
	 * then we can not meaningfully verify the expressions used inside that function invocation.
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   300
	 * We simply give up!
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   301
	 */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   302
	if (NULL == fcall_data.called_function_declaration)
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   303
		return;
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   304
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   305
	if (NULL != fcall_data.nonformal_operand_list)  narrow_nonformal_call(fcall, fcall_data.called_function_declaration, &(fcall_data.extensible_param_count));
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   306
	if (NULL != fcall_data.   formal_operand_list)     narrow_formal_call(fcall, fcall_data.called_function_declaration, &(fcall_data.extensible_param_count));
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   307
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   308
	return;
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   309
}
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   310
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
   311
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   312
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   313
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   314
/* narrow implicit FB call in IL.
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   315
 * e.g.  CLK ton_var
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   316
 *        CU counter_var
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   317
 *
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   318
 * The algorithm will be to build a fake il_fb_call_c equivalent to the implicit IL FB call, and let 
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   319
 * the visit(il_fb_call_c *) method handle it!
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   320
 */
456
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
   321
void *narrow_candidate_datatypes_c::narrow_implicit_il_fb_call(symbol_c *il_instruction, const char *param_name, symbol_c *&called_fb_declaration) {
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   322
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   323
	/* set the datatype of the il_operand, this is, the FB being called! */
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   324
	if (NULL != il_operand) {
834
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
   325
		set_datatype(called_fb_declaration, il_operand); /* only set it if it is in the candidate datatypes list! */  
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   326
		il_operand->accept(*this);
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   327
	}
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   328
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   329
	if (0 == fake_prev_il_instruction->prev_il_instruction.size()) {
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   330
		/* This IL implicit FB call (e.g. CLK ton_var) is not preceded by another IL instruction
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   331
		 * (or list of instructions) that will set the IL current/default value.
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   332
		 * We cannot proceed verifying type compatibility of something that does not exist.
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   333
		 */
456
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
   334
		return NULL;
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   335
	}
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   336
834
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
   337
	symbol_c *fb_decl = (NULL == il_operand)? NULL : il_operand->datatype;
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
   338
	
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   339
	if (NULL == fb_decl) {
834
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
   340
		/* the il_operand is a not FB instance, or it simply does not even exist, */
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   341
		/* so we simply pass on the required datatype to the prev_il_instructions */
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   342
		/* The invalid FB invocation will be caught in the print_datatypes_error_c by analysing NULL value in il_operand->datatype! */
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   343
		set_datatype_in_prev_il_instructions(il_instruction->datatype, fake_prev_il_instruction);
456
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
   344
		return NULL;
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   345
	}
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   346
	
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   347
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   348
	/* The value being passed to the 'param_name' parameter is actually the prev_il_instruction.
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   349
	 * However, we do not place that object directly in the fake il_param_list_c that we will be
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   350
	 * creating, since the visit(il_fb_call_c *) method will recursively call every object in that list.
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   351
	 * The il_prev_intruction object will be visited once we have handled this implici IL FB call
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   352
	 * (called from the instruction_list_c for() loop that works backwards). We DO NOT want to visit it twice.
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   353
	 * (Anyway, if we let the visit(il_fb_call_c *) recursively visit the current prev_il_instruction, this pointer
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   354
	 * would be changed to the IL instruction coming before the current prev_il_instruction! => things would get all messed up!)
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   355
	 * The easiest way to work around this is to simply use a new object, and copy the relevant details to that object!
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   356
	 */
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   357
	symbol_c param_value = *fake_prev_il_instruction; /* copy the candidate_datatypes list ! */
461
fcbc0927fc96 Remove spurious printf()s, used during debugging session.
Mario de Sousa <msousa@fe.up.pt>
parents: 459
diff changeset
   358
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   359
	identifier_c variable_name(param_name);
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   360
	// SYM_REF1(il_assign_operator_c, variable_name)
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   361
	il_assign_operator_c il_assign_operator(&variable_name);  
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   362
	// SYM_REF3(il_param_assignment_c, il_assign_operator, il_operand, simple_instr_list)
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   363
	il_param_assignment_c il_param_assignment(&il_assign_operator, &param_value/*il_operand*/, NULL);
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   364
	il_param_list_c il_param_list;
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   365
	il_param_list.add_element(&il_param_assignment);
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   366
	// SYM_REF4(il_fb_call_c, il_call_operator, fb_name, il_operand_list, il_param_list, symbol_c *called_fb_declaration)
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   367
	CAL_operator_c CAL_operator;
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   368
	il_fb_call_c il_fb_call(&CAL_operator, il_operand, NULL, &il_param_list);
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   369
	        
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   370
	/* A FB call does not return any datatype, but the IL instructions that come after this
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   371
	 * FB call may require a specific datatype in the il current/default variable, 
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   372
	 * so we must pass this information up to the IL instruction before the FB call, since it will
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   373
	 * be that IL instruction that will be required to produce the desired dtataype.
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   374
	 *
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   375
	 * The above will be done by the visit(il_fb_call_c *) method, so we must make sure to
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   376
	 * correctly set up the il_fb_call.datatype variable!
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   377
	 */
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   378
	il_fb_call.called_fb_declaration = called_fb_declaration;
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   379
	il_fb_call.accept(*this);
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   380
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   381
	/* set the required datatype of the previous IL instruction! */
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   382
	/* NOTE:
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   383
	 * When handling these implicit IL calls, the parameter_value being passed to the FB parameter
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   384
	 * is actually the prev_il_instruction.
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   385
	 * 
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   386
	 * However, since the FB call does not change the value in the current/default IL variable, this value
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   387
	 * must also be used ny the IL instruction coming after this FB call.
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   388
	 *
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   389
	 * This means that we have two consumers/users for the same value. 
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   390
	 * We must therefore check whether the datatype required by the IL instructions following this FB call 
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   391
	 * is the same as that required for the first parameter. If not, then we have a semantic error,
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   392
	 * and we set it to invalid_type_name.
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   393
	 *
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   394
	 * However, we only do that if:
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   395
	 *  - The IL instruction that comes after this IL FB call actually asked this FB call for a specific 
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   396
	 *     datatype in the current/default vairable, once this IL FB call returns.
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   397
	 *     However, sometimes, (for e.g., this FB call is the last in the IL list) the subsequent FB to not aks this
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   398
	 *     FB call for any datatype. In that case, then the datatype required to pass to the first parameter of the
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   399
	 *     FB call must be left unchanged!
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
   400
	 */
676
ca4f17211251 Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 675
diff changeset
   401
	if ((NULL == il_instruction->datatype) || (get_datatype_info_c::is_type_equal(param_value.datatype, il_instruction->datatype))) {
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
   402
		set_datatype_in_prev_il_instructions(param_value.datatype, fake_prev_il_instruction);
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   403
	} else {
693
51a2fa6441b9 Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 690
diff changeset
   404
		set_datatype_in_prev_il_instructions(&get_datatype_info_c::invalid_type_name, fake_prev_il_instruction);
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
   405
	}
456
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
   406
	return NULL;
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   407
}
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   408
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
   409
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   410
/* a helper function... */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   411
symbol_c *narrow_candidate_datatypes_c::base_type(symbol_c *symbol) {
718
a9f8cc778444 Make search_base_type_c a singleton!
Mario de Sousa <msousa@fe.up.pt>
parents: 693
diff changeset
   412
	/* NOTE: symbol == NULL is valid. It will occur when, for e.g., an undefined/undeclared symbolic_variable is used in the code. */
423
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
   413
	if (symbol == NULL) return NULL;
718
a9f8cc778444 Make search_base_type_c a singleton!
Mario de Sousa <msousa@fe.up.pt>
parents: 693
diff changeset
   414
	return search_base_type_c::get_basetype_decl(symbol);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   415
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   416
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   417
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   418
996
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   419
/*************************/
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   420
/* B.1 - Common elements */
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   421
/*************************/
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   422
/*******************************************/
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   423
/* B 1.1 - Letters, digits and identifiers */
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   424
/*******************************************/
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   425
/* Before the existance of this derived_datatype_identifier_c class, all identifiers were stored in the generic identifier_c class.
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   426
 * Since not all identifiers are used to identify a datatype, the fill/narrow algorithms could not do fill/narrow on all identifiers, and relied
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   427
 * on the parent class to do the fill/narrow when apropriate (i.e. when the identifier was known to reference a datatype
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   428
 * for example, in a variable declaration -->  var1: some_user_defined_type;)
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   429
 *
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   430
 * However, at least one location where an identifier may reference a datatype has not yet been covered:
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   431
 *     array1: ARRAY [1..2] OF INT;
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   432
 *     array2: ARRAY [1..2] OF array1;  (* array1 here is stored as a derived_datatype_identifier_c)
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   433
 *
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   434
 * Instead of doing it like the old way, I have opted to do a generic fill/narrow for all derived_datatype_identifier_c
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   435
 * This means that we can now delete the code of all parents of derived_datatype_identifier_c that are still doing the fill/narrow
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   436
 * explicitly (assuming we do also implement the visitor for poutype_identifier_c). However, I will leave this code cleanup for some later oportunity.
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   437
 */
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   438
void *narrow_candidate_datatypes_c::visit(derived_datatype_identifier_c *symbol) {
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   439
	// If this symbol was used (for example) in an ARRAY [1..2] OF <derived_datatype_identifier_c> (i.e. a datatype in an array)
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   440
	// then the symbol->datatype of this derived_datatype_identifier_c has not yet been set by the previous visit() method!
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   441
	// We therefore set the datatype ourselves!
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   442
	if ((NULL == symbol->datatype) && (symbol->candidate_datatypes.size() == 1))
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   443
		symbol->datatype = symbol->candidate_datatypes[0];
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   444
	return NULL;
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   445
}
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   446
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   447
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   448
/* The datatype of a poutype_identifier_c is currently always being set by the parent object, so we leave this code commented out for now. */
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   449
/* 
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   450
void *narrow_candidate_datatypes_c::visit(         poutype_identifier_c *symbol) {
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   451
	// If this symbol was used (for example) in an ARRAY [1..2] OF <derived_datatype_identifier_c> (i.e. a datatype in an array)
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   452
	// then the symbol->datatype of this derived_datatype_identifier_c has not yet been set by the previous visit() method!
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   453
	// We therefore set the datatype ourselves!
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   454
	if ((NULL == symbol->datatype) && (symbol->candidate_datatypes.size() == 1))
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   455
		symbol->datatype = symbol->candidate_datatypes[0];
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   456
	return NULL;
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   457
}
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   458
*/
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   459
    
c752b113237b Do fill/narrow datatype analysis algorithm for derived_datatype_identifier_c (fixes bug related to arrays of arrays that was generating incorrect C code).
mjsousa
parents: 994
diff changeset
   460
    
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   461
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   462
/**********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   463
/* B 1.3 - Data types */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   464
/**********************/
797
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   465
/***********************************/
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   466
/* B 1.3.1 - Elementary Data Types */
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   467
/***********************************/
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   468
/* NOTE: elementary datatypes are their own basetype ! */
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   469
void *narrow_candidate_datatypes_c::visit(    time_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   470
void *narrow_candidate_datatypes_c::visit(    bool_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   471
void *narrow_candidate_datatypes_c::visit(    sint_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   472
void *narrow_candidate_datatypes_c::visit(    int_type_name_c     *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   473
void *narrow_candidate_datatypes_c::visit(    dint_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   474
void *narrow_candidate_datatypes_c::visit(    lint_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   475
void *narrow_candidate_datatypes_c::visit(    usint_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   476
void *narrow_candidate_datatypes_c::visit(    uint_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   477
void *narrow_candidate_datatypes_c::visit(    udint_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   478
void *narrow_candidate_datatypes_c::visit(    ulint_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   479
void *narrow_candidate_datatypes_c::visit(    real_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   480
void *narrow_candidate_datatypes_c::visit(    lreal_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   481
void *narrow_candidate_datatypes_c::visit(    date_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   482
void *narrow_candidate_datatypes_c::visit(    tod_type_name_c     *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   483
void *narrow_candidate_datatypes_c::visit(    dt_type_name_c      *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   484
void *narrow_candidate_datatypes_c::visit(    byte_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   485
void *narrow_candidate_datatypes_c::visit(    word_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   486
void *narrow_candidate_datatypes_c::visit(    dword_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   487
void *narrow_candidate_datatypes_c::visit(    lword_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   488
void *narrow_candidate_datatypes_c::visit(    string_type_name_c  *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   489
void *narrow_candidate_datatypes_c::visit(    wstring_type_name_c *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   490
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   491
void *narrow_candidate_datatypes_c::visit(safetime_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   492
void *narrow_candidate_datatypes_c::visit(safebool_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   493
void *narrow_candidate_datatypes_c::visit(safesint_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   494
void *narrow_candidate_datatypes_c::visit(safeint_type_name_c     *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   495
void *narrow_candidate_datatypes_c::visit(safedint_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   496
void *narrow_candidate_datatypes_c::visit(safelint_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   497
void *narrow_candidate_datatypes_c::visit(safeusint_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   498
void *narrow_candidate_datatypes_c::visit(safeuint_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   499
void *narrow_candidate_datatypes_c::visit(safeudint_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   500
void *narrow_candidate_datatypes_c::visit(safeulint_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   501
void *narrow_candidate_datatypes_c::visit(safereal_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   502
void *narrow_candidate_datatypes_c::visit(safelreal_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   503
void *narrow_candidate_datatypes_c::visit(safedate_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   504
void *narrow_candidate_datatypes_c::visit(safetod_type_name_c     *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   505
void *narrow_candidate_datatypes_c::visit(safedt_type_name_c      *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   506
void *narrow_candidate_datatypes_c::visit(safebyte_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   507
void *narrow_candidate_datatypes_c::visit(safeword_type_name_c    *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   508
void *narrow_candidate_datatypes_c::visit(safedword_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   509
void *narrow_candidate_datatypes_c::visit(safelword_type_name_c   *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   510
void *narrow_candidate_datatypes_c::visit(safestring_type_name_c  *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   511
void *narrow_candidate_datatypes_c::visit(safewstring_type_name_c *symbol) {symbol->datatype = search_base_type_c::get_basetype_decl(symbol); return NULL;} 
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   512
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   513
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   514
/********************************/
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   515
/* B.1.3.2 - Generic data types */
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   516
/********************************/
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   517
/* empty!! */
3444c331efc9 Fill in the symbol->datatype of elementary datatypes.
Mario de Sousa <msousa@fe.up.pt>
parents: 728
diff changeset
   518
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   519
/********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   520
/* B 1.3.3 - Derived data types */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   521
/********************************/
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   522
void *narrow_candidate_datatypes_c::narrow_spec_init(symbol_c *symbol, symbol_c *type_decl, symbol_c *init_value) {
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   523
	// If we are handling an anonymous datatype (i.e. a datatype implicitly declared inside a VAR ... END_VAR declaration)
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   524
	// then the symbol->datatype has not yet been set by the previous visit(type_decl) method, because it does not exist!
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   525
	// So we set the datatype ourselves!
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   526
	if ((NULL == symbol->datatype) && (symbol->candidate_datatypes.size() == 1))
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   527
		symbol->datatype = symbol->candidate_datatypes[0];
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   528
  
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   529
	set_datatype(symbol->datatype, type_decl);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   530
	type_decl->accept(*this);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   531
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   532
	if (NULL != init_value) {
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   533
		set_datatype(symbol->datatype, init_value);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   534
		init_value->accept(*this);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   535
	}
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   536
	return NULL;
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   537
}
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   538
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   539
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   540
void *narrow_candidate_datatypes_c::narrow_type_decl(symbol_c *symbol, symbol_c *type_name, symbol_c *spec_init) {
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   541
	if (symbol->candidate_datatypes.size() == 1) {
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   542
		symbol->datatype = symbol->candidate_datatypes[0];
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   543
  
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   544
		set_datatype(symbol->datatype, type_name);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   545
		set_datatype(symbol->datatype, spec_init);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   546
		spec_init->accept(*this);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   547
	}
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   548
	return NULL;
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   549
}
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   550
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   551
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   552
/*  TYPE type_declaration_list END_TYPE */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   553
// SYM_REF1(data_type_declaration_c, type_declaration_list)
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   554
/* NOTE: Not required. already handled by iterator_visitor_c base class */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   555
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   556
/* helper symbol for data_type_declaration */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   557
// SYM_LIST(type_declaration_list_c)
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   558
/* NOTE: Not required. already handled by iterator_visitor_c base class */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   559
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   560
/*  simple_type_name ':' simple_spec_init */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   561
// SYM_REF2(simple_type_declaration_c, simple_type_name, simple_spec_init)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   562
void *narrow_candidate_datatypes_c::visit(simple_type_declaration_c *symbol) {return narrow_type_decl(symbol, symbol->simple_type_name, symbol->simple_spec_init);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   563
502
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   564
/* simple_specification ASSIGN constant */
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   565
// SYM_REF2(simple_spec_init_c, simple_specification, constant)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   566
void *narrow_candidate_datatypes_c::visit(simple_spec_init_c *symbol) {return narrow_spec_init(symbol, symbol->simple_specification, symbol->constant);}
502
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   567
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   568
/*  subrange_type_name ':' subrange_spec_init */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   569
// SYM_REF2(subrange_type_declaration_c, subrange_type_name, subrange_spec_init)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   570
void *narrow_candidate_datatypes_c::visit(subrange_type_declaration_c *symbol) {return narrow_type_decl(symbol, symbol->subrange_type_name, symbol->subrange_spec_init);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   571
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   572
/* subrange_specification ASSIGN signed_integer */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   573
// SYM_REF2(subrange_spec_init_c, subrange_specification, signed_integer)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   574
void *narrow_candidate_datatypes_c::visit(subrange_spec_init_c *symbol) {return narrow_spec_init(symbol, symbol->subrange_specification, symbol->signed_integer);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   575
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   576
/*  integer_type_name '(' subrange')' */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   577
// SYM_REF2(subrange_specification_c, integer_type_name, subrange)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   578
void *narrow_candidate_datatypes_c::visit(subrange_specification_c *symbol) {
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   579
	set_datatype(symbol->datatype, symbol->integer_type_name);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   580
	symbol->integer_type_name->accept(*this);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   581
	set_datatype(symbol->datatype, symbol->integer_type_name);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   582
	symbol->integer_type_name->accept(*this);
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   583
	return NULL;
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   584
}
502
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   585
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   586
/*  signed_integer DOTDOT signed_integer */
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   587
/* dimension will be filled in during stage 3 (array_range_check_c) with the number of elements in this subrange */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   588
// SYM_REF2(subrange_c, lower_limit, upper_limit, unsigned long long int dimension;)
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   589
void *narrow_candidate_datatypes_c::visit(subrange_c *symbol) {
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   590
	set_datatype(symbol->datatype, symbol->lower_limit);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   591
	symbol->lower_limit->accept(*this);
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   592
	set_datatype(symbol->datatype, symbol->upper_limit);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   593
	symbol->upper_limit->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   594
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   595
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   596
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   597
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   598
/*  enumerated_type_name ':' enumerated_spec_init */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   599
// SYM_REF2(enumerated_type_declaration_c, enumerated_type_name, enumerated_spec_init)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   600
void *narrow_candidate_datatypes_c::visit(enumerated_type_declaration_c *symbol) {return narrow_type_decl(symbol, symbol->enumerated_type_name, symbol->enumerated_spec_init);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   601
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   602
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   603
/* enumerated_specification ASSIGN enumerated_value */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   604
// SYM_REF2(enumerated_spec_init_c, enumerated_specification, enumerated_value)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   605
void *narrow_candidate_datatypes_c::visit(enumerated_spec_init_c *symbol) {return narrow_spec_init(symbol, symbol->enumerated_specification, symbol->enumerated_value);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   606
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   607
/* helper symbol for enumerated_specification->enumerated_spec_init */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   608
/* enumerated_value_list ',' enumerated_value */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   609
// SYM_LIST(enumerated_value_list_c)
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   610
void *narrow_candidate_datatypes_c::visit(enumerated_value_list_c *symbol) {
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   611
//if (NULL == symbol->datatype) ERROR;  // Comented out-> Reserve this check for the print_datatypes_error_c ???  
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   612
  for(int i = 0; i < symbol->n; i++) set_datatype(symbol->datatype, symbol->get_element(i));
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   613
//for(int i = 0; i < symbol->n; i++) if (NULL == symbol->get_element(i)->datatype) ERROR; // Comented out-> Reserve this check for the print_datatypes_error_c ???  
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   614
  return NULL;  
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   615
}
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   616
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   617
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   618
/* enumerated_type_name '#' identifier */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   619
// SYM_REF2(enumerated_value_c, type, value)
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   620
// void *narrow_candidate_datatypes_c::visit(enumerated_value_c *symbol) {/* do nothing! */ return NULL;}
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   621
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   622
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   623
/*  identifier ':' array_spec_init */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   624
// SYM_REF2(array_type_declaration_c, identifier, array_spec_init)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   625
void *narrow_candidate_datatypes_c::visit(array_type_declaration_c *symbol) {return narrow_type_decl(symbol, symbol->identifier, symbol->array_spec_init);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   626
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   627
/* array_specification [ASSIGN array_initialization} */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   628
/* array_initialization may be NULL ! */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   629
// SYM_REF2(array_spec_init_c, array_specification, array_initialization)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   630
void *narrow_candidate_datatypes_c::visit(array_spec_init_c *symbol) {return narrow_spec_init(symbol, symbol->array_specification, symbol->array_initialization);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   631
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   632
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   633
// SYM_REF2(array_specification_c, array_subrange_list, non_generic_type_name)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   634
// Not needed!!
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   635
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   636
/* helper symbol for array_specification */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   637
/* array_subrange_list ',' subrange */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   638
// SYM_LIST(array_subrange_list_c)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   639
// Not needed ??
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   640
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   641
/* array_initialization:  '[' array_initial_elements_list ']' */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   642
/* helper symbol for array_initialization */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   643
/* array_initial_elements_list ',' array_initial_elements */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   644
// SYM_LIST(array_initial_elements_list_c)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   645
// Not needed ???
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   646
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   647
/* integer '(' [array_initial_element] ')' */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   648
/* array_initial_element may be NULL ! */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   649
// SYM_REF2(array_initial_elements_c, integer, array_initial_element)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   650
// Not needed ???
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   651
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   652
/*  structure_type_name ':' structure_specification */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   653
// SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   654
void *narrow_candidate_datatypes_c::visit(structure_type_declaration_c *symbol) {return narrow_type_decl(symbol, symbol->structure_type_name, symbol->structure_specification);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   655
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   656
/* structure_type_name ASSIGN structure_initialization */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   657
/* structure_initialization may be NULL ! */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   658
// SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   659
void *narrow_candidate_datatypes_c::visit(initialized_structure_c *symbol) {return narrow_spec_init(symbol, symbol->structure_type_name, symbol->structure_initialization);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   660
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   661
/* helper symbol for structure_declaration */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   662
/* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   663
/* structure_element_declaration_list structure_element_declaration ';' */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   664
// SYM_LIST(structure_element_declaration_list_c)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   665
// Not needed ???
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   666
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   667
/*  structure_element_name ':' *_spec_init */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   668
// SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
806
f218434eeaf8 Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 798
diff changeset
   669
// Not needed ???
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   670
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   671
/* helper symbol for structure_initialization */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   672
/* structure_initialization: '(' structure_element_initialization_list ')' */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   673
/* structure_element_initialization_list ',' structure_element_initialization */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   674
// SYM_LIST(structure_element_initialization_list_c)
1040
e8563dcaefca Start implementation of datatype checking of initial values for structures and FBs.
Mario de Sousa <msousa@fe.up.pt>
parents: 1029
diff changeset
   675
void *narrow_candidate_datatypes_c::visit(structure_element_initialization_list_c *symbol) {
1047
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   676
	symbol_c *type = NULL;
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   677
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   678
	 // first try to narrow with the correct type, if valid.
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   679
	if (!get_datatype_info_c::is_type_valid(type)) type = symbol->datatype;
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   680
	 // to reduce number of error messages, we try to narrow with parent's spec_init->datatype
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   681
	if (!get_datatype_info_c::is_type_valid(type)) type = symbol->parent->datatype;
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   682
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   683
	if (get_datatype_info_c::is_type_valid(type)) {
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   684
		// We need to iterate and determine the required datatype of each structure element
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   685
		// assume type is a FB type
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   686
		search_varfb_instance_type_c search_varfb_instance_type(type);
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   687
		// assume type is a STRUCT type
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   688
		structure_element_declaration_list_c *struct_decl = dynamic_cast<structure_element_declaration_list_c *>(type);
1040
e8563dcaefca Start implementation of datatype checking of initial values for structures and FBs.
Mario de Sousa <msousa@fe.up.pt>
parents: 1029
diff changeset
   689
		for (int k = 0; k < symbol->n; k++) {
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   690
			structure_element_initialization_c *struct_elem = (structure_element_initialization_c *)symbol->get_element(k);
1047
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   691
			symbol_c *type = NULL;
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   692
			if (struct_decl == NULL) {
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   693
				// type is not a struct. Must be a FB.
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   694
				type = search_varfb_instance_type.get_basetype_decl(struct_elem->structure_element_name);
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   695
			} else {
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   696
				// type is a struct.
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   697
				type = search_base_type_c::get_basetype_decl(struct_decl->find_element(struct_elem->structure_element_name));
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   698
			}
1040
e8563dcaefca Start implementation of datatype checking of initial values for structures and FBs.
Mario de Sousa <msousa@fe.up.pt>
parents: 1029
diff changeset
   699
			set_datatype(type, struct_elem);
e8563dcaefca Start implementation of datatype checking of initial values for structures and FBs.
Mario de Sousa <msousa@fe.up.pt>
parents: 1029
diff changeset
   700
			struct_elem->accept(*this);
1047
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   701
			/* We do best effort narrowing, even in the presence of errors, to reduce number of error messages
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   702
			 * so the following two assertions are not always met.
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   703
			 */
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   704
			// if (!get_datatype_info_c::is_type_valid(type)) ERROR;  
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   705
			// if (struct_elem->datatype == NULL) ERROR; // should never occur. Already checked in fill_candidate_datatypes_c
1040
e8563dcaefca Start implementation of datatype checking of initial values for structures and FBs.
Mario de Sousa <msousa@fe.up.pt>
parents: 1029
diff changeset
   706
		}
e8563dcaefca Start implementation of datatype checking of initial values for structures and FBs.
Mario de Sousa <msousa@fe.up.pt>
parents: 1029
diff changeset
   707
	}
e8563dcaefca Start implementation of datatype checking of initial values for structures and FBs.
Mario de Sousa <msousa@fe.up.pt>
parents: 1029
diff changeset
   708
	return NULL;
e8563dcaefca Start implementation of datatype checking of initial values for structures and FBs.
Mario de Sousa <msousa@fe.up.pt>
parents: 1029
diff changeset
   709
}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   710
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   711
/*  structure_element_name ASSIGN value */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   712
// SYM_REF2(structure_element_initialization_c, structure_element_name, value)
1047
34b733cb6641 Do datatype checking of initial values for structures and FBs, and print error messages when compiling erroneuos source code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1041
diff changeset
   713
void *narrow_candidate_datatypes_c::visit(structure_element_initialization_c *symbol) {set_datatype(symbol->datatype, symbol->value); symbol->value->accept(*this); return NULL;}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   714
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   715
/*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   716
// SYM_REF4(string_type_declaration_c, string_type_name, elementary_string_type_name, string_type_declaration_size, string_type_declaration_init/* may be == NULL! */) 
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   717
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   718
810
d9c48ad646f1 Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents: 808
diff changeset
   719
/* structure_type_name ASSIGN structure_initialization */
d9c48ad646f1 Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents: 808
diff changeset
   720
/* structure_initialization may be NULL ! */
d9c48ad646f1 Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents: 808
diff changeset
   721
// SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization)
d9c48ad646f1 Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents: 808
diff changeset
   722
void *narrow_candidate_datatypes_c::visit(fb_spec_init_c *symbol) {return narrow_spec_init(symbol, symbol->function_block_type_name, symbol->structure_initialization);}
726
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   723
9b61eb4f00dc Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents: 718
diff changeset
   724
909
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   725
/* REF_TO (non_generic_type_name | function_block_type_name) */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   726
// SYM_REF1(ref_spec_c, type_name)
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   727
void *narrow_candidate_datatypes_c::visit(ref_spec_c *symbol) {
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   728
	/* First handle the datatype being referenced (pointed to) */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   729
	if (symbol->type_name->candidate_datatypes.size() == 1) {
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   730
		symbol->type_name->datatype = symbol->type_name->candidate_datatypes[0];
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   731
		symbol->type_name->accept(*this);
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   732
	}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   733
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   734
	/* Now handle the reference datatype itself (i.e. the pointer) */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   735
	// If we are handling an anonymous datatype (i.e. a datatype implicitly declared inside a VAR ... END_VAR declaration)
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   736
	// then the symbol->datatype has not yet been set by the previous visit(type_decl) method, because it does not exist!
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   737
	// So we set the datatype ourselves!
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   738
	if ((NULL == symbol->datatype) && (symbol->candidate_datatypes.size() == 1))
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   739
		symbol->datatype = symbol->candidate_datatypes[0];
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   740
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   741
	return NULL;
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   742
}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   743
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   744
/* For the moment, we do not support initialising reference data types */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   745
/* ref_spec [ ASSIGN ref_initialization ] */ 
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   746
/* NOTE: ref_initialization may be NULL!! */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   747
// SYM_REF2(ref_spec_init_c, ref_spec, ref_initialization)
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   748
void *narrow_candidate_datatypes_c::visit(ref_spec_init_c *symbol) {return narrow_spec_init(symbol, symbol->ref_spec, symbol->ref_initialization);}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   749
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   750
/* identifier ':' ref_spec_init */
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   751
// SYM_REF2(ref_type_decl_c, ref_type_name, ref_spec_init)
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   752
void *narrow_candidate_datatypes_c::visit(ref_type_decl_c *symbol) {return narrow_type_decl(symbol, symbol->ref_type_name, symbol->ref_spec_init);}
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   753
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   754
8b2a31dea131 Add support for REF_TO derived datatypes (along with datatype verification)
mjsousa
parents: 895
diff changeset
   755
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   756
/*********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   757
/* B 1.4 - Variables */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   758
/*********************/
843
f9a059c24aea Fill in the 'datatype' anotation in the identifiers of symbolic variables.
mjsousa
parents: 839
diff changeset
   759
// SYM_REF1(symbolic_variable_c, var_name)
f9a059c24aea Fill in the 'datatype' anotation in the identifiers of symbolic variables.
mjsousa
parents: 839
diff changeset
   760
void *narrow_candidate_datatypes_c::visit(symbolic_variable_c *symbol) {
f9a059c24aea Fill in the 'datatype' anotation in the identifiers of symbolic variables.
mjsousa
parents: 839
diff changeset
   761
	symbol->var_name->datatype = symbol->datatype;
f9a059c24aea Fill in the 'datatype' anotation in the identifiers of symbolic variables.
mjsousa
parents: 839
diff changeset
   762
	return NULL;
f9a059c24aea Fill in the 'datatype' anotation in the identifiers of symbolic variables.
mjsousa
parents: 839
diff changeset
   763
}
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   764
/********************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   765
/* B 1.4.1 - Directly Represented Variables */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   766
/********************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   767
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   768
/*************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   769
/* B 1.4.2 - Multi-element variables */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   770
/*************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   771
/*  subscripted_variable '[' subscript_list ']' */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   772
// SYM_REF2(array_variable_c, subscripted_variable, subscript_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   773
void *narrow_candidate_datatypes_c::visit(array_variable_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   774
	/* we need to check the data types of the expressions used for the subscripts... */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   775
	symbol->subscript_list->accept(*this);
827
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   776
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   777
	/* Set the datatype of the subscripted variable and visit it recursively. For the reason why we do this,                                                 */
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   778
	/* Please read the comments in the array_variable_c and structured_variable_c visitors in the fill_candidate_datatypes.cc file! */
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   779
	if (symbol->subscripted_variable->candidate_datatypes.size() == 1)
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   780
	  symbol->subscripted_variable->datatype = symbol->subscripted_variable->candidate_datatypes[0]; // set the datatype
994
66dc2ef40e70 Fix bug introduced in 2014/10/19, while adding support for REF() opertors -> datatype checking was not catching datatype inconsistency errors!
mjsousa
parents: 945
diff changeset
   781
	symbol->subscripted_variable->accept(*this); // visit recursively
827
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   782
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   783
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   784
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   785
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   786
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   787
/* subscript_list ',' subscript */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   788
// SYM_LIST(subscript_list_c)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   789
void *narrow_candidate_datatypes_c::visit(subscript_list_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   790
	for (int i = 0; i < symbol->n; i++) {
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   791
		for (unsigned int k = 0; k < symbol->get_element(i)->candidate_datatypes.size(); k++) {
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   792
			if (get_datatype_info_c::is_ANY_INT(symbol->get_element(i)->candidate_datatypes[k]))
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   793
				symbol->get_element(i)->datatype = symbol->get_element(i)->candidate_datatypes[k];
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   794
		}
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   795
		symbol->get_element(i)->accept(*this);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   796
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   797
	return NULL;  
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   798
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   799
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   800
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   801
827
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   802
/*  record_variable '.' field_selector */
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   803
/*  WARNING: input and/or output variables of function blocks
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   804
 *           may be accessed as fields of a structured variable!
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   805
 *           Code handling a structured_variable_c must take
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   806
 *           this into account!
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   807
 */
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   808
// SYM_REF2(structured_variable_c, record_variable, field_selector)
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   809
void *narrow_candidate_datatypes_c::visit(structured_variable_c *symbol) {
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   810
	/* Set the datatype of the record_variable and visit it recursively. For the reason why we do this,                                                      */
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   811
	/* Please read the comments in the array_variable_c and structured_variable_c visitors in the fill_candidate_datatypes.cc file! */
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   812
	if (symbol->record_variable->candidate_datatypes.size() == 1)
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   813
	  symbol->record_variable->datatype = symbol->record_variable->candidate_datatypes[0]; // set the datatype
994
66dc2ef40e70 Fix bug introduced in 2014/10/19, while adding support for REF() opertors -> datatype checking was not catching datatype inconsistency errors!
mjsousa
parents: 945
diff changeset
   814
	symbol->record_variable->accept(*this); // visit recursively
827
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   815
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   816
	return NULL;
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   817
}
e3800aff352c Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents: 813
diff changeset
   818
502
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   819
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   820
/******************************************/
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   821
/* B 1.4.3 - Declaration & Initialisation */
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   822
/******************************************/
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   823
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   824
/* When handling the declaration of variables the fill/narrow algorithm will simply visit the objects
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   825
 * in the abstract syntax tree defining the desired datatype for the variables. Tis is to set the 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   826
 * symbol->datatype to the basetype of that datatype.
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   827
 *
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   828
 * Note that we do not currently set the symbol->datatype annotation for the identifier_c objects naming the 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   829
 * variables inside the variable declaration. However, this is liable to change in the future, so do not write
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   830
 * any code that depends on this!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   831
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   832
 * example:
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   833
 *    VAR  var1, var2, var3  :  my_type;  END_VAR
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   834
 *   (*    ^^^^  ^^^^  ^^^^                -> will NOT have the symbol->datatype set (for now, may change in the future!) *)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   835
 *   (*                         ^^^^^^^    -> WILL     have the symbol->datatype set *)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   836
 * 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   837
 * (remeber too that the identifier_c objects identifying variables inside ST/IL/SFC code *will* have their 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   838
 *  symbol->datatype annotation filled by the fill/narrow algorithm)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   839
 */
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   840
void *narrow_candidate_datatypes_c::narrow_var_declaration(symbol_c *type) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   841
  if (type->candidate_datatypes.size() == 1)
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   842
    type->datatype = type->candidate_datatypes[0];
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   843
  type->accept(*this); 
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   844
  return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   845
}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   846
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   847
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   848
void *narrow_candidate_datatypes_c::visit(var1_init_decl_c             *symbol) {return narrow_var_declaration(symbol->spec_init);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   849
void *narrow_candidate_datatypes_c::visit(array_var_init_decl_c        *symbol) {return narrow_var_declaration(symbol->array_spec_init);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   850
void *narrow_candidate_datatypes_c::visit(structured_var_init_decl_c   *symbol) {return narrow_var_declaration(symbol->initialized_structure);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   851
void *narrow_candidate_datatypes_c::visit(fb_name_decl_c               *symbol) {return narrow_var_declaration(symbol->fb_spec_init);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   852
void *narrow_candidate_datatypes_c::visit(array_var_declaration_c      *symbol) {return narrow_var_declaration(symbol->array_specification);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   853
void *narrow_candidate_datatypes_c::visit(structured_var_declaration_c *symbol) {return narrow_var_declaration(symbol->structure_type_name);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   854
void *narrow_candidate_datatypes_c::visit(external_declaration_c       *symbol) {return narrow_var_declaration(symbol->specification);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   855
void *narrow_candidate_datatypes_c::visit(global_var_decl_c            *symbol) {return narrow_var_declaration(symbol->type_specification);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   856
void *narrow_candidate_datatypes_c::visit(incompl_located_var_decl_c   *symbol) {return narrow_var_declaration(symbol->var_spec);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   857
//void *narrow_candidate_datatypes_c::visit(single_byte_string_var_declaration_c *symbol) {return handle_var_declaration(symbol->single_byte_string_spec);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   858
//void *narrow_candidate_datatypes_c::visit(double_byte_string_var_declaration_c *symbol) {return handle_var_declaration(symbol->double_byte_string_spec);}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   859
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   860
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   861
502
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   862
void *narrow_candidate_datatypes_c::visit(var1_list_c *symbol) {
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   863
#if 0   /* We don't really need to set the datatype of each variable. We just check the declaration itself! */
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   864
  for(int i = 0; i < symbol->n; i++) {
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   865
    if (symbol->get_element(i)->candidate_datatypes.size() == 1)
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
   866
      symbol->get_element(i)->datatype = symbol->get_element(i)->candidate_datatypes[0];
502
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   867
  }
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   868
#endif
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   869
  return NULL;
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   870
}  
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   871
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   872
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   873
/*  AT direct_variable */
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   874
// SYM_REF1(location_c, direct_variable)
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   875
void *narrow_candidate_datatypes_c::visit(location_c *symbol) {
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   876
  set_datatype(symbol->datatype, symbol->direct_variable);
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   877
  symbol->direct_variable->accept(*this); /* currently does nothing! */
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   878
  return NULL;
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   879
}
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   880
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   881
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   882
/*  [variable_name] location ':' located_var_spec_init */
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   883
/* variable_name -> may be NULL ! */
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   884
// SYM_REF3(located_var_decl_c, variable_name, location, located_var_spec_init)
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   885
void *narrow_candidate_datatypes_c::visit(located_var_decl_c *symbol) {
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   886
  /* let the var_spec_init set its own symbol->datatype value */
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   887
  symbol->located_var_spec_init->accept(*this);
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   888
  
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   889
  if (NULL != symbol->variable_name)
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   890
    set_datatype(symbol->located_var_spec_init->datatype, symbol->variable_name);
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   891
    
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   892
  set_datatype(symbol->located_var_spec_init->datatype, symbol->location);
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   893
  symbol->location->accept(*this);
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   894
  return NULL;
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   895
}
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   896
a6211f73690b Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents: 490
diff changeset
   897
808
7a6b53d61ea3 Consider fb_name_decl_c a non base data type class!
Mario de Sousa <msousa@fe.up.pt>
parents: 807
diff changeset
   898
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   899
/************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   900
/* B 1.5 Program organization units */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   901
/************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   902
/*********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   903
/* B 1.5.1 Functions */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   904
/*********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   905
void *narrow_candidate_datatypes_c::visit(function_declaration_c *symbol) {
798
d21e598b0b75 Set the symbol->datatpe of function_declaration_c
Mario de Sousa <msousa@fe.up.pt>
parents: 797
diff changeset
   906
	/* set the function_declaration_c->datatype to the datatype returned by the function! */
d21e598b0b75 Set the symbol->datatpe of function_declaration_c
Mario de Sousa <msousa@fe.up.pt>
parents: 797
diff changeset
   907
	symbol->type_name->datatype = search_base_type_c::get_basetype_decl(symbol->type_name);
d21e598b0b75 Set the symbol->datatpe of function_declaration_c
Mario de Sousa <msousa@fe.up.pt>
parents: 797
diff changeset
   908
	symbol->datatype = symbol->type_name->datatype;
d21e598b0b75 Set the symbol->datatpe of function_declaration_c
Mario de Sousa <msousa@fe.up.pt>
parents: 797
diff changeset
   909
	
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   910
	search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   911
	symbol->var_declarations_list->accept(*this);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   912
	if (debug) printf("Narrowing candidate data types list in body of function %s\n", ((token_c *)(symbol->derived_function_name))->value);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   913
	symbol->function_body->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   914
	delete search_varfb_instance_type;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   915
	search_varfb_instance_type = NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   916
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   917
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   918
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   919
/***************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   920
/* B 1.5.2 Function blocks */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   921
/***************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   922
void *narrow_candidate_datatypes_c::visit(function_block_declaration_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   923
	search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   924
	symbol->var_declarations->accept(*this);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   925
	if (debug) printf("Narrowing candidate data types list in body of FB %s\n", ((token_c *)(symbol->fblock_name))->value);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   926
	symbol->fblock_body->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   927
	delete search_varfb_instance_type;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   928
	search_varfb_instance_type = NULL;
889
5f380b99e95e Correctly handle structured variables that include FB and external FBs (example: FB1.FB2.extFB3.FB4.extFB5.extFB6.structvar.field1 := 42;) (this commit fixes only ST code. TODO: IL and SFC)
mjsousa
parents: 873
diff changeset
   929
807
4d71292f8732 Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 806
diff changeset
   930
	// A FB declaration can also be used as a Datatype! We now do the narrow algorithm considering it as such!
4d71292f8732 Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 806
diff changeset
   931
	if (symbol->candidate_datatypes.size() == 1)
4d71292f8732 Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents: 806
diff changeset
   932
		symbol->datatype = symbol->candidate_datatypes[0];
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   933
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   934
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   935
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   936
/********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   937
/* B 1.5.3 Programs */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   938
/********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   939
void *narrow_candidate_datatypes_c::visit(program_declaration_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   940
	search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
   941
	symbol->var_declarations->accept(*this);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   942
	if (debug) printf("Narrowing candidate data types list in body of program %s\n", ((token_c *)(symbol->program_type_name))->value);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   943
	symbol->function_block_body->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   944
	delete search_varfb_instance_type;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   945
	search_varfb_instance_type = NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   946
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   947
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   948
802
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   949
/********************************************/
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   950
/* B 1.6 Sequential function chart elements */
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   951
/********************************************/
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   952
void *narrow_candidate_datatypes_c::visit(transition_condition_c *symbol) {
895
f824bf8e1579 Add error message for invalid datatype of transition condition. Generalize datatype narrowing algorithm for transition conditions.
mjsousa
parents: 889
diff changeset
   953
	// We can safely ask for a BOOL type, as even if the result is a SAFEBOOL, in that case it will aslo include BOOL as a possible datatype.
f824bf8e1579 Add error message for invalid datatype of transition condition. Generalize datatype narrowing algorithm for transition conditions.
mjsousa
parents: 889
diff changeset
   954
	set_datatype(&get_datatype_info_c::bool_type_name /* datatype*/, symbol /* symbol */);
f824bf8e1579 Add error message for invalid datatype of transition condition. Generalize datatype narrowing algorithm for transition conditions.
mjsousa
parents: 889
diff changeset
   955
802
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   956
	if (symbol->transition_condition_il != NULL) {
895
f824bf8e1579 Add error message for invalid datatype of transition condition. Generalize datatype narrowing algorithm for transition conditions.
mjsousa
parents: 889
diff changeset
   957
		set_datatype(symbol->datatype, symbol->transition_condition_il);
802
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   958
		symbol->transition_condition_il->accept(*this);
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   959
	}
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   960
	if (symbol->transition_condition_st != NULL) {
895
f824bf8e1579 Add error message for invalid datatype of transition condition. Generalize datatype narrowing algorithm for transition conditions.
mjsousa
parents: 889
diff changeset
   961
		set_datatype(symbol->datatype, symbol->transition_condition_st);
802
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   962
		symbol->transition_condition_st->accept(*this);
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   963
	}
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   964
	return NULL;
cac262d1d6a5 Fixed bug with SFC transition datatype checking
Laurent Bessard
parents: 798
diff changeset
   965
}
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   966
1028
7c8709ce6b8f Correcty determine the datatype (TIME) of the parameters of SFC actions with timed qualifiers
mjsousa
parents: 996
diff changeset
   967
7c8709ce6b8f Correcty determine the datatype (TIME) of the parameters of SFC actions with timed qualifiers
mjsousa
parents: 996
diff changeset
   968
void *narrow_candidate_datatypes_c::visit(action_qualifier_c *symbol) {
1029
37145f381bb0 Fix segmentation fault bug introduced by previous commit
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1028
diff changeset
   969
	if (symbol->action_time) {
37145f381bb0 Fix segmentation fault bug introduced by previous commit
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1028
diff changeset
   970
		for(unsigned int i = 0; i < symbol->action_time->candidate_datatypes.size(); i++) {
37145f381bb0 Fix segmentation fault bug introduced by previous commit
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1028
diff changeset
   971
			if (get_datatype_info_c::is_TIME_compatible(symbol->action_time->candidate_datatypes[i]))
37145f381bb0 Fix segmentation fault bug introduced by previous commit
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1028
diff changeset
   972
				symbol->action_time->datatype = symbol->action_time->candidate_datatypes[i];
37145f381bb0 Fix segmentation fault bug introduced by previous commit
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1028
diff changeset
   973
		}
37145f381bb0 Fix segmentation fault bug introduced by previous commit
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1028
diff changeset
   974
		symbol->action_time->accept(*this);
37145f381bb0 Fix segmentation fault bug introduced by previous commit
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1028
diff changeset
   975
	}
1028
7c8709ce6b8f Correcty determine the datatype (TIME) of the parameters of SFC actions with timed qualifiers
mjsousa
parents: 996
diff changeset
   976
	symbol->action_qualifier->accept(*this); // Not really necessary for now...
7c8709ce6b8f Correcty determine the datatype (TIME) of the parameters of SFC actions with timed qualifiers
mjsousa
parents: 996
diff changeset
   977
	return NULL;
7c8709ce6b8f Correcty determine the datatype (TIME) of the parameters of SFC actions with timed qualifiers
mjsousa
parents: 996
diff changeset
   978
}
7c8709ce6b8f Correcty determine the datatype (TIME) of the parameters of SFC actions with timed qualifiers
mjsousa
parents: 996
diff changeset
   979
    
7c8709ce6b8f Correcty determine the datatype (TIME) of the parameters of SFC actions with timed qualifiers
mjsousa
parents: 996
diff changeset
   980
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   981
/********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   982
/* B 1.7 Configuration elements */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   983
/********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
   984
void *narrow_candidate_datatypes_c::visit(configuration_declaration_c *symbol) {
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   985
	if (debug) printf("Narrowing candidate data types list in configuration %s\n", ((token_c *)(symbol->configuration_name))->value);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   986
	search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   987
	symbol->global_var_declarations->accept(*this);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   988
	symbol->resource_declarations            ->accept(*this); // points to a single_resource_declaration_c or a resource_declaration_list_c
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   989
//	symbol->access_declarations              ->accept(*this); // TODO
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   990
//	symbol->instance_specific_initializations->accept(*this); // TODO
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   991
	delete search_varfb_instance_type;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   992
	search_varfb_instance_type = NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   993
	return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   994
}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   995
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   996
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   997
void *narrow_candidate_datatypes_c::visit(resource_declaration_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   998
	if (debug) printf("Narrowing candidate data types list in resource %s\n", ((token_c *)(symbol->resource_name))->value);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
   999
	search_varfb_instance_type_c *prev_search_varfb_instance_type = search_varfb_instance_type;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1000
	search_varfb_instance_type  =  new search_varfb_instance_type_c(symbol);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1001
	symbol->global_var_declarations->accept(*this);
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1002
	symbol->resource_declaration   ->accept(*this);  // points to a single_resource_declaration_c!
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1003
	delete search_varfb_instance_type;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1004
	search_varfb_instance_type = prev_search_varfb_instance_type;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1005
	return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1006
}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1007
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1008
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1009
void *narrow_candidate_datatypes_c::visit(single_resource_declaration_c *symbol) {
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1010
//	symbol->task_configuration_list    ->accept(*this);  // TODO
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1011
//	symbol->program_configuration_list ->accept(*this);  // TODO
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1012
	return NULL;
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1013
}
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 940
diff changeset
  1014
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1015
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1016
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1017
/****************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1018
/* B.2 - Language IL (Instruction List) */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1019
/****************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1020
/***********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1021
/* B 2.1 Instructions and Operands */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1022
/***********************************/
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1023
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1024
/*| instruction_list il_instruction */
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1025
// SYM_LIST(instruction_list_c)
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1026
void *narrow_candidate_datatypes_c::visit(instruction_list_c *symbol) {
450
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
  1027
	/* In order to execute the narrow algoritm correctly, we need to go through the instructions backwards,
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
  1028
	 * so we can not use the base class' visitor 
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
  1029
	 */
466
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1030
	/* In order to execute the narrow algoritm correctly
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1031
	 * in IL instruction lists containing JMPs to labels that come before the JMP instruction
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1032
	 * itself, we need to run the narrow algorithm twice on the Instruction List.
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1033
	 * e.g.:  ...
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1034
	 *          ld 23
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1035
	 *   label1:st byte_var
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1036
	 *          ld 34
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1037
	 *          JMP label1     
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1038
	 *
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1039
	 * Note that the second time we run the narrow, most of the datatypes are already filled
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1040
	 * in, so it will be able to produce tha correct datatypes for the IL instruction referenced
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1041
	 * by the label, as in the 2nd pass we already know the datatypes of the JMP instruction!
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1042
	 */
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1043
	for(int j = 0; j < 2; j++) {
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1044
		for(int i = symbol->n-1; i >= 0; i--) {
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1045
			symbol->get_element(i)->accept(*this);
466
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1046
		}
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1047
	}
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1048
	return NULL;
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1049
}
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1050
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1051
/* | label ':' [il_incomplete_instruction] eol_list */
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1052
// SYM_REF2(il_instruction_c, label, il_instruction)
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1053
// void *visit(instruction_list_c *symbol);
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1054
void *narrow_candidate_datatypes_c::visit(il_instruction_c *symbol) {
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
  1055
	if (NULL == symbol->il_instruction) {
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
  1056
		/* this empty/null il_instruction cannot generate the desired datatype. We pass on the request to the previous il instruction. */
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1057
		set_datatype_in_prev_il_instructions(symbol->datatype, symbol);
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
  1058
	} else {
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1059
		il_instruction_c tmp_prev_il_instruction(NULL, NULL);
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1060
		/* the narrow algorithm will need access to the intersected candidate_datatype lists of all prev_il_instructions, as well as the 
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1061
		 * list of the prev_il_instructions.
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1062
		 * Instead of creating two 'global' (within the class) variables, we create a single il_instruction_c variable (fake_prev_il_instruction),
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1063
		 * and shove that data into this single variable.
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1064
		 */
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1065
		tmp_prev_il_instruction.prev_il_instruction = symbol->prev_il_instruction;
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1066
		intersect_prev_candidate_datatype_lists(&tmp_prev_il_instruction);
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
  1067
		/* Tell the il_instruction the datatype that it must generate - this was chosen by the next il_instruction (remember: we are iterating backwards!) */
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1068
		fake_prev_il_instruction = &tmp_prev_il_instruction;
674
b221168a36f1 Set datatype of il_intruction_c objects containing an ST operator.
Mario de Sousa <msousa@fe.up.pt>
parents: 673
diff changeset
  1069
		current_il_instruction   = symbol;
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1070
		symbol->il_instruction->datatype = symbol->datatype;
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
  1071
		symbol->il_instruction->accept(*this);
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1072
		fake_prev_il_instruction = NULL;
674
b221168a36f1 Set datatype of il_intruction_c objects containing an ST operator.
Mario de Sousa <msousa@fe.up.pt>
parents: 673
diff changeset
  1073
		current_il_instruction   = NULL;
450
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
  1074
	}
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
  1075
	return NULL;
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
  1076
}
444
92d40d2a7adc Update comments on general architecture.
Mario de Sousa <msousa@fe.up.pt>
parents: 443
diff changeset
  1077
92d40d2a7adc Update comments on general architecture.
Mario de Sousa <msousa@fe.up.pt>
parents: 443
diff changeset
  1078
92d40d2a7adc Update comments on general architecture.
Mario de Sousa <msousa@fe.up.pt>
parents: 443
diff changeset
  1079
92d40d2a7adc Update comments on general architecture.
Mario de Sousa <msousa@fe.up.pt>
parents: 443
diff changeset
  1080
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1081
// void *visit(instruction_list_c *symbol);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1082
void *narrow_candidate_datatypes_c::visit(il_simple_operation_c *symbol) {
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1083
	/* Tell the il_simple_operator the datatype that it must generate - this was chosen by the next il_instruction (we iterate backwards!) */
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1084
	symbol->il_simple_operator->datatype = symbol->datatype;
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1085
	/* recursive call to see whether data types are compatible */
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1086
	il_operand = symbol->il_operand;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1087
	symbol->il_simple_operator->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1088
	il_operand = NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1089
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1090
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1091
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1092
/* | function_name [il_operand_list] */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1093
/* NOTE: The parameters 'called_function_declaration' and 'extensible_param_count' are used to pass data between the stage 3 and stage 4. */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1094
// SYM_REF2(il_function_call_c, function_name, il_operand_list, symbol_c *called_function_declaration; int extensible_param_count;)
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1095
void *narrow_candidate_datatypes_c::visit(il_function_call_c *symbol) {
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1096
	/* The first parameter of a non formal function call in IL will be the 'current value' (i.e. the prev_il_instruction)
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1097
	 * In order to be able to handle this without coding special cases, we will simply prepend that symbol
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1098
	 * to the il_operand_list, and remove it after calling handle_function_call().
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1099
	 * However, since handle_function_call() will be recursively calling all parameter, and we don't want
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1100
	 * to do that for the prev_il_instruction (since it has already been visited by the fill_candidate_datatypes_c)
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1101
	 * we create a new ____ symbol_c ____ object, and copy the relevant info to/from that object before/after
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1102
	 * the call to handle_function_call().
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1103
	 *
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1104
	 * However, if no further paramters are given, then il_operand_list will be NULL, and we will
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1105
	 * need to create a new object to hold the pointer to prev_il_instruction.
534
d13a38011af4 Fix comment.
Mario de Sousa <msousa@fe.up.pt>
parents: 515
diff changeset
  1106
	 * This change will also be undone at the end of this method.
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1107
	 */
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1108
	symbol_c param_value = *fake_prev_il_instruction; /* copy the candidate_datatypes list */
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1109
	if (NULL == symbol->il_operand_list)  symbol->il_operand_list = new il_operand_list_c;
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1110
	if (NULL == symbol->il_operand_list)  ERROR;
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1111
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1112
	((list_c *)symbol->il_operand_list)->insert_element(&param_value, 0);
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1113
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1114
	generic_function_call_t fcall_param = {
441
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1115
		/* fcall_param.function_name               = */ symbol->function_name,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1116
		/* fcall_param.nonformal_operand_list      = */ symbol->il_operand_list,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1117
		/* fcall_param.formal_operand_list         = */ NULL,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1118
		/* enum {POU_FB, POU_function} POU_type    = */ generic_function_call_t::POU_function,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1119
		/* fcall_param.candidate_functions         = */ symbol->candidate_functions,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1120
		/* fcall_param.called_function_declaration = */ symbol->called_function_declaration,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1121
		/* fcall_param.extensible_param_count      = */ symbol->extensible_param_count
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1122
	};
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1123
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1124
	narrow_function_invocation(symbol, fcall_param);
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1125
	set_datatype_in_prev_il_instructions(param_value.datatype, fake_prev_il_instruction);
451
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1126
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1127
	/* Undo the changes to the abstract syntax tree we made above... */
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1128
	((list_c *)symbol->il_operand_list)->remove_element(0);
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1129
	if (((list_c *)symbol->il_operand_list)->n == 0) {
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1130
		/* if the list becomes empty, then that means that it did not exist before we made these changes, so we delete it! */
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1131
		delete 	symbol->il_operand_list;
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1132
		symbol->il_operand_list = NULL;
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1133
	}
a1b87eb155e4 Cleaning up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 450
diff changeset
  1134
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1135
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1136
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1137
452
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1138
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1139
/* | il_expr_operator '(' [il_operand] eol_list [simple_instr_list] ')' */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1140
// SYM_REF3(il_expression_c, il_expr_operator, il_operand, simple_instr_list);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1141
void *narrow_candidate_datatypes_c::visit(il_expression_c *symbol) {
453
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1142
  /* first handle the operation (il_expr_operator) that will use the result coming from the parenthesised IL list (i.e. simple_instr_list) */
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1143
  symbol->il_expr_operator->datatype = symbol->datatype;
454
099aa5d655de Finish support for semantic verification of IL paranthesised expressions.
Mario de Sousa <msousa@fe.up.pt>
parents: 453
diff changeset
  1144
  il_operand = symbol->simple_instr_list; /* This is not a bug! The parenthesised expression will be used as the operator! */
453
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1145
  symbol->il_expr_operator->accept(*this);
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1146
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1147
  /* now give the parenthesised IL list a chance to narrow the datatypes */
454
099aa5d655de Finish support for semantic verification of IL paranthesised expressions.
Mario de Sousa <msousa@fe.up.pt>
parents: 453
diff changeset
  1148
  /* The datatype that is must return was set by the call symbol->il_expr_operator->accept(*this) */
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1149
  il_instruction_c *save_fake_prev_il_instruction = fake_prev_il_instruction; /*this is not really necessary, but lets play it safe */
452
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1150
  symbol->simple_instr_list->accept(*this);
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1151
  fake_prev_il_instruction = save_fake_prev_il_instruction;
690
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1152
  
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1153
  /* Since stage2 will insert an artificial (and equivalent) LD <il_operand> to the simple_instr_list when an 'il_operand' exists, we know
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1154
   * that if (symbol->il_operand != NULL), then the first IL instruction in the simple_instr_list will be the equivalent and artificial
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1155
   * 'LD <il_operand>' IL instruction.
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1156
   * Just to be consistent, we will copy the datatype info back into the il_operand, even though this should not be necessary!
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1157
   */
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1158
  if ((NULL != symbol->il_operand) && ((NULL == symbol->simple_instr_list) || (0 == ((list_c *)symbol->simple_instr_list)->n))) ERROR; // stage2 is not behaving as we expect it to!
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1159
  if  (NULL != symbol->il_operand)
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1160
    symbol->il_operand->datatype = ((list_c *)symbol->simple_instr_list)->get_element(0)->datatype;
690
6156ee2b4e32 Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents: 676
diff changeset
  1161
  
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1162
  return NULL;
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1163
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1164
456
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1165
466
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1166
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1167
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1168
/*  il_jump_operator label */
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1169
void *narrow_candidate_datatypes_c::visit(il_jump_operation_c *symbol) {
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1170
  /* recursive call to fill the datatype */
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1171
  symbol->il_jump_operator->datatype = symbol->datatype;
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1172
  symbol->il_jump_operator->accept(*this);
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1173
  return NULL;
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1174
}
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1175
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1176
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1177
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1178
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1179
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1180
d97a29b7fa8b Narrow IL lists twice, in order to handle JMP to labels before the JMP itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 461
diff changeset
  1181
439
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1182
/*   il_call_operator prev_declared_fb_name
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1183
 * | il_call_operator prev_declared_fb_name '(' ')'
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1184
 * | il_call_operator prev_declared_fb_name '(' eol_list ')'
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1185
 * | il_call_operator prev_declared_fb_name '(' il_operand_list ')'
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1186
 * | il_call_operator prev_declared_fb_name '(' eol_list il_param_list ')'
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1187
 */
834
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
  1188
/* NOTE: The parameter 'called_fb_declaration'is used to pass data between stage 3 and stage4 */
439
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1189
// SYM_REF4(il_fb_call_c, il_call_operator, fb_name, il_operand_list, il_param_list, symbol_c *called_fb_declaration)
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1190
void *narrow_candidate_datatypes_c::visit(il_fb_call_c *symbol) {
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
  1191
	symbol_c *fb_decl = symbol->called_fb_declaration;
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
  1192
	
439
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1193
	/* Although a call to a non-declared FB is a semantic error, this is currently caught by stage 2! */
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1194
	if (NULL == fb_decl) ERROR;
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1195
	if (NULL != symbol->il_operand_list)  narrow_nonformal_call(symbol, fb_decl);
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1196
	if (NULL != symbol->  il_param_list)     narrow_formal_call(symbol, fb_decl);
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1197
455
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
  1198
	/* Let the il_call_operator (CAL, CALC, or CALCN) set the datatype of prev_il_instruction... */
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
  1199
	symbol->il_call_operator->datatype = symbol->datatype;
933c0dccc82f Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents: 454
diff changeset
  1200
	symbol->il_call_operator->accept(*this);
439
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1201
	return NULL;
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1202
}
cf7d6862033d Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents: 438
diff changeset
  1203
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1204
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1205
/* | function_name '(' eol_list [il_param_list] ')' */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1206
/* NOTE: The parameter 'called_function_declaration' is used to pass data between the stage 3 and stage 4. */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1207
// SYM_REF2(il_formal_funct_call_c, function_name, il_param_list, symbol_c *called_function_declaration; int extensible_param_count;)
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1208
void *narrow_candidate_datatypes_c::visit(il_formal_funct_call_c *symbol) {
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1209
	generic_function_call_t fcall_param = {
441
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1210
		/* fcall_param.function_name               = */ symbol->function_name,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1211
		/* fcall_param.nonformal_operand_list      = */ NULL,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1212
		/* fcall_param.formal_operand_list         = */ symbol->il_param_list,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1213
		/* enum {POU_FB, POU_function} POU_type    = */ generic_function_call_t::POU_function,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1214
		/* fcall_param.candidate_functions         = */ symbol->candidate_functions,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1215
		/* fcall_param.called_function_declaration = */ symbol->called_function_declaration,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1216
		/* fcall_param.extensible_param_count      = */ symbol->extensible_param_count
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1217
	};
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1218
  
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1219
	narrow_function_invocation(symbol, fcall_param);
450
eb1b28acec2e Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 448
diff changeset
  1220
	/* The desired datatype of the previous il instruction was already set by narrow_function_invocation() */
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1221
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1222
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1223
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1224
452
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1225
//     void *visit(il_operand_list_c *symbol);
453
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1226
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1227
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1228
/* | simple_instr_list il_simple_instruction */
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1229
/* This object is referenced by il_expression_c objects */
452
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1230
void *narrow_candidate_datatypes_c::visit(simple_instr_list_c *symbol) {
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1231
	if (symbol->n > 0)
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1232
		symbol->get_element(symbol->n - 1)->datatype = symbol->datatype;
452
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1233
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1234
	for(int i = symbol->n-1; i >= 0; i--) {
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1235
		symbol->get_element(i)->accept(*this);
452
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1236
	}
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1237
	return NULL;
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1238
}
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1239
453
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1240
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1241
// SYM_REF1(il_simple_instruction_c, il_simple_instruction, symbol_c *prev_il_instruction;)
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1242
void *narrow_candidate_datatypes_c::visit(il_simple_instruction_c *symbol)	{
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1243
  if (symbol->prev_il_instruction.size() > 1) ERROR; /* There should be no labeled insructions inside an IL expression! */
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1244
    
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1245
  il_instruction_c tmp_prev_il_instruction(NULL, NULL);
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1246
  /* the narrow algorithm will need access to the intersected candidate_datatype lists of all prev_il_instructions, as well as the 
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1247
   * list of the prev_il_instructions.
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1248
   * Instead of creating two 'global' (within the class) variables, we create a single il_instruction_c variable (fake_prev_il_instruction),
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1249
   * and shove that data into this single variable.
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1250
   */
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1251
  if (symbol->prev_il_instruction.size() > 0)
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1252
    tmp_prev_il_instruction.candidate_datatypes = symbol->prev_il_instruction[0]->candidate_datatypes;
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1253
  tmp_prev_il_instruction.prev_il_instruction = symbol->prev_il_instruction;
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1254
  
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1255
   /* copy the candidate_datatypes list */
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1256
  fake_prev_il_instruction = &tmp_prev_il_instruction;
453
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1257
  symbol->il_simple_instruction->datatype = symbol->datatype;
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1258
  symbol->il_simple_instruction->accept(*this);
459
01f6664bf8c5 Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents: 457
diff changeset
  1259
  fake_prev_il_instruction = NULL;
453
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1260
  return NULL;
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1261
}
4733f662362a More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents: 452
diff changeset
  1262
452
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1263
//     void *visit(il_param_list_c *symbol);
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1264
//     void *visit(il_param_assignment_c *symbol);
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1265
//     void *visit(il_param_out_assignment_c *symbol);
79ac274d1cc4 Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents: 451
diff changeset
  1266
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1267
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1268
/*******************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1269
/* B 2.2 Operators */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1270
/*******************/
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1271
/* Sets the datatype of the il_operand, and calls it recursively!
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1272
 * 
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1273
 * NOTE 1: the il_operand __may__ be pointing to a parenthesized list of IL instructions. 
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1274
 * e.g.  LD 33
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1275
 *       AND ( 45
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1276
 *            OR 56
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1277
 *            )
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1278
 *       When we handle the first 'AND' IL_operator, the il_operand will point to an simple_instr_list_c.
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1279
 *       In this case, when we call il_operand->accept(*this);, the prev_il_instruction pointer will be overwritten!
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1280
 *
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1281
 *       So, if yoy wish to set the prev_il_instruction->datatype = symbol->datatype;
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1282
 *       do it __before__ calling set_il_operand_datatype() (which in turn calls il_operand->accept(*this)) !!
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1283
 */
1054
57c08195c962 Fix bug in datatype narrowing algorithm affecting IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 1047
diff changeset
  1284
int  count = 0;
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1285
void *narrow_candidate_datatypes_c::set_il_operand_datatype(symbol_c *il_operand, symbol_c *datatype) {
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1286
	if (NULL == il_operand) return NULL; /* if no IL operand => error in the source code!! */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1287
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1288
	/* If il_operand already has a non-NULL datatype (remember, narrow algorithm runs twice over IL lists!),
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1289
	 * but narrow algorithm has not yet been able to determine what datatype it should take? This is strange,
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1290
	 * and most probably an error!
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1291
	 */
838
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1292
	if ((NULL != il_operand->datatype) && (NULL == datatype)) ERROR;
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1293
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1294
	/* If the il_operand's datatype has already been set previously, and
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1295
	 * the narrow algorithm has already determined the datatype the il_operand should take!
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1296
	 *   ...we just make sure that the new datatype is the same as the current il_operand's datatype
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1297
	 */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1298
	if ((NULL != il_operand->datatype)  && (NULL != datatype)) {
838
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1299
		/* Both datatypes are an invalid_type_name_c. This implies they are the same!! */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1300
		if ((!get_datatype_info_c::is_type_valid(datatype)) && ((!get_datatype_info_c::is_type_valid(il_operand->datatype)))) 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1301
			return NULL;;
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1302
		/* OK, so both the datatypes are valid, but are they equal? */
838
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1303
		if ( !get_datatype_info_c::is_type_equal(il_operand->datatype, datatype)) 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1304
			ERROR; 
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1305
		/* The datatypes are the same. We have nothing to do, so we simply return! */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1306
		return NULL;
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1307
	}
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1308
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1309
	/* Set the il_operand's datatype. Note that the new 'datatype' may even be NULL!!! */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1310
	il_operand->datatype = datatype;
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1311
	/* Even if we are not able to determine the il_operand's datatype ('datatype' is NULL), we still visit it recursively,
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1312
	 * to give a chance of any complex expressions embedded in the il_operand (e.g. expressions inside array subscripts!) 
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1313
	 * to be narrowed too.
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1314
	 */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1315
	il_operand->accept(*this);
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1316
	return NULL;
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1317
}
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1318
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1319
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1320
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1321
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1322
void *narrow_candidate_datatypes_c::narrow_binary_operator(const struct widen_entry widen_table[], symbol_c *symbol, bool *deprecated_operation) {
478
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1323
	symbol_c *prev_instruction_type, *operand_type;
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1324
	int count = 0;
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1325
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1326
        if (NULL != deprecated_operation)
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1327
		*deprecated_operation = false;
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1328
834
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
  1329
	if (NULL == il_operand) return NULL; /* if no IL operand => error in the source code!! */
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
  1330
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
  1331
	 /* NOTE 1: the il_operand __may__ be pointing to a parenthesized list of IL instructions. 
478
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1332
	 * e.g.  LD 33
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1333
	 *       AND ( 45
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1334
	 *            OR 56
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1335
	 *            )
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1336
	 *       When we handle the first 'AND' IL_operator, the il_operand will point to an simple_instr_list_c.
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1337
	 *       In this case, when we call il_operand->accept(*this);, the prev_il_instruction pointer will be overwritten!
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1338
	 *
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1339
	 *       We must therefore set the prev_il_instruction->datatype = symbol->datatype;
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1340
	 *       __before__ calling il_operand->accept(*this) !!
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1341
	 *
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1342
	 * NOTE 2: We do not need to call prev_il_instruction->accept(*this), as the object to which prev_il_instruction
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1343
	 *         is pointing to will be later narrowed by the call from the for() loop of the instruction_list_c
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1344
	 *         (or simple_instr_list_c), which iterates backwards.
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1345
	 */
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1346
	if (NULL != symbol->datatype) { // next IL instructions were able to determine the datatype this instruction should produce
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1347
		for(unsigned int i = 0; i < fake_prev_il_instruction->candidate_datatypes.size(); i++) {
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1348
			for(unsigned int j = 0; j < il_operand->candidate_datatypes.size(); j++) {
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1349
				prev_instruction_type = fake_prev_il_instruction->candidate_datatypes[i];
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1350
				operand_type = il_operand->candidate_datatypes[j];
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1351
				if (is_widening_compatible(widen_table, prev_instruction_type, operand_type, symbol->datatype, deprecated_operation)) {
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1352
					/* set the desired datatype of the previous il instruction */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1353
					set_datatype_in_prev_il_instructions(prev_instruction_type, fake_prev_il_instruction);
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1354
					/* set the datatype for the operand */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1355
					set_il_operand_datatype(il_operand, operand_type);
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1356
					
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1357
					/* NOTE: DO NOT search any further! Return immediately!
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1358
					 * Since we support SAFE*** datatypes, multiple entries in the widen_table may be compatible.
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1359
					 * If we try to set more than one distinct datatype on the same symbol, then the datatype will be set to
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1360
					 * an invalid_datatype, which is NOT what we want!
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1361
					 */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1362
					return NULL;
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1363
				}
478
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1364
			}
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1365
		}
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1366
	}
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1367
	/* We were not able to determine the required datatype, but we still give the il_operand a chance to be narrowed! */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1368
	set_il_operand_datatype(il_operand, NULL);
478
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1369
	return NULL;
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1370
}
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1371
b13feab3b918 Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents: 472
diff changeset
  1372
443
ff4d26b7e51d Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents: 441
diff changeset
  1373
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1374
838
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1375
/* Narrow IL operators whose execution is conditional on the boolean value in the accumulator.
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1376
 * Basically, narrow the JMPC, JMPCN, RETC, RETCN, CALC, and CALCN operators!
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1377
 * Also does part of the S and R operator narrowing!!!
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1378
 */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1379
void *narrow_candidate_datatypes_c::narrow_conditional_operator(symbol_c *symbol) {
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1380
	/* if the next IL instructions needs us to provide a datatype other than a BOOL or a SAFEBOOL, 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1381
	 * then we have an internal compiler error - most likely in fill_candidate_datatypes_c 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1382
	 */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1383
	// I (mario) am confident the fill/narrow algorithms are working correctly, so for now we can disable the assertions!
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1384
	//if ((NULL != symbol->datatype) && (!get_datatype_info_c::is_BOOL_compatible(symbol->datatype))) ERROR;
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1385
	//if (symbol->candidate_datatypes.size() > 2) ERROR; /* may contain, at most, a BOOL and a SAFEBOOL */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1386
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1387
	/* NOTE: If there is no IL instruction following this S, R, CALC, CALCN, JMPC, JMPCN, RETC, or RETCN instruction,
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1388
	 *       we must still provide a bool_type_name_c datatype (if possible, i.e. if it exists in the candidate datatype list).
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1389
	 *       If it is not possible, we set it to NULL
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1390
	 * 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1391
	 * NOTE: Note that this algorithm we are implementing is slightly wrong. 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1392
	 *        (a) It ignores that a SAFEBOOL may be needed instead of a BOOL datatype. 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1393
	 *        (b) It also ignores that this method gets to be called twice on the same 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1394
	 *            object (the narrow algorithm runs through the IL list twice in order to
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1395
	 *            handle forward JMPs), so the assumption that we must immediately set our
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1396
	 *            own datatype if we get called with a NULL symbol->datatype is incorrect 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1397
	 *           (it may be that the second time it is called it will be with the correct datatype!).
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1398
	 * 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1399
	 *       These two issues (a) and (b) together means that we should only really be setting our own
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1400
	 *       datatype if we are certain that the following IL instructions will never set it for us
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1401
	 *       - basically if the following IL instruction is a LD, or a JMP to a LD, or a JMP to a JMP to a LD,
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1402
	 *        etc..., or a conditional JMP whose both branches go to LD, etc...!!!
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1403
	 *       
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1404
	 *       At the moment, it seems to me that we would need to write a visitor class to do this for us!
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1405
	 *       I currently have other things on my mind at the moment, so I will leave this for later...
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1406
	 *       For the moment we just set it to BOOL, and ignore the support of SAFEBOOL!
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1407
	 */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1408
	if (NULL == symbol->datatype) set_datatype(&get_datatype_info_c::bool_type_name /* datatype*/, symbol /* symbol */);
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1409
	if (NULL == symbol->datatype) ERROR; // the BOOL is not on the candidate_datatypes! Strange... Probably a bug in fill_candidate_datatype_c
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1410
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1411
	/* set the required datatype of the previous IL instruction, i.e. a bool_type_name_c! */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1412
	set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction);
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1413
	return NULL;
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1414
}
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1415
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1416
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1417
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1418
void *narrow_candidate_datatypes_c::narrow_S_and_R_operator(symbol_c *symbol, const char *param_name, symbol_c *called_fb_declaration) {
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1419
	if (NULL != called_fb_declaration) 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1420
	  /* FB call semantics */  
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1421
	  return narrow_implicit_il_fb_call(symbol, param_name, called_fb_declaration); 
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1422
	
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1423
	/* Set/Reset semantics */  
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1424
	narrow_conditional_operator(symbol);
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1425
	/* set the datatype for the il_operand */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1426
	if ((NULL != il_operand) && (il_operand->candidate_datatypes.size() > 0))
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1427
		set_il_operand_datatype(il_operand, il_operand->candidate_datatypes[0]);
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1428
	return NULL;
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1429
}
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1430
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1431
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1432
839
99d9ef4d210b Small code cleanup (move common code to a function)
mjsousa
parents: 838
diff changeset
  1433
void *narrow_candidate_datatypes_c::narrow_store_operator(symbol_c *symbol) {
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1434
	if (symbol->candidate_datatypes.size() == 1) {
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1435
		symbol->datatype = symbol->candidate_datatypes[0];
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1436
		/* set the desired datatype of the previous il instruction */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1437
		set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction);
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1438
		/* In the case of the ST operator, we must set the datatype of the il_instruction_c object that points to this ST_operator_c ourselves,
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1439
		 * since the following il_instruction_c objects have not done it, as is normal/standard for other instructions!
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1440
		 */
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1441
		current_il_instruction->datatype = symbol->datatype;
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1442
	}
834
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
  1443
	
783ef40344dd Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents: 827
diff changeset
  1444
	/* set the datatype for the operand */
836
149398f525a7 make sure all IL operands are narrowed (datatype checking algorithm)
mjsousa
parents: 834
diff changeset
  1445
	set_il_operand_datatype(il_operand, symbol->datatype);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1446
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1447
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1448
839
99d9ef4d210b Small code cleanup (move common code to a function)
mjsousa
parents: 838
diff changeset
  1449
99d9ef4d210b Small code cleanup (move common code to a function)
mjsousa
parents: 838
diff changeset
  1450
99d9ef4d210b Small code cleanup (move common code to a function)
mjsousa
parents: 838
diff changeset
  1451
void *narrow_candidate_datatypes_c::visit(  LD_operator_c *symbol)  {return set_il_operand_datatype(il_operand, symbol->datatype);}
99d9ef4d210b Small code cleanup (move common code to a function)
mjsousa
parents: 838
diff changeset
  1452
void *narrow_candidate_datatypes_c::visit( LDN_operator_c *symbol)  {return set_il_operand_datatype(il_operand, symbol->datatype);}
99d9ef4d210b Small code cleanup (move common code to a function)
mjsousa
parents: 838
diff changeset
  1453
99d9ef4d210b Small code cleanup (move common code to a function)
mjsousa
parents: 838
diff changeset
  1454
void *narrow_candidate_datatypes_c::visit(  ST_operator_c *symbol)  {return narrow_store_operator(symbol);}
99d9ef4d210b Small code cleanup (move common code to a function)
mjsousa
parents: 838
diff changeset
  1455
void *narrow_candidate_datatypes_c::visit( STN_operator_c *symbol)  {return narrow_store_operator(symbol);}
838
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1456
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1457
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1458
/* NOTE: the standard allows syntax in which the NOT operator is followed by an optional <il_operand>
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1459
 *              NOT [<il_operand>]
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1460
 *       However, it does not define the semantic of the NOT operation when the <il_operand> is specified.
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1461
 *       We therefore consider it an error if an il_operand is specified!
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1462
 *       This error will be detected in print_datatypes_error_c!!
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1463
 */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1464
/* This operator does not change the data type, it simply inverts the bits in the ANT_BIT data types! */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1465
/* So, we merely set the desired datatype of the previous il instruction */
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1466
void *narrow_candidate_datatypes_c::visit( NOT_operator_c *symbol)  {set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction);return NULL;}
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1467
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1468
void *narrow_candidate_datatypes_c::visit(   S_operator_c *symbol)  {return narrow_S_and_R_operator   (symbol, "S",   symbol->called_fb_declaration);}
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1469
void *narrow_candidate_datatypes_c::visit(   R_operator_c *symbol)  {return narrow_S_and_R_operator   (symbol, "R",   symbol->called_fb_declaration);}
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
  1470
456
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1471
void *narrow_candidate_datatypes_c::visit(  S1_operator_c *symbol)  {return narrow_implicit_il_fb_call(symbol, "S1",  symbol->called_fb_declaration);}
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1472
void *narrow_candidate_datatypes_c::visit(  R1_operator_c *symbol)  {return narrow_implicit_il_fb_call(symbol, "R1",  symbol->called_fb_declaration);}
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1473
void *narrow_candidate_datatypes_c::visit( CLK_operator_c *symbol)  {return narrow_implicit_il_fb_call(symbol, "CLK", symbol->called_fb_declaration);}
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1474
void *narrow_candidate_datatypes_c::visit(  CU_operator_c *symbol)  {return narrow_implicit_il_fb_call(symbol, "CU",  symbol->called_fb_declaration);}
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1475
void *narrow_candidate_datatypes_c::visit(  CD_operator_c *symbol)  {return narrow_implicit_il_fb_call(symbol, "CD",  symbol->called_fb_declaration);}
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1476
void *narrow_candidate_datatypes_c::visit(  PV_operator_c *symbol)  {return narrow_implicit_il_fb_call(symbol, "PV",  symbol->called_fb_declaration);}
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1477
void *narrow_candidate_datatypes_c::visit(  IN_operator_c *symbol)  {return narrow_implicit_il_fb_call(symbol, "IN",  symbol->called_fb_declaration);}
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1478
void *narrow_candidate_datatypes_c::visit(  PT_operator_c *symbol)  {return narrow_implicit_il_fb_call(symbol, "PT",  symbol->called_fb_declaration);}
ca8d98289ff9 Some small cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents: 455
diff changeset
  1479
481
16f943328696 Add 'widen' tables for AND, OR and XOR operations.
Mario de Sousa <msousa@fe.up.pt>
parents: 480
diff changeset
  1480
void *narrow_candidate_datatypes_c::visit( AND_operator_c *symbol)  {return narrow_binary_operator(widen_AND_table, symbol);}
16f943328696 Add 'widen' tables for AND, OR and XOR operations.
Mario de Sousa <msousa@fe.up.pt>
parents: 480
diff changeset
  1481
void *narrow_candidate_datatypes_c::visit(  OR_operator_c *symbol)  {return narrow_binary_operator( widen_OR_table, symbol);}
16f943328696 Add 'widen' tables for AND, OR and XOR operations.
Mario de Sousa <msousa@fe.up.pt>
parents: 480
diff changeset
  1482
void *narrow_candidate_datatypes_c::visit( XOR_operator_c *symbol)  {return narrow_binary_operator(widen_XOR_table, symbol);}
483
7f839fb100c1 Cleaning up XORN, ANDN, and ORN operator code.
Mario de Sousa <msousa@fe.up.pt>
parents: 481
diff changeset
  1483
void *narrow_candidate_datatypes_c::visit(ANDN_operator_c *symbol)  {return narrow_binary_operator(widen_AND_table, symbol);}
7f839fb100c1 Cleaning up XORN, ANDN, and ORN operator code.
Mario de Sousa <msousa@fe.up.pt>
parents: 481
diff changeset
  1484
void *narrow_candidate_datatypes_c::visit( ORN_operator_c *symbol)  {return narrow_binary_operator( widen_OR_table, symbol);}
7f839fb100c1 Cleaning up XORN, ANDN, and ORN operator code.
Mario de Sousa <msousa@fe.up.pt>
parents: 481
diff changeset
  1485
void *narrow_candidate_datatypes_c::visit(XORN_operator_c *symbol)  {return narrow_binary_operator(widen_XOR_table, symbol);}
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1486
void *narrow_candidate_datatypes_c::visit( ADD_operator_c *symbol)  {return narrow_binary_operator(widen_ADD_table, symbol, &(symbol->deprecated_operation));}
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1487
void *narrow_candidate_datatypes_c::visit( SUB_operator_c *symbol)  {return narrow_binary_operator(widen_SUB_table, symbol, &(symbol->deprecated_operation));}
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1488
void *narrow_candidate_datatypes_c::visit( MUL_operator_c *symbol)  {return narrow_binary_operator(widen_MUL_table, symbol, &(symbol->deprecated_operation));}
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1489
void *narrow_candidate_datatypes_c::visit( DIV_operator_c *symbol)  {return narrow_binary_operator(widen_DIV_table, symbol, &(symbol->deprecated_operation));}
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1490
void *narrow_candidate_datatypes_c::visit( MOD_operator_c *symbol)  {return narrow_binary_operator(widen_MOD_table, symbol);}
484
f78750994a82 Clean code for comparison operations & operators.
Mario de Sousa <msousa@fe.up.pt>
parents: 483
diff changeset
  1491
void *narrow_candidate_datatypes_c::visit(  GT_operator_c *symbol)  {return narrow_binary_operator(widen_CMP_table, symbol);}
f78750994a82 Clean code for comparison operations & operators.
Mario de Sousa <msousa@fe.up.pt>
parents: 483
diff changeset
  1492
void *narrow_candidate_datatypes_c::visit(  GE_operator_c *symbol)  {return narrow_binary_operator(widen_CMP_table, symbol);}
f78750994a82 Clean code for comparison operations & operators.
Mario de Sousa <msousa@fe.up.pt>
parents: 483
diff changeset
  1493
void *narrow_candidate_datatypes_c::visit(  EQ_operator_c *symbol)  {return narrow_binary_operator(widen_CMP_table, symbol);}
f78750994a82 Clean code for comparison operations & operators.
Mario de Sousa <msousa@fe.up.pt>
parents: 483
diff changeset
  1494
void *narrow_candidate_datatypes_c::visit(  LT_operator_c *symbol)  {return narrow_binary_operator(widen_CMP_table, symbol);}
f78750994a82 Clean code for comparison operations & operators.
Mario de Sousa <msousa@fe.up.pt>
parents: 483
diff changeset
  1495
void *narrow_candidate_datatypes_c::visit(  LE_operator_c *symbol)  {return narrow_binary_operator(widen_CMP_table, symbol);}
f78750994a82 Clean code for comparison operations & operators.
Mario de Sousa <msousa@fe.up.pt>
parents: 483
diff changeset
  1496
void *narrow_candidate_datatypes_c::visit(  NE_operator_c *symbol)  {return narrow_binary_operator(widen_CMP_table, symbol);}
448
1bd18fc06911 Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents: 445
diff changeset
  1497
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1498
838
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1499
/* visitors to CAL_operator_c, CALC_operator_c and CALCN_operator_c are called from visit(il_fb_call_c *) {symbol->il_call_operator->accept(*this)} */
487
1619b2fe03e1 Clean up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 484
diff changeset
  1500
/* NOTE: The CAL, JMP and RET instructions simply set the desired datatype of the previous il instruction since they do not change the value in the current/default IL variable */
1619b2fe03e1 Clean up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 484
diff changeset
  1501
void *narrow_candidate_datatypes_c::visit(  CAL_operator_c *symbol) {set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction); return NULL;}
1619b2fe03e1 Clean up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 484
diff changeset
  1502
void *narrow_candidate_datatypes_c::visit(  RET_operator_c *symbol) {set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction); return NULL;}
1619b2fe03e1 Clean up the code.
Mario de Sousa <msousa@fe.up.pt>
parents: 484
diff changeset
  1503
void *narrow_candidate_datatypes_c::visit(  JMP_operator_c *symbol) {set_datatype_in_prev_il_instructions(symbol->datatype, fake_prev_il_instruction); return NULL;}
838
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1504
void *narrow_candidate_datatypes_c::visit( CALC_operator_c *symbol) {return narrow_conditional_operator(symbol);}
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1505
void *narrow_candidate_datatypes_c::visit(CALCN_operator_c *symbol) {return narrow_conditional_operator(symbol);}
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1506
void *narrow_candidate_datatypes_c::visit( RETC_operator_c *symbol) {return narrow_conditional_operator(symbol);}
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1507
void *narrow_candidate_datatypes_c::visit(RETCN_operator_c *symbol) {return narrow_conditional_operator(symbol);}
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1508
void *narrow_candidate_datatypes_c::visit( JMPC_operator_c *symbol) {return narrow_conditional_operator(symbol);}
13ea7c080018 Fix datatype analysis of conditional IL operators (CALC, CALCN, RETC, RETCN, JMPC, JMPCN, S and R)
mjsousa
parents: 836
diff changeset
  1509
void *narrow_candidate_datatypes_c::visit(JMPCN_operator_c *symbol) {return narrow_conditional_operator(symbol);}
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1510
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1511
/* Symbol class handled together with function call checks */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1512
// void *visit(il_assign_operator_c *symbol, variable_name);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1513
/* Symbol class handled together with function call checks */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1514
// void *visit(il_assign_operator_c *symbol, option, variable_name);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1515
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1516
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1517
/***************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1518
/* B.3 - Language ST (Structured Text) */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1519
/***************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1520
/***********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1521
/* B 3.1 - Expressions */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1522
/***********************/
933
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1523
/* SYM_REF1(deref_expression_c, exp)  --> an extension to the IEC 61131-3 standard - based on the IEC 61131-3 v3 standard. Returns address of the varible! */
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1524
void *narrow_candidate_datatypes_c::visit(deref_expression_c  *symbol) {
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1525
  for (unsigned int i = 0; i < symbol->exp->candidate_datatypes.size(); i++) {
937
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1526
    symbol_c *typ = symbol->exp->candidate_datatypes[i];
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1527
    symbol_c *ref = get_datatype_info_c::get_ref_to(typ);
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1528
    if (   (get_datatype_info_c::is_ref_to(typ)) 
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1529
        && (get_datatype_info_c::is_type_equal(search_base_type_c::get_basetype_decl(ref), symbol->datatype))
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1530
       )
933
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1531
      /* if it points to the required datatype for symbol, then that is the required datatype for symbol->exp */
937
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1532
      symbol->exp->datatype = typ;
933
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1533
  }
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1534
  
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1535
  symbol->exp->accept(*this);
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1536
  return NULL;
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1537
}
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1538
76324f461aed Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents: 919
diff changeset
  1539
936
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1540
/* SYM_REF1(deref_operator_c, exp)  --> an extension to the IEC 61131-3 standard - based on the IEC 61131-3 v3 standard. Returns address of the varible! */
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1541
void *narrow_candidate_datatypes_c::visit(deref_operator_c  *symbol) {
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1542
  for (unsigned int i = 0; i < symbol->exp->candidate_datatypes.size(); i++) {
937
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1543
    symbol_c *typ = symbol->exp->candidate_datatypes[i];
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1544
    symbol_c *ref = get_datatype_info_c::get_ref_to(typ);
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1545
    if (   (get_datatype_info_c::is_ref_to(typ)) 
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1546
        && (get_datatype_info_c::is_type_equal(search_base_type_c::get_basetype_decl(ref), symbol->datatype))
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1547
       )
936
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1548
      /* if it points to the required datatype for symbol, then that is the required datatype for symbol->exp */
937
887e7d90445a Fix bug with multple dereferencing (bool_var := bool_ptr_ptr^^;)
mjsousa
parents: 936
diff changeset
  1549
      symbol->exp->datatype = typ;
936
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1550
  }
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1551
  
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1552
  symbol->exp->accept(*this);
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1553
  return NULL;
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1554
}
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1555
0f7bcc160568 Fix bug: Add support for de-referencing pointers to struct (struct_ptr^.elem1) when used inside FB.
mjsousa
parents: 933
diff changeset
  1556
873
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1557
/* SYM_REF1(ref_expression_c, exp)  --> an extension to the IEC 61131-3 standard - based on the IEC 61131-3 v3 standard. Returns address of the varible! */
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1558
void *narrow_candidate_datatypes_c::visit(  ref_expression_c  *symbol) {
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1559
  if (symbol->exp->candidate_datatypes.size() > 0) {
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1560
    symbol->exp->datatype = symbol->exp->candidate_datatypes[0]; /* just use the first possible datatype */
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1561
  }
910
a0518971127d Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
mjsousa
parents: 909
diff changeset
  1562
  symbol->exp->accept(*this);
873
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1563
  return NULL;
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1564
}
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1565
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1566
dea39ef02847 Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents: 854
diff changeset
  1567
652
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1568
/* allow_enums is FALSE by default!!
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1569
 * deprecated_operation is NULL by default!!
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1570
 * if (allow_enums) then consider that we are ectually processing an equ_expression or notequ_expression, where two enums of the same data type may also be legally compared 
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1571
 *  e.g.      symbol := l_expr == r_expr              
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1572
 *            symbol := l_expr != r_expr
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1573
 *  In the above situation it is a legal operation when (l_expr.datatype == r_expr.datatype) && is_enumerated(r/l_expr.datatype) && is_bool(symbol.datatype)
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1574
 */
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1575
void *narrow_candidate_datatypes_c::narrow_binary_expression(const struct widen_entry widen_table[], symbol_c *symbol, symbol_c *l_expr, symbol_c *r_expr, bool *deprecated_operation, bool allow_enums) {
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1576
	symbol_c *l_type, *r_type;
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1577
	int count = 0;
652
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1578
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1579
	if (NULL != deprecated_operation)
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1580
		*deprecated_operation = false;
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1581
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1582
	for(unsigned int i = 0; i < l_expr->candidate_datatypes.size(); i++) {
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1583
		for(unsigned int j = 0; j < r_expr->candidate_datatypes.size(); j++) {
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1584
			/* test widening compatibility */
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1585
			l_type = l_expr->candidate_datatypes[i];
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1586
			r_type = r_expr->candidate_datatypes[j];
652
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1587
			if        (is_widening_compatible(widen_table, l_type, r_type, symbol->datatype, deprecated_operation)) {
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1588
				l_expr->datatype = l_type;
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1589
				r_expr->datatype = r_type;
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1590
				count ++;
919
8da635655f37 Add support for the 'NULL' keyword, defined in version 3 of IEC 61131-3.
mjsousa
parents: 910
diff changeset
  1591
			} else if (   /* handle the special case of enumerations */
8da635655f37 Add support for the 'NULL' keyword, defined in version 3 of IEC 61131-3.
mjsousa
parents: 910
diff changeset
  1592
			              (get_datatype_info_c::is_BOOL_compatible(symbol->datatype) && get_datatype_info_c::is_enumerated(l_type) && (l_type == r_type))
8da635655f37 Add support for the 'NULL' keyword, defined in version 3 of IEC 61131-3.
mjsousa
parents: 910
diff changeset
  1593
			              /* handle the special case of comparison between REF_TO datatypes */
8da635655f37 Add support for the 'NULL' keyword, defined in version 3 of IEC 61131-3.
mjsousa
parents: 910
diff changeset
  1594
			           || (get_datatype_info_c::is_BOOL_compatible(symbol->datatype) && get_datatype_info_c::is_ref_to    (l_type) && get_datatype_info_c::is_type_equal(l_type, r_type))) {
652
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1595
				if (NULL != deprecated_operation)  *deprecated_operation = false;
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1596
				l_expr->datatype = l_type;
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1597
				r_expr->datatype = r_type;
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1598
				count ++;
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1599
			}
652
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1600
			  
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1601
		}
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1602
	}
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1603
// 	if (count > 1) ERROR; /* Since we also support SAFE data types, this assertion is not necessarily always tru! */
676
ca4f17211251 Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 675
diff changeset
  1604
	if (get_datatype_info_c::is_type_valid(symbol->datatype) && (count <= 0)) ERROR;
480
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1605
	
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1606
	l_expr->accept(*this);
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1607
	r_expr->accept(*this);
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1608
	return NULL;
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1609
}
8a58d7b8b26c Add MOD widening table, and some code clean-ups.
Mario de Sousa <msousa@fe.up.pt>
parents: 478
diff changeset
  1610
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1611
652
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1612
void *narrow_candidate_datatypes_c::narrow_equality_comparison(const struct widen_entry widen_table[], symbol_c *symbol, symbol_c *l_expr, symbol_c *r_expr, bool *deprecated_operation) {
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1613
	return narrow_binary_expression(widen_table, symbol, l_expr, r_expr, deprecated_operation, true);
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1614
}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1615
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1616
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1617
void *narrow_candidate_datatypes_c::visit(    or_expression_c *symbol) {return narrow_binary_expression  ( widen_OR_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1618
void *narrow_candidate_datatypes_c::visit(   xor_expression_c *symbol) {return narrow_binary_expression  (widen_XOR_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1619
void *narrow_candidate_datatypes_c::visit(   and_expression_c *symbol) {return narrow_binary_expression  (widen_AND_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1620
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1621
void *narrow_candidate_datatypes_c::visit(   equ_expression_c *symbol) {return narrow_equality_comparison(widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1622
void *narrow_candidate_datatypes_c::visit(notequ_expression_c *symbol) {return narrow_equality_comparison(widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1623
void *narrow_candidate_datatypes_c::visit(    lt_expression_c *symbol) {return narrow_binary_expression  (widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1624
void *narrow_candidate_datatypes_c::visit(    gt_expression_c *symbol) {return narrow_binary_expression  (widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1625
void *narrow_candidate_datatypes_c::visit(    le_expression_c *symbol) {return narrow_binary_expression  (widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1626
void *narrow_candidate_datatypes_c::visit(    ge_expression_c *symbol) {return narrow_binary_expression  (widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1627
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1628
void *narrow_candidate_datatypes_c::visit(   add_expression_c *symbol) {return narrow_binary_expression  (widen_ADD_table, symbol, symbol->l_exp, symbol->r_exp, &symbol->deprecated_operation);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1629
void *narrow_candidate_datatypes_c::visit(   sub_expression_c *symbol) {return narrow_binary_expression  (widen_SUB_table, symbol, symbol->l_exp, symbol->r_exp, &symbol->deprecated_operation);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1630
void *narrow_candidate_datatypes_c::visit(   mul_expression_c *symbol) {return narrow_binary_expression  (widen_MUL_table, symbol, symbol->l_exp, symbol->r_exp, &symbol->deprecated_operation);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1631
void *narrow_candidate_datatypes_c::visit(   div_expression_c *symbol) {return narrow_binary_expression  (widen_DIV_table, symbol, symbol->l_exp, symbol->r_exp, &symbol->deprecated_operation);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1632
void *narrow_candidate_datatypes_c::visit(   mod_expression_c *symbol) {return narrow_binary_expression  (widen_MOD_table, symbol, symbol->l_exp, symbol->r_exp);}
7fe1533d2260 Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents: 552
diff changeset
  1633
void *narrow_candidate_datatypes_c::visit( power_expression_c *symbol) {return narrow_binary_expression  (widen_EXPT_table,symbol, symbol->l_exp, symbol->r_exp);}
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1634
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1635
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1636
void *narrow_candidate_datatypes_c::visit(neg_expression_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1637
	symbol->exp->datatype = symbol->datatype;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1638
	symbol->exp->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1639
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1640
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1641
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1642
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1643
void *narrow_candidate_datatypes_c::visit(not_expression_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1644
	symbol->exp->datatype = symbol->datatype;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1645
	symbol->exp->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1646
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1647
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1648
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1649
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1650
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1651
/* NOTE: The parameter 'called_function_declaration', 'extensible_param_count' and 'candidate_functions' are used to pass data between the stage 3 and stage 4. */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1652
/*    formal_param_list -> may be NULL ! */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1653
/* nonformal_param_list -> may be NULL ! */
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1654
// SYM_REF3(function_invocation_c, function_name, formal_param_list, nonformal_param_list, symbol_c *called_function_declaration; int extensible_param_count; std::vector <symbol_c *> candidate_functions;)
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1655
void *narrow_candidate_datatypes_c::visit(function_invocation_c *symbol) {
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1656
	generic_function_call_t fcall_param = {
441
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1657
		/* fcall_param.function_name               = */ symbol->function_name,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1658
		/* fcall_param.nonformal_operand_list      = */ symbol->nonformal_param_list,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1659
		/* fcall_param.formal_operand_list         = */ symbol->formal_param_list,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1660
		/* enum {POU_FB, POU_function} POU_type    = */ generic_function_call_t::POU_function,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1661
		/* fcall_param.candidate_functions         = */ symbol->candidate_functions,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1662
		/* fcall_param.called_function_declaration = */ symbol->called_function_declaration,
e8de43eefcc5 Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 439
diff changeset
  1663
		/* fcall_param.extensible_param_count      = */ symbol->extensible_param_count
438
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1664
	};
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1665
  
744b125d911e Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents: 428
diff changeset
  1666
	narrow_function_invocation(symbol, fcall_param);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1667
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1668
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1669
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1670
/********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1671
/* B 3.2 Statements */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1672
/********************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1673
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1674
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1675
/*********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1676
/* B 3.2.1 Assignment Statements */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1677
/*********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1678
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1679
void *narrow_candidate_datatypes_c::visit(assignment_statement_c *symbol) {
910
a0518971127d Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
mjsousa
parents: 909
diff changeset
  1680
	if (symbol->candidate_datatypes.size() == 1) {
a0518971127d Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
mjsousa
parents: 909
diff changeset
  1681
		symbol->datatype = symbol->candidate_datatypes[0];
a0518971127d Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
mjsousa
parents: 909
diff changeset
  1682
		symbol->l_exp->datatype = symbol->datatype;
a0518971127d Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
mjsousa
parents: 909
diff changeset
  1683
		symbol->r_exp->datatype = symbol->datatype;
a0518971127d Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
mjsousa
parents: 909
diff changeset
  1684
	}
a0518971127d Narrow array subscripts correctly, even in the presence of other datatype errors (so we do not generate error messages for array subscripts that do not contain errors).
mjsousa
parents: 909
diff changeset
  1685
	/* give the chance of any expressions inside array subscripts to be narrowed correctly */
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1686
	symbol->l_exp->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1687
	symbol->r_exp->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1688
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1689
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1690
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1691
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1692
/*****************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1693
/* B 3.2.2 Subprogram Control Statements */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1694
/*****************************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1695
423
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1696
void *narrow_candidate_datatypes_c::visit(fb_invocation_c *symbol) {
424
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1697
	/* Note: We do not use the symbol->called_fb_declaration value (set in fill_candidate_datatypes_c)
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1698
	 *       because we try to identify any other datatype errors in the expressions used in the 
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1699
	 *       parameters to the FB call (e.g.  fb_var(var1 * 56 + func(var * 43)) )
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1700
	 *       even it the call to the FB is invalid. 
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1701
	 *       This makes sense because it may be errors in those expressions which are
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1702
	 *       making this an invalid call, so it makes sense to point them out to the user!
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1703
	 */
423
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1704
	symbol_c *fb_decl = search_varfb_instance_type->get_basetype_decl(symbol->fb_name);
424
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1705
43d73e28eca8 Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents: 423
diff changeset
  1706
	/* Although a call to a non-declared FB is a semantic error, this is currently caught by stage 2! */
423
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1707
	if (NULL == fb_decl) ERROR;
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1708
	if (NULL != symbol->nonformal_param_list)  narrow_nonformal_call(symbol, fb_decl);
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1709
	if (NULL != symbol->   formal_param_list)     narrow_formal_call(symbol, fb_decl);
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1710
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1711
	return NULL;
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1712
}
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1713
f4a2d400ddbd Adding support for semantic verification of FB calls in ST.
Mario de Sousa <msousa@fe.up.pt>
parents: 421
diff changeset
  1714
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1715
/********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1716
/* B 3.2.3 Selection Statements */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1717
/********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1718
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1719
void *narrow_candidate_datatypes_c::visit(if_statement_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1720
	for(unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1721
		if (get_datatype_info_c::is_BOOL_compatible(symbol->expression->candidate_datatypes[i]))
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1722
			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1723
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1724
	symbol->expression->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1725
	if (NULL != symbol->statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1726
		symbol->statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1727
	if (NULL != symbol->elseif_statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1728
		symbol->elseif_statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1729
	if (NULL != symbol->else_statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1730
		symbol->else_statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1731
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1732
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1733
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1734
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1735
void *narrow_candidate_datatypes_c::visit(elseif_statement_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1736
	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1737
		if (get_datatype_info_c::is_BOOL_compatible(symbol->expression->candidate_datatypes[i]))
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1738
			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1739
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1740
	symbol->expression->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1741
	if (NULL != symbol->statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1742
		symbol->statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1743
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1744
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1745
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1746
/* CASE expression OF case_element_list ELSE statement_list END_CASE */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1747
// SYM_REF3(case_statement_c, expression, case_element_list, statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1748
void *narrow_candidate_datatypes_c::visit(case_statement_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1749
	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1750
		if ((get_datatype_info_c::is_ANY_INT(symbol->expression->candidate_datatypes[i]))
854
13d0b67de111 Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 843
diff changeset
  1751
				 || (get_datatype_info_c::is_enumerated(symbol->expression->candidate_datatypes[i])))
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1752
			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1753
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1754
	symbol->expression->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1755
	if (NULL != symbol->statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1756
		symbol->statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1757
	if (NULL != symbol->case_element_list) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1758
		symbol->case_element_list->datatype = symbol->expression->datatype;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1759
		symbol->case_element_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1760
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1761
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1762
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1763
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1764
/* helper symbol for case_statement */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1765
// SYM_LIST(case_element_list_c)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1766
void *narrow_candidate_datatypes_c::visit(case_element_list_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1767
	for (int i = 0; i < symbol->n; i++) {
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1768
		symbol->get_element(i)->datatype = symbol->datatype;
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1769
		symbol->get_element(i)->accept(*this);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1770
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1771
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1772
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1773
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1774
/*  case_list ':' statement_list */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1775
// SYM_REF2(case_element_c, case_list, statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1776
void *narrow_candidate_datatypes_c::visit(case_element_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1777
	symbol->case_list->datatype = symbol->datatype;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1778
	symbol->case_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1779
	symbol->statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1780
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1781
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1782
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1783
// SYM_LIST(case_list_c)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1784
void *narrow_candidate_datatypes_c::visit(case_list_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1785
	for (int i = 0; i < symbol->n; i++) {
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1786
		for (unsigned int k = 0; k < symbol->get_element(i)->candidate_datatypes.size(); k++) {
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1787
			if (get_datatype_info_c::is_type_equal(symbol->datatype, symbol->get_element(i)->candidate_datatypes[k]))
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1788
				symbol->get_element(i)->datatype = symbol->get_element(i)->candidate_datatypes[k];
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1789
		}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1790
		/* NOTE: this may be an integer, a subrange_c, or a enumerated value! */
1041
56ebe2a31b5b Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents: 1040
diff changeset
  1791
		symbol->get_element(i)->accept(*this);
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1792
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1793
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1794
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1795
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1796
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1797
/********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1798
/* B 3.2.4 Iteration Statements */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1799
/********************************/
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1800
void *narrow_candidate_datatypes_c::visit(for_statement_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1801
	/* Control variable */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1802
	for(unsigned int i = 0; i < symbol->control_variable->candidate_datatypes.size(); i++) {
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1803
		if (get_datatype_info_c::is_ANY_INT(symbol->control_variable->candidate_datatypes[i])) {
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1804
			symbol->control_variable->datatype = symbol->control_variable->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1805
		}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1806
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1807
	symbol->control_variable->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1808
	/* BEG expression */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1809
	for(unsigned int i = 0; i < symbol->beg_expression->candidate_datatypes.size(); i++) {
676
ca4f17211251 Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 675
diff changeset
  1810
		if (get_datatype_info_c::is_type_equal(symbol->control_variable->datatype,symbol->beg_expression->candidate_datatypes[i]) &&
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1811
				get_datatype_info_c::is_ANY_INT(symbol->beg_expression->candidate_datatypes[i])) {
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1812
			symbol->beg_expression->datatype = symbol->beg_expression->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1813
		}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1814
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1815
	symbol->beg_expression->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1816
	/* END expression */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1817
	for(unsigned int i = 0; i < symbol->end_expression->candidate_datatypes.size(); i++) {
676
ca4f17211251 Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 675
diff changeset
  1818
		if (get_datatype_info_c::is_type_equal(symbol->control_variable->datatype,symbol->end_expression->candidate_datatypes[i]) &&
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1819
				get_datatype_info_c::is_ANY_INT(symbol->end_expression->candidate_datatypes[i])) {
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1820
			symbol->end_expression->datatype = symbol->end_expression->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1821
		}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1822
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1823
	symbol->end_expression->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1824
	/* BY expression */
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1825
	if (NULL != symbol->by_expression) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1826
		for(unsigned int i = 0; i < symbol->by_expression->candidate_datatypes.size(); i++) {
676
ca4f17211251 Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents: 675
diff changeset
  1827
			if (get_datatype_info_c::is_type_equal(symbol->control_variable->datatype,symbol->by_expression->candidate_datatypes[i]) &&
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1828
					get_datatype_info_c::is_ANY_INT(symbol->by_expression->candidate_datatypes[i])) {
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1829
				symbol->by_expression->datatype = symbol->by_expression->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1830
			}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1831
		}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1832
		symbol->by_expression->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1833
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1834
	if (NULL != symbol->statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1835
		symbol->statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1836
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1837
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1838
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1839
void *narrow_candidate_datatypes_c::visit(while_statement_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1840
	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1841
		if(get_datatype_info_c::is_BOOL(symbol->expression->candidate_datatypes[i]))
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1842
			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1843
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1844
	symbol->expression->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1845
	if (NULL != symbol->statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1846
		symbol->statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1847
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1848
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1849
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1850
void *narrow_candidate_datatypes_c::visit(repeat_statement_c *symbol) {
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1851
	for (unsigned int i = 0; i < symbol->expression->candidate_datatypes.size(); i++) {
666
8ba9ec4bae50 Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents: 661
diff changeset
  1852
		if(get_datatype_info_c::is_BOOL(symbol->expression->candidate_datatypes[i]))
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1853
			symbol->expression->datatype = symbol->expression->candidate_datatypes[i];
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1854
	}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1855
	symbol->expression->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1856
	if (NULL != symbol->statement_list)
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1857
		symbol->statement_list->accept(*this);
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1858
	return NULL;
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1859
}
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1860
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1861
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1862
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1863
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff changeset
  1864