stage3/lvalue_check.cc
author Mario de Sousa <msousa@fe.up.pt>
Wed, 25 Apr 2012 16:21:14 +0100
changeset 533 dd93707c482e
parent 532 cb78940b2cb8
child 535 70140bd7fe67
permissions -rw-r--r--
Add clarifying comment.
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     1
/*
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     3
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     4
 *  Copyright (C) 2009-2012  Mario de Sousa (msousa@fe.up.pt)
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     5
 *  Copyright (C) 2012       Manuele Conti  (conti.ma@alice.it)
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     6
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     7
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     8
 *  This program is free software: you can redistribute it and/or modify
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
     9
 *  it under the terms of the GNU General Public License as published by
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    10
 *  the Free Software Foundation, either version 3 of the License, or
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    11
 *  (at your option) any later version.
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    12
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    13
 *  This program is distributed in the hope that it will be useful,
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    16
 *  GNU General Public License for more details.
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    17
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    18
 *  You should have received a copy of the GNU General Public License
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    19
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    20
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    21
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    22
 * This code is made available on the understanding that it will not be
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    23
 * used in safety-critical situations without a full and competent review.
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    24
 */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    25
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    26
/*
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    27
 * An IEC 61131-3 compiler.
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    28
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    29
 * Based on the
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    30
 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    31
 *
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    32
 */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    33
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    34
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    35
#include "lvalue_check.hh"
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    36
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    37
#define FIRST_(symbol1, symbol2) (((symbol1)->first_order < (symbol2)->first_order)   ? (symbol1) : (symbol2))
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    38
#define  LAST_(symbol1, symbol2) (((symbol1)->last_order  > (symbol2)->last_order)    ? (symbol1) : (symbol2))
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    39
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    40
#define STAGE3_ERROR(error_level, symbol1, symbol2, ...) {                                                                  \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    41
  if (current_display_error_level >= error_level) {                                                                         \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    42
    fprintf(stderr, "%s:%d-%d..%d-%d: error: ",                                                                             \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    43
            FIRST_(symbol1,symbol2)->first_file, FIRST_(symbol1,symbol2)->first_line, FIRST_(symbol1,symbol2)->first_column,\
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    44
                                                 LAST_(symbol1,symbol2) ->last_line,  LAST_(symbol1,symbol2) ->last_column);\
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    45
    fprintf(stderr, __VA_ARGS__);                                                                                           \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    46
    fprintf(stderr, "\n");                                                                                                  \
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    47
    error_count++;                                                                                                     \
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    48
  }                                                                                                                         \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    49
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    50
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    51
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    52
#define STAGE3_WARNING(symbol1, symbol2, ...) {                                                                             \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    53
    fprintf(stderr, "%s:%d-%d..%d-%d: warning: ",                                                                           \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    54
            FIRST_(symbol1,symbol2)->first_file, FIRST_(symbol1,symbol2)->first_line, FIRST_(symbol1,symbol2)->first_column,\
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    55
                                                 LAST_(symbol1,symbol2) ->last_line,  LAST_(symbol1,symbol2) ->last_column);\
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    56
    fprintf(stderr, __VA_ARGS__);                                                                                           \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    57
    fprintf(stderr, "\n");                                                                                                  \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    58
    warning_found = true;                                                                                                   \
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    59
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    60
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    61
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    62
lvalue_check_c::lvalue_check_c(symbol_c *ignore) {
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    63
	error_count = 0;
528
6510ee2eaab9 Remove erroneous check for S1 and R1, and add missing declrataion.
Mario de Sousa <msousa@fe.up.pt>
parents: 527
diff changeset
    64
	current_il_operand = NULL;
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    65
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    66
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    67
lvalue_check_c::~lvalue_check_c(void) {
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    68
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    69
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    70
int lvalue_check_c::get_error_count() {
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    71
	return error_count;
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    72
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    73
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
    74
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
    75
#include <strings.h>
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    76
/* No writing to iterator variables (used in FOR loops) inside the loop itself */
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
    77
void lvalue_check_c::check_assignment_to_controlvar(symbol_c *lvalue) {
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    78
	for (unsigned int i = 0; i < control_variables.size(); i++) {
512
f915ab676d7e Fixing check for assingment to FOR control variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 510
diff changeset
    79
		token_c *lvalue_name = get_var_name_c::get_name(lvalue);
f915ab676d7e Fixing check for assingment to FOR control variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 510
diff changeset
    80
		if (compare_identifiers(lvalue_name, control_variables[i]) == 0) {
f915ab676d7e Fixing check for assingment to FOR control variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 510
diff changeset
    81
			STAGE3_ERROR(0, lvalue, lvalue, "Assignment to FOR control variable is not allowed.");
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    82
			break;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    83
		}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    84
	}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    85
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
    86
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
    87
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    88
/* fb_instance.var := ...  is not valid if var is output variable */
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    89
/* NOTE, if a fb_instance1.fb_instance2.fb_instance3.var is used, we must iteratively check that none of the 
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    90
 *       FB records are declared as OUTPUT variables!!  
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    91
 *       This is the reason why we have the while() loop in this function!
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    92
 */
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    93
void lvalue_check_c::check_assignment_to_output(symbol_c *lvalue) {
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    94
	decompose_var_instance_name_c decompose_lvalue(lvalue);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    95
	search_base_type_c            search_base_type;
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
    96
519
018093957030 Add comment.
Mario de Sousa <msousa@fe.up.pt>
parents: 518
diff changeset
    97
	/* Get the first element/record of the potentially structured variable symbol */
018093957030 Add comment.
Mario de Sousa <msousa@fe.up.pt>
parents: 518
diff changeset
    98
	/* Note that if symbol is pointing to an expression (or simply a literal value), it will return a NULL.
018093957030 Add comment.
Mario de Sousa <msousa@fe.up.pt>
parents: 518
diff changeset
    99
	 * Once we have implemented the check_assignment_to_expression() method, and abort calling the other checks (including this one)
018093957030 Add comment.
Mario de Sousa <msousa@fe.up.pt>
parents: 518
diff changeset
   100
	 * when an expression is found, we may replace this check with an assertion...
018093957030 Add comment.
Mario de Sousa <msousa@fe.up.pt>
parents: 518
diff changeset
   101
	 * if (NULL == struct_elem) ERROR;
018093957030 Add comment.
Mario de Sousa <msousa@fe.up.pt>
parents: 518
diff changeset
   102
	 */
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   103
	symbol_c *struct_elem = decompose_lvalue.next_part();
518
a0a32a0c61ef Fix Segmentation fault in check_assignment_to_output lvalue method.
Conti Manuele <conti.ma@alice.it>
parents: 513
diff changeset
   104
	if (NULL == struct_elem) return;
519
018093957030 Add comment.
Mario de Sousa <msousa@fe.up.pt>
parents: 518
diff changeset
   105
	
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   106
	symbol_c *type_decl   = search_var_instance_decl->get_decl(struct_elem);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   107
	// symbol_c *type_id  = spec_init_sperator_c::get_spec(type_decl); /* this is not required! search_base_type_c can handle spec_init symbols! */
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   108
	symbol_c *basetype_id = search_base_type.get_basetype_id(/*type_id*/ type_decl);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   109
	/* If we can not determine the data type of the element, then the code must have a data type semantic error.
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   110
	 * This will have been caught by the data type semantic verifier, so we do not bother with this anymore!
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   111
	 */
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   112
	if (NULL == basetype_id) return;
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   113
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   114
	/* Determine if the record/structure element is of a FB type. */
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   115
	/* NOTE: If the structure element is not a FB type, then we can quit this check.
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   116
	 *       Remember that the standard does not allow a STRUCT data type to have elements that are FB instances!
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   117
	 *       Similarly, arrays of FB instances is also not allowed.
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   118
	 *       So, as soon as we find one record/structure element that is not a FB, no other record/structure element
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   119
	 *       will be of FB type, which means we can quit this check!
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   120
	 */
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   121
	function_block_declaration_c *fb_decl = function_block_type_symtable.find_value(basetype_id);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   122
	if (function_block_type_symtable.end_value() == fb_decl) return;
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   123
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   124
	while (NULL != (struct_elem = decompose_lvalue.next_part())) {
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   125
		search_var_instance_decl_c   fb_search_var_instance_decl(fb_decl);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   126
		if (search_var_instance_decl_c::output_vt == fb_search_var_instance_decl.get_vartype(struct_elem)) {
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   127
			STAGE3_ERROR(0, struct_elem, struct_elem, "Assignment to FB output variable is not allowed.");
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   128
			return; /* no need to carry on checking once the first error is found! */
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   129
		}
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   130
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   131
		/* prepare for any possible further record/structure elements */
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   132
		type_decl   = fb_search_var_instance_decl.get_decl(struct_elem);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   133
		basetype_id = search_base_type.get_basetype_id(type_decl);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   134
		if (NULL == basetype_id) return; /* same comment as above... */
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   135
		fb_decl = function_block_type_symtable.find_value(basetype_id);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   136
		if (function_block_type_symtable.end_value() == fb_decl) return; /* same comment as above... */
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   137
	}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   138
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   139
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   140
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   141
/*  No writing to CONSTANTs */
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   142
void lvalue_check_c::check_assignment_to_constant(symbol_c *lvalue) {
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   143
	unsigned int option = search_var_instance_decl->get_option(lvalue);
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   144
	if (option == search_var_instance_decl_c::constant_opt) {
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   145
		STAGE3_ERROR(0, lvalue, lvalue, "Assignment to CONSTANT variables is not be allowed.");
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   146
	}
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   147
}
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   148
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   149
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   150
/*  No assigning values to expressions. */
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   151
void lvalue_check_c::check_assignment_to_expression(symbol_c *lvalue) {
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   152
	/* This may occur in function invocations, when passing values (possibly an expression) to one 
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   153
	 * of the function's OUTPUT or IN_OUT parameters.
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   154
	 */
524
52b18b3c7490 Implement check_assignment_to_expression in lvalue_check_c class.
Conti Manuele <conti.ma@alice.it>
parents: 519
diff changeset
   155
	/* This may occur in function invocations, when passing values (possibly an expression) to one
52b18b3c7490 Implement check_assignment_to_expression in lvalue_check_c class.
Conti Manuele <conti.ma@alice.it>
parents: 519
diff changeset
   156
	 * of the function's OUTPUT or IN_OUT parameters.
52b18b3c7490 Implement check_assignment_to_expression in lvalue_check_c class.
Conti Manuele <conti.ma@alice.it>
parents: 519
diff changeset
   157
	 */
525
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   158
	if ( 
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   159
	     /*********************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   160
	     /* B 1.2 - Constants */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   161
	     /*********************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   162
	     /******************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   163
	     /* B 1.2.1 - Numeric Literals */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   164
	     /******************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   165
	     (typeid( *lvalue ) == typeid( real_c                         )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   166
	     (typeid( *lvalue ) == typeid( integer_c                      )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   167
	     (typeid( *lvalue ) == typeid( binary_integer_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   168
	     (typeid( *lvalue ) == typeid( octal_integer_c                )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   169
	     (typeid( *lvalue ) == typeid( hex_integer_c                  )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   170
	     (typeid( *lvalue ) == typeid( neg_real_c                     )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   171
	     (typeid( *lvalue ) == typeid( neg_integer_c                  )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   172
	     (typeid( *lvalue ) == typeid( integer_literal_c              )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   173
	     (typeid( *lvalue ) == typeid( real_literal_c                 )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   174
	     (typeid( *lvalue ) == typeid( bit_string_literal_c           )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   175
	     (typeid( *lvalue ) == typeid( boolean_literal_c              )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   176
	     (typeid( *lvalue ) == typeid( boolean_true_c                 )) || /* should not really be needed */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   177
	     (typeid( *lvalue ) == typeid( boolean_false_c                )) || /* should not really be needed */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   178
	     /*******************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   179
	     /* B.1.2.2   Character Strings */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   180
	     /*******************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   181
	     (typeid( *lvalue ) == typeid( double_byte_character_string_c )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   182
	     (typeid( *lvalue ) == typeid( single_byte_character_string_c )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   183
	     /***************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   184
	     /* B 1.2.3 - Time Literals */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   185
	     /***************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   186
	     /************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   187
	     /* B 1.2.3.1 - Duration */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   188
	     /************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   189
	     (typeid( *lvalue ) == typeid( duration_c                     )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   190
	     /************************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   191
	     /* B 1.2.3.2 - Time of day and Date */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   192
	     /************************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   193
	     (typeid( *lvalue ) == typeid( time_of_day_c                  )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   194
	     (typeid( *lvalue ) == typeid( daytime_c                      )) || /* should not really be needed */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   195
	     (typeid( *lvalue ) == typeid( date_c                         )) || /* should not really be needed */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   196
	     (typeid( *lvalue ) == typeid( date_literal_c                 )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   197
	     (typeid( *lvalue ) == typeid( date_and_time_c                )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   198
	     /***************************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   199
	     /* B.3 - Language ST (Structured Text) */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   200
	     /***************************************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   201
	     /***********************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   202
	     /* B 3.1 - Expressions */
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   203
	     /***********************/
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   204
	     (typeid( *lvalue ) == typeid( or_expression_c                )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   205
	     (typeid( *lvalue ) == typeid( xor_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   206
	     (typeid( *lvalue ) == typeid( and_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   207
	     (typeid( *lvalue ) == typeid( equ_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   208
	     (typeid( *lvalue ) == typeid( notequ_expression_c            )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   209
	     (typeid( *lvalue ) == typeid( lt_expression_c                )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   210
	     (typeid( *lvalue ) == typeid( gt_expression_c                )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   211
	     (typeid( *lvalue ) == typeid( le_expression_c                )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   212
	     (typeid( *lvalue ) == typeid( ge_expression_c                )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   213
	     (typeid( *lvalue ) == typeid( add_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   214
	     (typeid( *lvalue ) == typeid( sub_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   215
	     (typeid( *lvalue ) == typeid( mul_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   216
	     (typeid( *lvalue ) == typeid( div_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   217
	     (typeid( *lvalue ) == typeid( mod_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   218
	     (typeid( *lvalue ) == typeid( power_expression_c             )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   219
	     (typeid( *lvalue ) == typeid( neg_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   220
	     (typeid( *lvalue ) == typeid( not_expression_c               )) ||
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   221
	     (typeid( *lvalue ) == typeid( function_invocation_c          )))
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   222
		STAGE3_ERROR(0, lvalue, lvalue, "Assigning an expression to an OUT or IN_OUT parameter is not allowed.");
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   223
}                                                                  
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   224
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   225
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   226
77bff42a025e Literals are also part of expressions!
Mario de Sousa <msousa@fe.up.pt>
parents: 524
diff changeset
   227
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   228
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   229
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   230
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   231
void lvalue_check_c::verify_is_lvalue(symbol_c *lvalue) {
529
629105224e57 Stop lvalue checks after finding an error in the expression.
Mario de Sousa <msousa@fe.up.pt>
parents: 528
diff changeset
   232
	int init_error_count = error_count;  /* stop the checks once an error has been found... */
629105224e57 Stop lvalue checks after finding an error in the expression.
Mario de Sousa <msousa@fe.up.pt>
parents: 528
diff changeset
   233
	if (error_count == init_error_count)  check_assignment_to_expression(lvalue);
629105224e57 Stop lvalue checks after finding an error in the expression.
Mario de Sousa <msousa@fe.up.pt>
parents: 528
diff changeset
   234
	if (error_count == init_error_count)  check_assignment_to_controlvar(lvalue);
629105224e57 Stop lvalue checks after finding an error in the expression.
Mario de Sousa <msousa@fe.up.pt>
parents: 528
diff changeset
   235
	if (error_count == init_error_count)  check_assignment_to_output(lvalue);
629105224e57 Stop lvalue checks after finding an error in the expression.
Mario de Sousa <msousa@fe.up.pt>
parents: 528
diff changeset
   236
	if (error_count == init_error_count)  check_assignment_to_constant(lvalue);
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   237
}
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   238
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   239
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   240
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   241
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   242
/* check whether all values passed to OUT or IN_OUT parameters are legal lvalues. */
513
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   243
/*
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   244
 * All parameters being passed to the called function MUST be in the parameter list to which f_call points to!
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   245
 * This means that, for non formal function calls in IL, de current (default value) must be artificially added to the
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   246
 * beginning of the parameter list BEFORE calling handle_function_call().
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   247
 */
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   248
#include <string.h> /* required for strcmp() */
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   249
void lvalue_check_c::check_nonformal_call(symbol_c *f_call, symbol_c *f_decl) {
513
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   250
	symbol_c *call_param_value;
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   251
	identifier_c *param_name;
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   252
	function_param_iterator_c       fp_iterator(f_decl);
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   253
	function_call_param_iterator_c fcp_iterator(f_call);
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   254
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   255
	/* Iterating through the non-formal parameters of the function call */
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   256
	while((call_param_value = fcp_iterator.next_nf()) != NULL) {
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   257
		/* Iterate to the next parameter of the function being called.
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   258
		 * Get the name of that parameter, and ignore if EN or ENO.
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   259
		 */
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   260
		do {
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   261
			param_name = fp_iterator.next();
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   262
			/* If there is no other parameter declared, then we are passing too many parameters... */
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   263
			/* This error should have been caught in data type verification, so we simply abandon our check! */
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   264
			if(param_name == NULL) return;
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   265
		} while ((strcmp(param_name->value, "EN") == 0) || (strcmp(param_name->value, "ENO") == 0));
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   266
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   267
		/* Find the corresponding parameter in function declaration, and it's direction (IN, OUT, IN_OUT) */
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   268
		function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   269
		
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   270
		/* We only check if 'call_param_value' is a valid lvalue if the value is being passed
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   271
		 * to a valid paramater of the function being called, and that parameter is either OUT or IN_OUT.
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   272
		 */
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   273
		if ((param_name != NULL) && ((function_param_iterator_c::direction_out == param_direction) || (function_param_iterator_c::direction_inout == param_direction))) {
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   274
			verify_is_lvalue(call_param_value);
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   275
		}
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   276
	}
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   277
}
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   278
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   279
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   280
99aa36a77703 Add lvalue check for non formal function invocations.
Mario de Sousa <msousa@fe.up.pt>
parents: 512
diff changeset
   281
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   282
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   283
  
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   284
/* check whether all values passed to OUT or IN_OUT parameters are legal lvalues. */
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   285
void lvalue_check_c::check_formal_call(symbol_c *f_call, symbol_c *f_decl) {
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   286
	/* if data type semantic verification was unable to determine which function is being called,
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   287
	 * then it does not make sense to go ahead and check for lvalues to unknown parameters.
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   288
	 * We simply bug out!
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   289
	 */
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   290
	if (NULL == f_decl) return;
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   291
	
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   292
	symbol_c *call_param_name;
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   293
	function_param_iterator_c       fp_iterator(f_decl);
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   294
	function_call_param_iterator_c fcp_iterator(f_call);
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   295
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   296
	/* Iterating through the formal parameters of the function call */
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   297
	while((call_param_name = fcp_iterator.next_f()) != NULL) {
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   298
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   299
		/* Obtaining the value being passed in the function call */
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   300
		symbol_c *call_param_value = fcp_iterator.get_current_value();
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   301
		if (NULL == call_param_value) ERROR;
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   302
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   303
		/* Find the corresponding parameter in function declaration, and it's direction (IN, OUT, IN_OUT) */
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   304
		identifier_c *param_name = fp_iterator.search(call_param_name);
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   305
		function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   306
		
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   307
		/* We only check if 'call_param_value' is a valid lvalue if the value is being passed
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   308
		 * to a valid paramater of the function being called, and that parameter is either OUT or IN_OUT.
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   309
		 */
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   310
		if ((param_name != NULL) && ((function_param_iterator_c::direction_out == param_direction) || (function_param_iterator_c::direction_inout == param_direction))) {
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   311
			verify_is_lvalue(call_param_value);
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   312
		}
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   313
	}
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   314
}
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   315
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   316
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   317
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   318
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   319
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   320
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   321
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   322
/**************************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   323
/* B 1.5 - Program organisation units */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   324
/**************************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   325
/***********************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   326
/* B 1.5.1 - Functions */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   327
/***********************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   328
void *lvalue_check_c::visit(function_declaration_c *symbol) {
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   329
	search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   330
	search_var_instance_decl = new search_var_instance_decl_c(symbol);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   331
	symbol->function_body->accept(*this);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   332
	delete search_varfb_instance_type;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   333
	delete search_var_instance_decl;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   334
	search_varfb_instance_type = NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   335
	search_var_instance_decl = NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   336
	return NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   337
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   338
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   339
/*****************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   340
/* B 1.5.2 - Function blocks */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   341
/*****************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   342
void *lvalue_check_c::visit(function_block_declaration_c *symbol) {
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   343
	search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   344
	search_var_instance_decl = new search_var_instance_decl_c(symbol);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   345
	symbol->fblock_body->accept(*this);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   346
	delete search_varfb_instance_type;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   347
	delete search_var_instance_decl;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   348
	search_varfb_instance_type = NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   349
	search_var_instance_decl = NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   350
	return NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   351
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   352
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   353
/**********************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   354
/* B 1.5.3 - Programs */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   355
/**********************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   356
void *lvalue_check_c::visit(program_declaration_c *symbol) {
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   357
	search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   358
	search_var_instance_decl = new search_var_instance_decl_c(symbol);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   359
	symbol->function_block_body->accept(*this);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   360
	delete search_varfb_instance_type;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   361
	delete search_var_instance_decl;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   362
	search_varfb_instance_type = NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   363
	search_var_instance_decl = NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   364
	return NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   365
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   366
527
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   367
/****************************************/
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   368
/* B.2 - Language IL (Instruction List) */
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   369
/****************************************/
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   370
/***********************************/
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   371
/* B 2.1 Instructions and Operands */
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   372
/***********************************/
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   373
void *lvalue_check_c::visit(il_instruction_c *symbol) {
532
cb78940b2cb8 Remove access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents: 529
diff changeset
   374
	/* il_instruction will be NULL when parsing a label with no instruction
cb78940b2cb8 Remove access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents: 529
diff changeset
   375
	 * e.g.:   label1:          <---- il_instruction = NULL!
cb78940b2cb8 Remove access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents: 529
diff changeset
   376
	 *                 LD 33
cb78940b2cb8 Remove access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents: 529
diff changeset
   377
	 *                 ...
cb78940b2cb8 Remove access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents: 529
diff changeset
   378
	 */
cb78940b2cb8 Remove access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents: 529
diff changeset
   379
	if (NULL != symbol->il_instruction)
cb78940b2cb8 Remove access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents: 529
diff changeset
   380
		symbol->il_instruction->accept(*this);
527
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   381
	return NULL;
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   382
}
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   383
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   384
void *lvalue_check_c::visit(il_simple_operation_c *symbol) {
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   385
	/* recursive call to fill the candidate data types list */
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   386
	current_il_operand = symbol->il_operand;
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   387
	symbol->il_simple_operator->accept(*this);
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   388
	current_il_operand = NULL;
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   389
	return NULL;
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   390
}
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   391
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   392
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   393
/*******************/
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   394
/* B 2.2 Operators */
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   395
/*******************/
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   396
void *lvalue_check_c::visit(ST_operator_c *symbol) {
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   397
	verify_is_lvalue(current_il_operand);
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   398
	return NULL;
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   399
}
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   400
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   401
void *lvalue_check_c::visit(STN_operator_c *symbol) {
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   402
	verify_is_lvalue(current_il_operand);
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   403
	return NULL;
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   404
}
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   405
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   406
void *lvalue_check_c::visit(S_operator_c *symbol) {
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   407
	verify_is_lvalue(current_il_operand);
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   408
	return NULL;
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   409
}
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   410
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   411
void *lvalue_check_c::visit(R_operator_c *symbol) {
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   412
	verify_is_lvalue(current_il_operand);
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   413
	return NULL;
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   414
}
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   415
1d83209aabfe Start implement lvalue check in IL instruction.
Manuele Conti <conti.ma@alice.it>
parents: 526
diff changeset
   416
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   417
/***************************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   418
/* B.3 - Language ST (Structured Text) */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   419
/***************************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   420
/***********************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   421
/* B 3.1 - Expressions */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   422
/***********************/
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   423
// 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;)
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   424
void *lvalue_check_c::visit(function_invocation_c *symbol) {
510
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   425
	if (NULL != symbol->formal_param_list   )  check_formal_call   (symbol, symbol->called_function_declaration);
9317e04c1dde Fixing check for assignment to output variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 509
diff changeset
   426
	if (NULL != symbol->nonformal_param_list)  check_nonformal_call(symbol, symbol->called_function_declaration);
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   427
	return NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   428
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   429
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   430
/*********************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   431
/* B 3.2.1 Assignment Statements */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   432
/*********************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   433
void *lvalue_check_c::visit(assignment_statement_c *symbol) {
509
35d391c38a30 Fixing some bugs in lvalue checking (other bugs remain - to be fixed later)
Mario de Sousa <msousa@fe.up.pt>
parents: 508
diff changeset
   434
	verify_is_lvalue(symbol->l_exp);
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   435
	/* We call visit r_exp to check function_call */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   436
	symbol->r_exp->accept(*this);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   437
	return NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   438
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   439
526
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   440
/*****************************************/
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   441
/* B 3.2.2 Subprogram Control Statements */
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   442
/*****************************************/
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   443
void *lvalue_check_c::visit(fb_invocation_c *symbol) {
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   444
	if (NULL != symbol->formal_param_list   )  check_formal_call   (symbol, symbol->called_fb_declaration);
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   445
	if (NULL != symbol->nonformal_param_list)  check_nonformal_call(symbol, symbol->called_fb_declaration);
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   446
	return NULL;
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   447
}
6e610449861a Add lvalue check on fb invocation.
Manuele Conti <conti.ma@alice.it>
parents: 525
diff changeset
   448
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   449
/********************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   450
/* B 3.2.4 Iteration Statements */
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   451
/********************************/
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   452
void *lvalue_check_c::visit(for_statement_c *symbol) {
512
f915ab676d7e Fixing check for assingment to FOR control variables.
Mario de Sousa <msousa@fe.up.pt>
parents: 510
diff changeset
   453
	control_variables.push_back(get_var_name_c::get_name(symbol->control_variable));
508
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   454
	symbol->statement_list->accept(*this);
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   455
	control_variables.pop_back();
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   456
	return NULL;
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   457
}
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   458
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   459
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   460
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   461
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   462
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   463
dc6906338042 Add lvalue check class.
Manuele Conti <conti.ma@alice.it>
parents:
diff changeset
   464