stage3/visit_expression_type.cc
author Mario de Sousa <msousa@fe.up.pt>
Thu, 14 Apr 2011 18:12:59 +0100
changeset 287 9df7fcb9bde5
parent 286 a4f4990d5c66
child 288 200efef43c3e
permissions -rwxr-xr-x
Added tracking of order by which tokens are processed by lexical analyser.
This helps in correctly formating error messages when constructs begin in one file, and end in another.
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
     1
/*
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
     3
 *
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
     4
 *  Copyright (C) 2009-2011  Mario de Sousa (msousa@fe.up.pt)
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 273
diff changeset
     5
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
     6
 *
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
     7
 *  This program is free software: you can redistribute it and/or modify
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
     8
 *  it under the terms of the GNU General Public License as published by
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
     9
 *  the Free Software Foundation, either version 3 of the License, or
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    10
 *  (at your option) any later version.
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    11
 *
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    12
 *  This program is distributed in the hope that it will be useful,
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    15
 *  GNU General Public License for more details.
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    16
 *
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    17
 *  You should have received a copy of the GNU General Public License
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    18
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    19
 *
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    20
 *
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    21
 * This code is made available on the understanding that it will not be
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    22
 * used in safety-critical situations without a full and competent review.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    23
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    24
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    25
/*
267
0a1204bcc9af starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents: 266
diff changeset
    26
 * An IEC 61131-3 compiler.
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    27
 *
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    28
 * Based on the
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    29
 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    30
 *
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    31
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    32
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    33
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    34
/* Verify whether the semantic rules of data type compatibility are being followed.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    35
 *
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    36
 * For example:
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    37
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    38
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    39
#include "visit_expression_type.hh"
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    40
#include <typeinfo>
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    41
#include <list>
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    42
#include <string>
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    43
#include <string.h>
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    44
#include <strings.h>
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    45
287
9df7fcb9bde5 Added tracking of order by which tokens are processed by lexical analyser.
Mario de Sousa <msousa@fe.up.pt>
parents: 286
diff changeset
    46
286
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 284
diff changeset
    47
/*
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    48
#define FIRST_(symbol1, symbol2) (((symbol1)->first_line   < (symbol2)->first_line)   ? (symbol1) :    \
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    49
                                  ((symbol1)->first_line   > (symbol2)->first_line)   ? (symbol2) :    \
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    50
                                  ((symbol1)->first_column < (symbol2)->first_column) ? (symbol1) :    \
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    51
                                  ((symbol1)->first_column > (symbol2)->first_column) ? (symbol2) :    \
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    52
                                  (symbol1))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    53
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    54
#define  LAST_(symbol1, symbol2) (((symbol1)->last_line    < (symbol2)->last_line)    ? (symbol2) :    \
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    55
                                  ((symbol1)->last_line    > (symbol2)->last_line)    ? (symbol1) :    \
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    56
                                  ((symbol1)->last_column  < (symbol2)->last_column)  ? (symbol2) :    \
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    57
                                  ((symbol1)->last_column  > (symbol2)->last_column)  ? (symbol1) :    \
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    58
                                  (symbol1))
287
9df7fcb9bde5 Added tracking of order by which tokens are processed by lexical analyser.
Mario de Sousa <msousa@fe.up.pt>
parents: 286
diff changeset
    59
*/
9df7fcb9bde5 Added tracking of order by which tokens are processed by lexical analyser.
Mario de Sousa <msousa@fe.up.pt>
parents: 286
diff changeset
    60
#define FIRST_(symbol1, symbol2) (((symbol1)->first_order < (symbol2)->first_order)   ? (symbol1) : (symbol2))
9df7fcb9bde5 Added tracking of order by which tokens are processed by lexical analyser.
Mario de Sousa <msousa@fe.up.pt>
parents: 286
diff changeset
    61
#define  LAST_(symbol1, symbol2) (((symbol1)->last_order  > (symbol2)->last_order)    ? (symbol1) : (symbol2))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    62
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    63
#define STAGE3_ERROR(symbol1, symbol2, msg) {                                          \
286
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 284
diff changeset
    64
    fprintf(stderr, "%s:(%d:%d) .. %s(%d:%d): %s\n",                                   \
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 284
diff changeset
    65
           FIRST_(symbol1,symbol2)->first_file, FIRST_(symbol1,symbol2)->first_line, FIRST_(symbol1,symbol2)->first_column, \
a4f4990d5c66 Adding tracking of filename in which token is located.
Mario de Sousa <msousa@fe.up.pt>
parents: 284
diff changeset
    66
           LAST_(symbol1,symbol2) ->last_file,  LAST_(symbol1,symbol2) ->last_line,  LAST_(symbol1,symbol2) ->last_column,  \
259
b6d7c71ff6d8 Adding debug conditional printf()s in stage 3.
Mario de Sousa <msousa@fe.up.pt>
parents: 258
diff changeset
    67
           msg);                                                                       \
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    68
    il_error = true;                                                                   \
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
    69
    error_found = true;                                                                \
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    70
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    71
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    72
259
b6d7c71ff6d8 Adding debug conditional printf()s in stage 3.
Mario de Sousa <msousa@fe.up.pt>
parents: 258
diff changeset
    73
/* set to 1 to see debug info during execution */
b6d7c71ff6d8 Adding debug conditional printf()s in stage 3.
Mario de Sousa <msousa@fe.up.pt>
parents: 258
diff changeset
    74
static int debug = 0;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    75
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    76
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    77
void *visit_expression_type_c::visit(program_declaration_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    78
  search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    79
  symbol->var_declarations->accept(*this);
259
b6d7c71ff6d8 Adding debug conditional printf()s in stage 3.
Mario de Sousa <msousa@fe.up.pt>
parents: 258
diff changeset
    80
  if (debug) printf("checking semantics in body of program %s\n", ((token_c *)(symbol->program_type_name))->value);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    81
  il_parenthesis_level = 0;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    82
  il_error = false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    83
  il_default_variable_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    84
  symbol->function_block_body->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    85
  il_default_variable_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    86
  delete search_varfb_instance_type;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
    87
  search_varfb_instance_type = NULL;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    88
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    89
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    90
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    91
void *visit_expression_type_c::visit(function_declaration_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    92
  search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    93
  symbol->var_declarations_list->accept(*this);
259
b6d7c71ff6d8 Adding debug conditional printf()s in stage 3.
Mario de Sousa <msousa@fe.up.pt>
parents: 258
diff changeset
    94
  if (debug) printf("checking semantics in body of function %s\n", ((token_c *)(symbol->derived_function_name))->value);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    95
  il_parenthesis_level = 0;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    96
  il_error = false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    97
  il_default_variable_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    98
  symbol->function_body->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
    99
  il_default_variable_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   100
  delete search_varfb_instance_type;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   101
  search_varfb_instance_type = NULL;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   102
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   103
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   104
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   105
void *visit_expression_type_c::visit(function_block_declaration_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   106
  search_varfb_instance_type = new search_varfb_instance_type_c(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   107
  symbol->var_declarations->accept(*this);
259
b6d7c71ff6d8 Adding debug conditional printf()s in stage 3.
Mario de Sousa <msousa@fe.up.pt>
parents: 258
diff changeset
   108
  if (debug) printf("checking semantics in body of FB %s\n", ((token_c *)(symbol->fblock_name))->value);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   109
  il_parenthesis_level = 0;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   110
  il_error = false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   111
  il_default_variable_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   112
  symbol->fblock_body->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   113
  il_default_variable_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   114
  delete search_varfb_instance_type;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   115
  search_varfb_instance_type = NULL;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   116
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   117
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   118
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   119
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   120
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   121
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   122
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   123
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   124
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   125
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   126
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   127
visit_expression_type_c::visit_expression_type_c(symbol_c *ignore) {
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   128
  error_found = false;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   129
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   130
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   131
visit_expression_type_c::~visit_expression_type_c(void) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   132
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   133
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   134
bool visit_expression_type_c::get_error_found(void) {
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   135
  return error_found;
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   136
}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   137
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   138
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   139
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   140
/* NOTE on data type handling and literals...
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   141
 * ==========================================
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   142
 *
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   143
 * Literals that are explicitly type cast 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   144
 *   e.g.:   BYTE#42
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   145
 *           INT#65
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   146
 *           TIME#45h23m
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   147
 *               etc...
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   148
 *  are NOT considered literals in the following code.
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   149
 *  Since they are type cast, and their data type is fixed and well known,
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   150
 *  they are treated as a variable of that data type (except when determining lvalues)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   151
 *  In other words, when calling search_constant_type_c on these constants, it returns
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   152
 *  a xxxxx_type_name_c, and not one of the xxxx_literal_c ! 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   153
 *
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   154
 *  When the following code handles a literal, it is really a literal of unknown data type.
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   155
 *    e.g.   42, may be considered an int, a byte, a word, etc... 
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   156
 *
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   157
 * NOTE: type_symbol == NULL is valid!
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   158
 *       This will occur, for example, when and undefined/undeclared symbolic_variable is used in the program.
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   159
 *       This will not be of any type, so we always return false.
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   160
 */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   161
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   162
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   163
bool visit_expression_type_c::is_ANY_ELEMENTARY_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   164
  if (type_symbol == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   165
  return is_ANY_MAGNITUDE_type(type_symbol)
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   166
      || is_ANY_BIT_type      (type_symbol)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   167
      || is_ANY_STRING_type   (type_symbol)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   168
      || is_ANY_DATE_type     (type_symbol);
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   169
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   170
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   171
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   172
bool visit_expression_type_c::is_ANY_SAFEELEMENTARY_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   173
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   174
  return is_ANY_SAFEMAGNITUDE_type(type_symbol)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   175
      || is_ANY_SAFEBIT_type      (type_symbol)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   176
      || is_ANY_SAFESTRING_type   (type_symbol)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   177
      || is_ANY_SAFEDATE_type     (type_symbol);
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   178
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   179
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   180
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   181
bool visit_expression_type_c::is_ANY_ELEMENTARY_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   182
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   183
  /* NOTE: doing 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   184
   *          return is_ANY_SAFEELEMENTARY_type() || is_ANY_ELEMENTARY_type()
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   185
   *       is incorrect, as the literals would never be considered compatible...
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   186
   */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   187
  return is_ANY_MAGNITUDE_compatible(type_symbol)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   188
      || is_ANY_BIT_compatible      (type_symbol)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   189
      || is_ANY_STRING_compatible   (type_symbol)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   190
      || is_ANY_DATE_compatible     (type_symbol);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   191
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   192
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   193
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   194
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   195
bool visit_expression_type_c::is_ANY_MAGNITUDE_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   196
  if (type_symbol == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   197
  if (typeid(*type_symbol) == typeid(time_type_name_c)) {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   198
  return is_ANY_NUM_type(type_symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   199
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   200
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   201
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   202
bool visit_expression_type_c::is_ANY_SAFEMAGNITUDE_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   203
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   204
  if (typeid(*type_symbol) == typeid(safetime_type_name_c)) {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   205
  return is_ANY_SAFENUM_type(type_symbol);
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   206
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   207
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   208
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   209
bool visit_expression_type_c::is_ANY_MAGNITUDE_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   210
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   211
  if (is_ANY_MAGNITUDE_type    (type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   212
  if (is_ANY_SAFEMAGNITUDE_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   213
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   214
  return is_ANY_NUM_compatible(type_symbol);
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   215
}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   216
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   217
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   218
bool visit_expression_type_c::is_ANY_NUM_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   219
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   220
  if (is_ANY_REAL_type(type_symbol))                       {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   221
  if (is_ANY_INT_type(type_symbol))                        {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   222
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   223
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   224
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   225
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   226
bool visit_expression_type_c::is_ANY_SAFENUM_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   227
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   228
  return is_ANY_SAFEREAL_type(type_symbol) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   229
      || is_ANY_SAFEINT_type (type_symbol);
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   230
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   231
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   232
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   233
bool visit_expression_type_c::is_ANY_NUM_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   234
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   235
  if (is_ANY_REAL_compatible(type_symbol))                       {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   236
  if (is_ANY_INT_compatible(type_symbol))                        {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   237
  return false;  
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   238
}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   239
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   240
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   241
bool visit_expression_type_c::is_ANY_DATE_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   242
  if (type_symbol == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   243
  if (typeid(*type_symbol) == typeid(date_type_name_c)) {return true;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   244
  if (typeid(*type_symbol) == typeid(tod_type_name_c))  {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   245
  if (typeid(*type_symbol) == typeid(dt_type_name_c))   {return true;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   246
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   247
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   248
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   249
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   250
bool visit_expression_type_c::is_ANY_SAFEDATE_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   251
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   252
  if (typeid(*type_symbol) == typeid(safedate_type_name_c)) {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   253
  if (typeid(*type_symbol) == typeid(safetod_type_name_c))  {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   254
  if (typeid(*type_symbol) == typeid(safedt_type_name_c))   {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   255
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   256
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   258
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   259
bool visit_expression_type_c::is_ANY_DATE_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   260
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   261
  if (is_ANY_DATE_type    (type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   262
  if (is_ANY_SAFEDATE_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   263
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   264
}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   265
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   266
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   267
bool visit_expression_type_c::is_ANY_STRING_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   268
  if (type_symbol == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   269
  if (typeid(*type_symbol) == typeid(string_type_name_c)) {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   270
  if (typeid(*type_symbol) == typeid(wstring_type_name_c)) {return true;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   271
// TODO literal_string ???
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   272
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   273
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   274
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   275
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   276
bool visit_expression_type_c::is_ANY_SAFESTRING_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   277
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   278
  if (typeid(*type_symbol) == typeid(safestring_type_name_c)) {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   279
  if (typeid(*type_symbol) == typeid(safewstring_type_name_c)) {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   280
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   281
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   282
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   283
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   284
bool visit_expression_type_c::is_ANY_STRING_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   285
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   286
  if (is_ANY_STRING_type    (type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   287
  if (is_ANY_SAFESTRING_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   288
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   289
}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   290
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   291
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   292
bool visit_expression_type_c::is_ANY_INT_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   293
  if (type_symbol == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   294
  if (typeid(*type_symbol) == typeid(sint_type_name_c))  {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   295
  if (typeid(*type_symbol) == typeid(int_type_name_c))   {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   296
  if (typeid(*type_symbol) == typeid(dint_type_name_c))  {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   297
  if (typeid(*type_symbol) == typeid(lint_type_name_c))  {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   298
  if (typeid(*type_symbol) == typeid(usint_type_name_c)) {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   299
  if (typeid(*type_symbol) == typeid(uint_type_name_c))  {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   300
  if (typeid(*type_symbol) == typeid(udint_type_name_c)) {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   301
  if (typeid(*type_symbol) == typeid(ulint_type_name_c)) {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   302
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   303
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   304
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   305
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   306
bool visit_expression_type_c::is_ANY_SAFEINT_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   307
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   308
  if (typeid(*type_symbol) == typeid(safesint_type_name_c))  {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   309
  if (typeid(*type_symbol) == typeid(safeint_type_name_c))   {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   310
  if (typeid(*type_symbol) == typeid(safedint_type_name_c))  {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   311
  if (typeid(*type_symbol) == typeid(safelint_type_name_c))  {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   312
  if (typeid(*type_symbol) == typeid(safeusint_type_name_c)) {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   313
  if (typeid(*type_symbol) == typeid(safeuint_type_name_c))  {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   314
  if (typeid(*type_symbol) == typeid(safeudint_type_name_c)) {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   315
  if (typeid(*type_symbol) == typeid(safeulint_type_name_c)) {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   316
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   317
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   318
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   319
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   320
bool visit_expression_type_c::is_ANY_INT_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   321
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   322
  if (is_ANY_INT_type    (type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   323
  if (is_ANY_SAFEINT_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   324
  if (is_literal_integer_type(type_symbol))          {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   325
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   326
}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   327
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   328
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   329
bool visit_expression_type_c::is_ANY_REAL_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   330
  if (type_symbol == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   331
  if (typeid(*type_symbol) == typeid(real_type_name_c))  {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   332
  if (typeid(*type_symbol) == typeid(lreal_type_name_c)) {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   333
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   334
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   335
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   336
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   337
bool visit_expression_type_c::is_ANY_SAFEREAL_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   338
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   339
  if (typeid(*type_symbol) == typeid(safereal_type_name_c))  {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   340
  if (typeid(*type_symbol) == typeid(safelreal_type_name_c)) {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   341
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   342
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   343
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   344
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   345
bool visit_expression_type_c::is_ANY_REAL_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   346
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   347
  if (is_ANY_REAL_type    (type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   348
  if (is_ANY_SAFEREAL_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   349
  if (is_literal_real_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   350
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   351
}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   352
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   353
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   354
bool visit_expression_type_c::is_ANY_BIT_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   355
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   356
  if (typeid(*type_symbol) == typeid(bool_type_name_c))     {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   357
  if (typeid(*type_symbol) == typeid(byte_type_name_c))     {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   358
  if (typeid(*type_symbol) == typeid(word_type_name_c))     {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   359
  if (typeid(*type_symbol) == typeid(dword_type_name_c))    {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   360
  if (typeid(*type_symbol) == typeid(lword_type_name_c))    {return true;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   361
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   362
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   363
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   364
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   365
bool visit_expression_type_c::is_ANY_SAFEBIT_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   366
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   367
  if (typeid(*type_symbol) == typeid(safebool_type_name_c))     {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   368
  if (typeid(*type_symbol) == typeid(safebyte_type_name_c))     {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   369
  if (typeid(*type_symbol) == typeid(safeword_type_name_c))     {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   370
  if (typeid(*type_symbol) == typeid(safedword_type_name_c))    {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   371
  if (typeid(*type_symbol) == typeid(safelword_type_name_c))    {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   372
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   373
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   374
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   375
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   376
bool visit_expression_type_c::is_ANY_BIT_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   377
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   378
  if (is_ANY_BIT_type    (type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   379
  if (is_ANY_SAFEBIT_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   380
  if (is_nonneg_literal_integer_type(type_symbol))   {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   381
  if (is_literal_bool_type(type_symbol))             {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   382
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   383
}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   384
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   385
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   386
bool visit_expression_type_c::is_BOOL_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   387
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   388
  if (typeid(*type_symbol) == typeid(bool_type_name_c))      {return true;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   389
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   390
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   391
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   392
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   393
bool visit_expression_type_c::is_SAFEBOOL_type(symbol_c *type_symbol){
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   394
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   395
  if (typeid(*type_symbol) == typeid(safebool_type_name_c))  {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   396
  return false;  
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   397
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   398
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   399
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   400
bool visit_expression_type_c::is_ANY_BOOL_compatible(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   401
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   402
  if (is_BOOL_type    (type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   403
  if (is_SAFEBOOL_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   404
  if (is_literal_bool_type(type_symbol))              {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   405
  return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   406
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   407
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   408
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   409
#define is_type(type_name_symbol, type_name_class)  (typeid(*type_name_symbol) == typeid(type_name_class))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   410
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   411
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   412
#define sizeoftype(symbol) get_sizeof_datatype_c::getsize(symbol)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   413
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   414
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   415
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   416
bool visit_expression_type_c::is_literal_integer_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   417
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   418
  if (typeid(*type_symbol) == typeid(neg_integer_c))        {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   419
  return is_nonneg_literal_integer_type(type_symbol);
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   420
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   421
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   422
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   423
/* A helper function... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   424
bool visit_expression_type_c::is_nonneg_literal_integer_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   425
  if (type_symbol == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   426
  if (typeid(*type_symbol) == typeid(integer_c))        {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   427
  if (typeid(*type_symbol) == typeid(binary_integer_c)) {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   428
  if (typeid(*type_symbol) == typeid(octal_integer_c))  {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   429
  if (typeid(*type_symbol) == typeid(hex_integer_c))    {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   430
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   431
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   432
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   433
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   434
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   435
bool visit_expression_type_c::is_literal_real_type(symbol_c *type_symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   436
  if (type_symbol == NULL) {return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   437
  if (typeid(*type_symbol) == typeid(real_c))     {return true;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   438
  if (typeid(*type_symbol) == typeid(neg_real_c)) {return true;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   439
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   440
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   441
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   442
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   443
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   444
bool visit_expression_type_c::is_literal_bool_type(symbol_c *type_symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   445
  bool_type_name_c bool_t;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   446
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   447
  if (type_symbol == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   448
  if (typeid(*type_symbol) == typeid(boolean_true_c))    {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   449
  if (typeid(*type_symbol) == typeid(boolean_false_c))   {return true;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   450
  if (is_nonneg_literal_integer_type(type_symbol))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   451
    if (sizeoftype(&bool_t) >= sizeoftype(type_symbol))  {return true;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   452
  return false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   453
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   454
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   455
/* Determine the common data type between two data types.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   456
 * If no common data type found, return NULL.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   457
 *
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   458
 * If data types are identical, return the first (actually any would do...).
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   459
 * If any of the data types is a literal, we confirm that 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   460
 *   the literal uses less bits than the fixed size data type.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   461
 *   e.g. BYTE and 1024 returns NULL
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   462
 *        BYTE and 255  returns BYTE
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   463
 *
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   464
 * If two literals, then return the literal that requires more bits...
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   465
 */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   466
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   467
symbol_c *visit_expression_type_c::common_type__(symbol_c *first_type, symbol_c *second_type) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   468
  if (first_type == NULL && second_type == NULL) {return NULL;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   469
  if (first_type == NULL)  {return second_type;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   470
  if (second_type == NULL) {return first_type;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   471
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   472
  if (is_literal_integer_type(first_type) && is_literal_integer_type(second_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   473
    {return ((sizeoftype(first_type) > sizeoftype(second_type))? first_type:second_type);}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   474
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   475
  if (is_literal_real_type(first_type) && is_literal_real_type(second_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   476
    {return ((sizeoftype(first_type) > sizeoftype(second_type))? first_type:second_type);}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   477
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   478
  if (is_literal_bool_type(first_type) && is_literal_bool_type(second_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   479
    {return first_type;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   480
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   481
  /* The following check can only be made after the is_literal_XXXX checks */
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   482
  /* When two literals of the same type, with identical typeid's are checked,
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   483
   * we must return the one that occupies more bits... This is done above.
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   484
   */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   485
  if (typeid(*first_type) == typeid(*second_type)) {return first_type;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   486
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   487
  /* NOTE Although a BOOL is also an ANY_BIT, we must check it explicitly since some
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   488
   *       literal bool values are not literal integers...
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   489
   */ 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   490
  if (is_BOOL_type(first_type)        && is_literal_bool_type(second_type))    {return first_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   491
  if (is_BOOL_type(second_type)       && is_literal_bool_type(first_type))     {return second_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   492
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   493
  if (is_SAFEBOOL_type(first_type)    && is_literal_bool_type(second_type))    {return first_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   494
  if (is_SAFEBOOL_type(second_type)   && is_literal_bool_type(first_type))     {return second_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   495
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   496
  if (is_SAFEBOOL_type(first_type)    && is_BOOL_type(second_type))            {return second_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   497
  if (is_SAFEBOOL_type(second_type)   && is_BOOL_type(first_type))             {return first_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   498
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   499
  if (is_ANY_BIT_type(first_type)     && is_nonneg_literal_integer_type(second_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   500
    {return ((sizeoftype(first_type)  >= sizeoftype(second_type))? first_type :NULL);}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   501
  if (is_ANY_BIT_type(second_type)    && is_nonneg_literal_integer_type(first_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   502
    {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   503
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   504
  if (is_ANY_SAFEBIT_type(first_type)     && is_nonneg_literal_integer_type(second_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   505
    {return ((sizeoftype(first_type)  >= sizeoftype(second_type))? first_type :NULL);}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   506
  if (is_ANY_SAFEBIT_type(second_type)    && is_nonneg_literal_integer_type(first_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   507
    {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   508
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   509
  if  (is_ANY_SAFEBIT_type(first_type)    && is_ANY_BIT_type(second_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   510
    {return ((sizeoftype(first_type) == sizeoftype(second_type))? second_type:NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   511
  if  (is_ANY_SAFEBIT_type(second_type)   && is_ANY_BIT_type(first_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   512
    {return ((sizeoftype(first_type) == sizeoftype(second_type))? first_type :NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   513
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   514
  if (is_ANY_INT_type(first_type)     && is_literal_integer_type(second_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   515
    {return ((sizeoftype(first_type)  >= sizeoftype(second_type))? first_type :NULL);}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   516
  if (is_ANY_INT_type(second_type)    && is_literal_integer_type(first_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   517
    {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   518
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   519
  if (is_ANY_SAFEINT_type(first_type)     && is_literal_integer_type(second_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   520
    {return ((sizeoftype(first_type)  >= sizeoftype(second_type))? first_type :NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   521
  if (is_ANY_SAFEINT_type(second_type)    && is_literal_integer_type(first_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   522
    {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   523
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   524
  if  (is_ANY_SAFEINT_type(first_type)    && is_ANY_INT_type(second_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   525
    {return ((sizeoftype(first_type) == sizeoftype(second_type))? second_type:NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   526
  if  (is_ANY_SAFEINT_type(second_type)   && is_ANY_INT_type(first_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   527
    {return ((sizeoftype(first_type) == sizeoftype(second_type))? first_type :NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   528
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   529
  if (is_ANY_REAL_type(first_type)    && is_literal_real_type(second_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   530
    {return ((sizeoftype(first_type)  >= sizeoftype(second_type))? first_type :NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   531
  if (is_ANY_REAL_type(second_type)   && is_literal_real_type(first_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   532
    {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   533
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   534
  if (is_ANY_SAFEREAL_type(first_type)    && is_literal_real_type(second_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   535
    {return ((sizeoftype(first_type)  >= sizeoftype(second_type))? first_type :NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   536
  if (is_ANY_SAFEREAL_type(second_type)   && is_literal_real_type(first_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   537
    {return ((sizeoftype(second_type) >= sizeoftype(first_type)) ? second_type:NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   538
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   539
  if  (is_ANY_SAFEREAL_type(first_type)    && is_ANY_REAL_type(second_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   540
    {return ((sizeoftype(first_type) == sizeoftype(second_type))? second_type:NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   541
  if  (is_ANY_SAFEREAL_type(second_type)   && is_ANY_REAL_type(first_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   542
    {return ((sizeoftype(first_type) == sizeoftype(second_type))? first_type :NULL);}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   543
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   544
  /* the Time and Date types... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   545
  if (is_type(first_type,  safetime_type_name_c) && is_type(second_type, time_type_name_c))  {return second_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   546
  if (is_type(second_type, safetime_type_name_c) && is_type( first_type, time_type_name_c))  {return  first_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   547
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   548
  if (is_type(first_type,  safedate_type_name_c) && is_type(second_type, date_type_name_c))  {return second_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   549
  if (is_type(second_type, safedate_type_name_c) && is_type( first_type, date_type_name_c))  {return  first_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   550
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   551
  if (is_type(first_type,  safedt_type_name_c)   && is_type(second_type, dt_type_name_c))    {return second_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   552
  if (is_type(second_type, safedt_type_name_c)   && is_type( first_type, dt_type_name_c))    {return  first_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   553
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   554
  if (is_type(first_type,  safetod_type_name_c)  && is_type(second_type, tod_type_name_c))   {return second_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   555
  if (is_type(second_type, safetod_type_name_c)  && is_type( first_type, tod_type_name_c))   {return  first_type;}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   556
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   557
  /* no common type */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   558
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   559
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   560
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   561
/* Determine the common data type between two data types.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   562
 * Unlike the common_type__() function, we stop the compiler with an ERROR
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   563
 *  if no common data type is found.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   564
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   565
symbol_c *visit_expression_type_c::common_type(symbol_c *first_type, symbol_c *second_type) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   566
/*  
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   567
  symbol_c *res = common_type__(first_type, second_type);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   568
  if (NULL == res) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   569
  return res;
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   570
*/
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   571
  return common_type__(first_type, second_type);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   572
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   573
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   574
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   575
/* Return TRUE if the second (value) data type may be assigned to a variable of the first (variable) data type
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   576
 * such as: 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   577
 *     var_type     value_type
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   578
 *    BOOL           BYTE#7     -> returns false
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   579
 *    INT            INT#7      -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   580
 *    INT            7          -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   581
 *    REAL           7.89       -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   582
 *    REAL           7          -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   583
 *    INT            7.89       -> returns false
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   584
 *    SAFEBOOL       BOOL#1     -> returns false   !!!
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   585
 *   etc...
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   586
 *
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   587
 * NOTE: It is assumed that the var_type is the data type of an lvalue
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   588
 */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   589
bool visit_expression_type_c::is_valid_assignment(symbol_c *var_type, symbol_c *value_type) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   590
  if (var_type == NULL)   {/* STAGE3_ERROR(value_type, value_type, "Var_type   == NULL"); */ return false;}
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   591
  if (value_type == NULL) {/* STAGE3_ERROR(var_type,   var_type,   "Value_type == NULL"); */ return false;}
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   592
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   593
  symbol_c *common_type = common_type__(var_type, value_type);
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   594
  if (NULL == common_type)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   595
    return false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   596
  return (typeid(*var_type) == typeid(*common_type));
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   597
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   598
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   599
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   600
/* Return TRUE if there is a common data type, otherwise return FALSE
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   601
 * i.e., return TRUE if both data types may be used simultaneously in an expression
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   602
 * such as:
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   603
 *    BOOL#0     AND BYTE#7  -> returns false
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   604
 *    0          AND BYTE#7  -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   605
 *    INT#10     AND INT#7   -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   606
 *    INT#10     AND 7       -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   607
 *    REAL#34.3  AND 7.89    -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   608
 *    REAL#34.3  AND 7       -> returns true
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   609
 *    INT#10     AND 7.89    -> returns false
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   610
 *    SAFEBOOL#0 AND BOOL#1  -> returns true   !!!
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   611
 *   etc...
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   612
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   613
bool visit_expression_type_c::is_compatible_type(symbol_c *first_type, symbol_c *second_type) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   614
  if (first_type == NULL || second_type == NULL) {return false;}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   615
  return (NULL != common_type__(first_type, second_type));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   616
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   617
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   618
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   619
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   620
#define is_num_type      is_ANY_NUM_compatible
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   621
#define is_integer_type  is_ANY_INT_compatible
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   622
#define is_real_type     is_ANY_REAL_compatible
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   623
#define is_binary_type   is_ANY_BIT_compatible
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   624
 /* actually the ROR, ROL, SHL, and SHR function also accept boolean type! */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   625
#define is_nbinary_type  is_ANY_BIT_compatible
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   626
#define compute_standard_function_default visit_expression_type_c::compute_standard_function_default
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   627
#define compute_standard_function_il visit_expression_type_c::compute_standard_function_il
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   628
#define search_expression_type_c visit_expression_type_c
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   629
#define search(x) search_f(x)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   630
#define next() next_nf()
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   631
//     #define search_constant_type_c::constant_int_type_name  search_expression_type_c::integer
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   632
#define constant_int_type_name  integer
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   633
#define is_same_type is_compatible_type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   634
#include "../absyntax_utils/search_type_code.c"
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   635
#undef is_same_type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   636
#undef constant_int_type_name
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   637
//     #undef search_constant_type_c::constant_int_type_name
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   638
#undef next
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   639
#undef search
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   640
#undef compute_standard_function_default
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   641
#undef compute_standard_function_il
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   642
#undef search_expression_type_c
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   643
#undef is_real_type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   644
#undef is_binary_type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   645
#undef is_nbinary_type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   646
#undef is_integer_type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   647
#undef is_num_type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   648
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   649
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   650
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   651
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   652
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   653
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   654
/* A helper function... */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   655
/*
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   656
symbol_c *visit_expression_type_c::compute_boolean_expression(symbol_c *left_type, symbol_c *right_type,
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   657
                                                              is_data_type_t is_data_type) {
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   658
*/
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   659
symbol_c *visit_expression_type_c::compute_expression(symbol_c *left_type,      symbol_c *right_type,     is_data_type_t is_data_type,
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   660
						      symbol_c *left_expr, symbol_c *right_expr) {
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   661
  bool error = false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   662
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   663
  if (!(this->*is_data_type)(left_type)) {
263
bcb92f5b9a91 Adding some debug info
Mario de Sousa <msousa@fe.up.pt>
parents: 262
diff changeset
   664
    if (debug) printf("visit_expression_type_c::compute_expression(): invalid left_type\n");
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   665
    if (left_expr != NULL)
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
   666
      STAGE3_ERROR(left_expr, left_expr, "Invalid data type of operand, or of data resulting from previous IL instructions.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   667
    error = true;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   668
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   669
  if (!(this->*is_data_type)(right_type)) {
263
bcb92f5b9a91 Adding some debug info
Mario de Sousa <msousa@fe.up.pt>
parents: 262
diff changeset
   670
    if (debug) printf("visit_expression_type_c::compute_expression(): invalid right_type\n");
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   671
    if (right_expr != NULL)
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
   672
      STAGE3_ERROR(right_expr, right_expr, "Invalid data type of operand.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   673
    error = true;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   674
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   675
  if (!is_compatible_type(left_type, right_type)) {
263
bcb92f5b9a91 Adding some debug info
Mario de Sousa <msousa@fe.up.pt>
parents: 262
diff changeset
   676
    if (debug) printf("visit_expression_type_c::compute_expression(): left_type & right_type are incompatible\n");
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   677
    if ((left_expr != NULL) && (right_expr != NULL))
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   678
      STAGE3_ERROR(left_expr, right_expr, "Type mismatch between operands.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   679
    error = true;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   680
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   681
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   682
  if (error)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   683
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   684
  else
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   685
    return common_type(left_type, right_type);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   686
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   687
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   688
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   689
# if 0
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   690
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   691
symbol_c *visit_expression_type_c::compute_numeric_expression(symbol_c *left_type, symbol_c *right_type,
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   692
                                                              is_data_type_t is_data_type) {
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   693
  bool error = false;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   694
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   695
  if (!(this->*is_data_type)(left_type)) {
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   696
    STAGE3_ERROR(left_type, right_type, "Invalid data type of left operand.");
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   697
    error = true;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   698
  }
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   699
  if (!(this->*is_data_type)(right_type)) {
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   700
    STAGE3_ERROR(left_type, right_type, "Invalid data type of right operand.");
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   701
    error = true;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   702
  }
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   703
  if (!is_compatible_type(left_type, right_type)) {
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   704
    STAGE3_ERROR(left_type, right_type, "Type mismatch between operands.");
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   705
    error = true;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   706
  }
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   707
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   708
/*
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   709
  if (is_literal_integer_type(left_type) || is_literal_real_type(left_type)) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   710
    return right_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   711
  } else {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   712
    return left_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   713
  }
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   714
*/
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   715
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   716
  if (error)
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   717
    return NULL;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   718
  else
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   719
    return common_type(left_type, right_type);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   720
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   721
  /* humour the compiler... */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   722
/*
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   723
  return NULL;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   724
*/
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   725
}
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   726
#endif
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   727
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   728
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   729
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   730
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   731
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   732
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   733
/* check the semantics of a FB or Function non-formal call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   734
/* e.g. foo(1, 2, 3, 4);  */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   735
void visit_expression_type_c::check_nonformal_call(symbol_c *f_call, symbol_c *f_decl, bool use_il_defvar) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   736
  symbol_c *call_param_value, *call_param_type, *param_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   737
  identifier_c *param_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   738
  function_param_iterator_c       fp_iterator(f_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   739
  function_call_param_iterator_c fcp_iterator(f_call);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   740
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   741
  /* if use_il_defvar, then the first parameter for the call comes from the il_default_variable */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   742
  if (use_il_defvar) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   743
    /* The first parameter of the function corresponds to the il_default_variable_type of the function call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   744
    do {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   745
      param_name = fp_iterator.next();
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   746
      if(param_name == NULL) break;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   747
      /*  The EN and ENO parameters are default parameters.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   748
       *  In the non-formal invocation of a function there can be no assignment of
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   749
       * values to these parameters. Therefore, we ignore the parameters declared
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   750
       * in the function.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   751
       */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   752
    } while ((strcmp(param_name->value, "EN") == 0) || (strcmp(param_name->value, "ENO") == 0));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   753
    /* If the function does not have any parameters (param_name == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   754
     * then we cannot compare its type with the il_default_variable_type.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   755
     */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   756
    if(param_name != NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   757
      param_type = fp_iterator.param_type();
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   758
      if(!is_valid_assignment(param_type, il_default_variable_type)) 
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   759
        STAGE3_ERROR(f_call, f_call, "In function/FB call, first parameter has invalid data type.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   760
    }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   761
  } // if (use_il_defvar)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   762
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   763
  /* Iterating through the non-formal parameters of the function call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   764
  while((call_param_value = fcp_iterator.next_nf()) != NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   765
    /* Obtaining the type of the current parameter in the function call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   766
    call_param_type = base_type((symbol_c*)call_param_value->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   767
    if (call_param_type == NULL) STAGE3_ERROR(call_param_value, call_param_value, "Could not determine data type of value being passed in function/FB call.");;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   768
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   769
    /* Iterate to the next parameter of the function being called.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   770
     * Get the name of that parameter, and ignore if EN or ENO.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   771
     */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   772
    do {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   773
      param_name = fp_iterator.next();
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   774
      /* If there is no parameter declared with that name */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   775
      if(param_name == NULL) {STAGE3_ERROR(f_call, f_call, "Too many parameters in function/FB call."); break;}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   776
    } while ((strcmp(param_name->value, "EN") == 0) || (strcmp(param_name->value, "ENO") == 0));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   777
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   778
    if(param_name != NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   779
      /* Get the parameter type */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   780
      param_type = fp_iterator.param_type();
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   781
      /* If the declared parameter and the parameter from the function call do no have the same type */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   782
      if(!is_valid_assignment(param_type, call_param_type)) STAGE3_ERROR(call_param_value, call_param_value, "Type mismatch in function/FB call parameter.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   783
    }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   784
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   785
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   786
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   787
void visit_expression_type_c::compute_input_operatores(symbol_c *symbol, const char *input_operator){
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   788
  symbol_c *call_param_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   789
  symbol_c *fb_decl = il_operand_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   790
    /* The following should never occur. The function block must be defined, 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   791
     * and the FB type being called MUST be in the symtable... 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   792
     * This was all already checked at stage 2!
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   793
     */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   794
  if (NULL == fb_decl){ 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   795
    STAGE3_ERROR(symbol, symbol, "Parameter operator needs an instance of a function block operand.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   796
    ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   797
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   798
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   799
   /* Iterating through the formal parameters of the function call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   800
  identifier_c call_param_name(input_operator);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   801
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   802
  /* Obtaining the type of the value being passed in the function call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   803
  call_param_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   804
  if (call_param_type == NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   805
    STAGE3_ERROR(&call_param_name, &call_param_name, "Could not determine data type of value being passed in function/FB call.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   806
    /* The data value being passed is possibly any enumerated type value.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   807
     * We do not yet handle semantic verification of enumerated types.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   808
     */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   809
    ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   810
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   811
  call_param_type = base_type(call_param_type);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   812
  if (call_param_type == NULL) STAGE3_ERROR(&call_param_name, &call_param_name, "Could not determine data type of value being passed in function/FB call.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   813
  
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   814
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   815
  check_formal_parameter(&call_param_name, call_param_type, fb_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   816
//   return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   817
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   818
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   819
void visit_expression_type_c::check_formal_parameter(symbol_c *call_param_name, symbol_c *call_param_type, symbol_c *f_decl) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   820
  symbol_c *param_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   821
  identifier_c *param_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   822
  function_param_iterator_c       fp_iterator(f_decl);
263
bcb92f5b9a91 Adding some debug info
Mario de Sousa <msousa@fe.up.pt>
parents: 262
diff changeset
   823
 
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   824
  /* Find the corresponding parameter of the function being called */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   825
  param_name = fp_iterator.search(call_param_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   826
  if(param_name == NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   827
    STAGE3_ERROR(call_param_name, call_param_name, "Invalid parameter in function/FB call.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   828
  } else {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   829
    /* Get the parameter type */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   830
    param_type = fp_iterator.param_type();
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   831
    /* If the declared parameter and the parameter from the function call have the same type */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   832
    if(!is_valid_assignment(param_type, call_param_type)) STAGE3_ERROR(call_param_name, call_param_name, "Type mismatch function/FB call parameter.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   833
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   834
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   835
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   836
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   837
/* A helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   838
/* check the semantics of a FB or Function formal call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   839
/* e.g. foo(IN1 := 1, OUT1 =>x, EN := true);  */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   840
void visit_expression_type_c::check_formal_call(symbol_c *f_call, symbol_c *f_decl) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   841
  symbol_c *call_param_value, *call_param_type, *call_param_name, *param_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   842
  symbol_c *verify_duplicate_param;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   843
  identifier_c *param_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   844
  function_param_iterator_c       fp_iterator(f_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   845
  function_call_param_iterator_c fcp_iterator(f_call);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   846
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   847
  /* Iterating through the formal parameters of the function call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   848
  while((call_param_name = fcp_iterator.next_f()) != NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   849
        
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   850
    /* Obtaining the value being passed in the function call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   851
    call_param_value = fcp_iterator.get_current_value();
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   852
    /* the following should never occur. If it does, then we have a bug in our code... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   853
    if (NULL == call_param_value) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   854
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   855
    /* Checking if there are duplicated parameter values */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   856
    verify_duplicate_param = fcp_iterator.search_f(call_param_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   857
    if(verify_duplicate_param != call_param_value){
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   858
      STAGE3_ERROR(call_param_name, verify_duplicate_param, "Duplicated parameter values.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   859
    }   
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   860
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   861
    /* Obtaining the type of the value being passed in the function call */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   862
    call_param_type = (symbol_c*)call_param_value->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   863
    if (call_param_type == NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   864
      STAGE3_ERROR(call_param_name, call_param_value, "Could not determine data type of value being passed in function/FB call.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   865
      /* The data value being passed is possibly any enumerated type value.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   866
       * We do not yet handle semantic verification of enumerated types.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   867
       */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   868
      ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   869
    }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   870
    call_param_type = base_type(call_param_type);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   871
    if (call_param_type == NULL) STAGE3_ERROR(call_param_name, call_param_value, "Could not determine data type of value being passed in function/FB call.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   872
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   873
    /* Find the corresponding parameter of the function being called */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   874
    param_name = fp_iterator.search(call_param_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   875
    if(param_name == NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   876
      STAGE3_ERROR(call_param_name, call_param_name, "Invalid parameter in function/FB call.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   877
    } else {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   878
      /* Get the parameter type */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   879
      param_type = fp_iterator.param_type();
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   880
      /* If the declared parameter and the parameter from the function call have the same type */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
   881
      if(!is_valid_assignment(param_type, call_param_type)) STAGE3_ERROR(call_param_name, call_param_value, "Type mismatch function/FB call parameter.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   882
    }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   883
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   884
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   885
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   886
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   887
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   888
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   889
/* a helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   890
symbol_c *visit_expression_type_c::base_type(symbol_c *symbol) {
262
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   891
  /* NOTE: symbol == NULL is valid. It will occur when, for e.g., an undefined/undeclared symbolic_variable is used
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   892
   *       in the code.
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   893
   */
197ba42d78b2 Do not crash when checking semantics of undeclared symbolic_variable.
Mario de Sousa <msousa@fe.up.pt>
parents: 260
diff changeset
   894
  if (symbol == NULL) return NULL;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   895
  return (symbol_c *)symbol->accept(search_base_type);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   896
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   897
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   898
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   899
/* a helper function... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   900
void *visit_expression_type_c::verify_null(symbol_c *symbol){
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   901
  if(il_default_variable_type == NULL){
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
   902
    STAGE3_ERROR(symbol, symbol, "Missing LD instruction (or equivalent) before this instruction.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   903
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   904
  if(il_operand_type == NULL){
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
   905
    STAGE3_ERROR(symbol, symbol, "This instruction requires an operand.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   906
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   907
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   908
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   909
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   910
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   911
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   912
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   913
/*********************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   914
/* B 1.4 - Variables */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   915
/*********************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   916
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   917
void *visit_expression_type_c::visit(symbolic_variable_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   918
  return search_varfb_instance_type->get_type(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   919
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   920
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   921
/********************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   922
/* B 1.4.1 - Directly Represented Variables */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   923
/********************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   924
void *visit_expression_type_c::visit(direct_variable_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   925
  switch (symbol->value[2]) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   926
    case 'X': // bit - 1 bit
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   927
      return (void *)&bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   928
    case 'B': // byte - 8 bits
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   929
      return (void *)&byte_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   930
    case 'W': // word - 16 bits
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   931
      return (void *)&word_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   932
    case 'D': // double word - 32 bits
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   933
      return (void *)&dword_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   934
    case 'L': // long word - 64 bits
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   935
      return (void *)&lword_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   936
    default:  // if none of the above, then the empty string was used <=> boolean 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   937
      return (void *)&bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   938
   }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   939
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   940
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   941
/*************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   942
/* B 1.4.2 - Multi-element variables */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   943
/*************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   944
void *visit_expression_type_c::visit(array_variable_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   945
  return search_varfb_instance_type->get_type(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   946
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   947
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   948
void *visit_expression_type_c::visit(structured_variable_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   949
  return search_varfb_instance_type->get_type(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   950
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   951
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   952
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   953
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   954
/****************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   955
/* B.2 - Language IL (Instruction List) */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   956
/****************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   957
/***********************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   958
/* B 2.1 Instructions and Operands */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   959
/***********************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   960
/*| instruction_list il_instruction */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   961
/* The visitor of the base class search_visitor_c will handle calling each instruction in the list.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   962
 * We do not need to do anything here...
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   963
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   964
// void *visit_expression_type_c::visit(instruction_list_c *symbol)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   965
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   966
/* | label ':' [il_incomplete_instruction] eol_list */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   967
//SYM_REF2(il_instruction_c, label, il_instruction)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   968
// void *visit_expression_type_c::visit(il_instruction_c *symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   969
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   970
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   971
/* | il_simple_operator [il_operand] */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   972
// SYM_REF2(il_simple_operation_c, il_simple_operator, il_operand)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   973
void *visit_expression_type_c::visit(il_simple_operation_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   974
  if (il_error)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   975
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   976
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   977
  /* determine the data type of the operand */
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
   978
  il_operand = symbol->il_operand;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   979
  if (symbol->il_operand != NULL){
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   980
    il_operand_type = base_type((symbol_c *)symbol->il_operand->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   981
  } else {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   982
    il_operand_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   983
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   984
  /* recursive call to see whether data types are compatible */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   985
  symbol->il_simple_operator->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   986
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   987
  il_operand_type = NULL;
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
   988
  il_operand = NULL;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   989
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   990
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   991
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   992
// | function_name [il_operand_list] */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   993
//SYM_REF2(il_function_call_c, function_name, il_operand_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   994
void *visit_expression_type_c::visit(il_function_call_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   995
  if (il_error)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   996
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   997
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   998
  /* First find the declaration of the function being called! */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
   999
  function_declaration_c *f_decl = function_symtable.find_value(symbol->function_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1000
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1001
  symbol_c *return_data_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1002
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1003
  if (f_decl == function_symtable.end_value()) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1004
    function_type_t current_function_type = get_function_type((identifier_c *)symbol->function_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1005
    if (current_function_type == function_none) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1006
    /*  This code is for the functions that the user did not declare and that are
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1007
     * part of the IL or ST languagem (built-in functions).
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1008
     *  For now we won't do the semantics analysis for that kind of functions.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1009
    */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1010
    /*  
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1011
    return_data_type = (symbol_c *)search_expression_type->compute_standard_function_default(NULL, symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1012
    if (NULL == return_data_type) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1013
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1014
    function_call_param_iterator_c fcp_iterator(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1015
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1016
    int nb_param = 0;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1017
    if (symbol->il_param_list != NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1018
      nb_param += ((list_c *)symbol->il_param_list)->n;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1019
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1020
    identifier_c en_param_name("EN");*/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1021
    /* Get the value from EN param */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1022
    /*symbol_c *EN_param_value = fcp_iterator.search(&en_param_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1023
    if (EN_param_value == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1024
      EN_param_value = (symbol_c*)(new boolean_literal_c((symbol_c*)(new bool_type_name_c()), new boolean_true_c()));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1025
    else
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1026
      nb_param --;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1027
    ADD_PARAM_LIST(EN_param_value, (symbol_c*)(new bool_type_name_c()), function_param_iterator_c::direction_in)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1028
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1029
    identifier_c eno_param_name("EN0");*/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1030
    /* Get the value from ENO param */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1031
    /*symbol_c *ENO_param_value = fcp_iterator.search(&eno_param_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1032
    if (ENO_param_value != NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1033
      nb_param --;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1034
    ADD_PARAM_LIST(ENO_param_value, (symbol_c*)(new bool_type_name_c()), function_param_iterator_c::direction_out)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1035
    
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1036
    #include "st_code_gen.c"
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1037
    */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1038
  } else {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1039
    /* determine the base data type returned by the function being called... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1040
    return_data_type = base_type(f_decl->type_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1041
    /* If the following occurs, then we must have some big bug in the syntax parser (stage 2)... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1042
    if (NULL == return_data_type) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1043
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1044
    /* check semantics of data passed in the function call... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1045
    check_nonformal_call(symbol, f_decl, true);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1046
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1047
    /* set the new ddata type of the default variable for the following verifications... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1048
    il_default_variable_type = return_data_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1049
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1050
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1051
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1052
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1053
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1054
/* | il_expr_operator '(' [il_operand] eol_list [simple_instr_list] ')' */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1055
// SYM_REF3(il_expression_c, il_expr_operator, il_operand, simple_instr_list);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1056
void *visit_expression_type_c::visit(il_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1057
  if (il_error)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1058
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1059
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1060
  symbol_c *il_default_variable_type_back = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1061
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1062
  il_parenthesis_level++;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1063
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1064
  if(symbol->il_operand != NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1065
     il_default_variable_type = base_type((symbol_c *)symbol->il_operand->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1066
  } else {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1067
     il_default_variable_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1068
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1069
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1070
  if(symbol->simple_instr_list != NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1071
    symbol->simple_instr_list->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1072
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1073
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1074
  il_parenthesis_level--;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1075
  if (il_parenthesis_level < 0) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1076
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1077
  il_operand = symbol->simple_instr_list;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1078
  il_operand_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1079
  il_default_variable_type = il_default_variable_type_back;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1080
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1081
  /* Now check the if the data type semantics of operation are correct,
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1082
   * but only if no previous error has been found...
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1083
   */
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1084
  if (!il_error)
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1085
    symbol->il_expr_operator->accept(*this);
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1086
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1087
  il_operand_type = NULL;
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1088
  il_operand = NULL;
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1089
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1090
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1091
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1092
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1093
#if 0
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1094
/*  il_jump_operator label */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1095
SYM_REF2(il_jump_operation_c, il_jump_operator, label)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1096
void *visit_expression_type_c::visit(il_jump_operation_c *symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1097
#endif
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1098
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1099
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1100
/*   il_call_operator prev_declared_fb_name
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1101
 * | il_call_operator prev_declared_fb_name '(' ')'
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1102
 * | il_call_operator prev_declared_fb_name '(' eol_list ')'
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1103
 * | il_call_operator prev_declared_fb_name '(' il_operand_list ')'
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1104
 * | il_call_operator prev_declared_fb_name '(' eol_list il_param_list ')'
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1105
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1106
/* SYM_REF4(il_fb_call_c, il_call_operator, fb_name, il_operand_list, il_param_list) */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1107
void *visit_expression_type_c::visit(il_fb_call_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1108
  if (il_error)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1109
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1110
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1111
  /* first check whether the il_default_variable is of the correct type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1112
   * for the CAL / CALC / CALCN operator being used...
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1113
   */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1114
  symbol->il_call_operator->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1115
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1116
  /* Now check the FB call itself... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1117
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1118
  /* First we find the declaration of the FB type of the FB instance being called... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1119
  /* e.g.  Function_block foo_fb_type
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1120
   *         ...
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1121
   *       End_Function_Block
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1122
   *
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1123
   *       Program test
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1124
   *         var fb1 : foo_fb_type; end_var
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1125
   *         fb1(...)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1126
   *       End_Program
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1127
   *
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1128
   *    search_varfb_instance_type->get_type( identifier_c("fb1") )
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1129
   *    in the scope of Program 'test'
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1130
   *    will return the fb declaration of foo_fb_type !!
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1131
   */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1132
#if 0
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1133
  symbol_c *fb_decl_symbol = search_varfb_instance_type->get_type(symbol->fb_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1134
    /* The following should never occur. The function block must be defined, 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1135
     * and the FB type being called MUST be in the symtable... 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1136
     * This was all already checked at stage 2!
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1137
     */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1138
  if (NULL == fb_decl_symbol) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1139
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1140
  function_block_declaration_c *fb_decl = dynamic_cast<function_block_declaration_c *>(fb_decl_symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1141
    /* should never occur. ... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1142
  if (NULL == fb_decl) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1143
#endif
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1144
  symbol_c *fb_decl = search_varfb_instance_type->get_type(symbol->fb_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1145
    /* The following should never occur. The function block must be defined, 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1146
     * and the FB type being called MUST be in the symtable... 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1147
     * This was all already checked at stage 2!
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1148
     */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1149
  if (NULL == fb_decl) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1150
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1151
  /* now check the semantics of the fb call... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1152
  /* If the syntax parser is working correctly, exactly one of the 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1153
   * following two symbols will be NULL, while the other is != NULL.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1154
   */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1155
  if (NULL != symbol->il_operand_list)  check_nonformal_call(symbol, fb_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1156
  if (NULL != symbol->il_param_list)    check_formal_call   (symbol, fb_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1157
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1158
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1159
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1160
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1161
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1162
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1163
/* | function_name '(' eol_list [il_param_list] ')' */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1164
/* SYM_REF2(il_formal_funct_call_c, function_name, il_param_list) */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1165
void *visit_expression_type_c::visit(il_formal_funct_call_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1166
  if (il_error)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1167
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1168
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1169
  function_declaration_c *f_decl = function_symtable.find_value(symbol->function_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1170
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1171
  symbol_c *return_data_type = NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1172
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1173
  if (f_decl == function_symtable.end_value()) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1174
    function_type_t current_function_type = get_function_type((identifier_c *)symbol->function_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1175
    if (current_function_type == function_none) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1176
    
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1177
    /*  This code is for the functions that the user did not declare and that are
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1178
     * part of the IL or ST languagem (built-in functions).
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1179
     *  For now we won't do the semantics analysis for that kind of functions.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1180
    */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1181
    #if 0
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1182
    return_data_type = (symbol_c *)search_expression_type->compute_standard_function_default(NULL, symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1183
    if (NULL == return_data_type) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1184
    
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1185
    function_call_param_iterator_c fcp_iterator(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1186
    
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1187
    int nb_param = 0;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1188
    if (symbol->il_param_list != NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1189
      nb_param += ((list_c *)symbol->il_param_list)->n;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1190
    
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1191
    identifier_c en_param_name("EN");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1192
    /* Get the value from EN param */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1193
    symbol_c *EN_param_value = fcp_iterator.search(&en_param_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1194
    if (EN_param_value == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1195
      EN_param_value = (symbol_c*)(new boolean_literal_c((symbol_c*)(new bool_type_name_c()), new boolean_true_c()));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1196
    else
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1197
      nb_param --;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1198
    ADD_PARAM_LIST(EN_param_value, (symbol_c*)(new bool_type_name_c()), function_param_iterator_c::direction_in)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1199
    
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1200
    identifier_c eno_param_name("EN0");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1201
    /* Get the value from ENO param */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1202
    symbol_c *ENO_param_value = fcp_iterator.search(&eno_param_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1203
    if (ENO_param_value != NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1204
      nb_param --;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1205
    ADD_PARAM_LIST(ENO_param_value, (symbol_c*)(new bool_type_name_c()), function_param_iterator_c::direction_out)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1206
    
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1207
    #include "st_code_gen.c"
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1208
    #endif
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1209
  } else {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1210
    /* determine the base data type returned by the function being called... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1211
    return_data_type = base_type(f_decl->type_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1212
    /* the following should never occur. If it does, then we have a bug in the syntax parser (stage 2)... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1213
    if (NULL == return_data_type) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1214
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1215
    /* check semantics of data passed in the function call... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1216
    check_formal_call(symbol, f_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1217
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1218
    /* the data type of the data returned by the function, and stored in the il default variable... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1219
    il_default_variable_type = return_data_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1220
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1221
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1222
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1223
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1224
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1225
#if 0
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1226
/* | il_operand_list ',' il_operand */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1227
SYM_LIST(il_operand_list_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1228
void *visit_expression_type_c::visit(il_operand_list_c *symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1229
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1230
/* | simple_instr_list il_simple_instruction */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1231
SYM_LIST(simple_instr_list_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1232
void *visit_expression_type_c::visit(simple_instr_list_c *symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1233
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1234
/* | il_initial_param_list il_param_instruction */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1235
SYM_LIST(il_param_list_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1236
void *visit_expression_type_c::visit(il_param_list_c *symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1237
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1238
/*  il_assign_operator il_operand
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1239
 * | il_assign_operator '(' eol_list simple_instr_list ')'
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1240
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1241
SYM_REF3(il_param_assignment_c, il_assign_operator, il_operand, simple_instr_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1242
void *visit_expression_type_c::visit(il_param_assignment_c *symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1243
/*  il_assign_out_operator variable */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1244
SYM_REF2(il_param_out_assignment_c, il_assign_out_operator, variable)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1245
void *visit_expression_type_c::visit(il_param_out_assignment_c *symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1246
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1247
#endif
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1248
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1249
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1250
/*******************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1251
/* B 2.2 Operators */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1252
/*******************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1253
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1254
//SYM_REF0(LD_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1255
void *visit_expression_type_c::visit(LD_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1256
  if (0 == il_parenthesis_level)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1257
    il_error = false;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1258
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1259
  if(il_operand_type == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1260
      STAGE3_ERROR(symbol, symbol, "LD operator requires an operand.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1261
  il_default_variable_type = il_operand_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1262
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1263
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1264
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1265
// SYM_REF0(LDN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1266
void *visit_expression_type_c::visit(LDN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1267
  if(il_operand_type == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1268
      STAGE3_ERROR(symbol, symbol, "LDN operator requires an operand.");
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1269
  if(!is_ANY_BIT_compatible(il_operand_type))
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1270
      STAGE3_ERROR(symbol, il_operand, "invalid data type of LDN operand, should be of type ANY_BIT.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1271
  il_default_variable_type = il_operand_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1272
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1273
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1274
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1275
// SYM_REF0(ST_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1276
void *visit_expression_type_c::visit(ST_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1277
  verify_null(symbol);
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1278
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1279
  if(!is_valid_assignment(il_operand_type, il_default_variable_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1280
    STAGE3_ERROR(symbol, symbol, "Type mismatch in ST operation.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1281
  /* TODO: check whether il_operand_type is an LVALUE !! */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1282
  /* data type of il_default_variable_type is unchanged... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1283
  // il_default_variable_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1284
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1285
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1286
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1287
// SYM_REF0(STN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1288
 void *visit_expression_type_c::visit(STN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1289
  verify_null(symbol);
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1290
  if(!is_valid_assignment(il_operand_type, il_default_variable_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1291
    STAGE3_ERROR(symbol, symbol, "Type mismatch in ST operation.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1292
  /* TODO: check whether il_operand_type is an LVALUE !! */
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1293
  if(!is_ANY_BIT_compatible(il_default_variable_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1294
      STAGE3_ERROR(symbol, symbol, "invalid data type of il_default_variable for STN operand, should be of type ANY_BIT.");
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1295
  if(!is_ANY_BIT_compatible(il_operand_type))
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1296
      STAGE3_ERROR(symbol, il_operand, "invalid data type of STN operand, should be of type ANY_BIT.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1297
  /* data type of il_default_variable_type is unchanged... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1298
  // il_default_variable_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1299
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1300
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1301
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1302
//SYM_REF0(NOT_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1303
void *visit_expression_type_c::visit(NOT_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1304
  if(il_operand_type != NULL){
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1305
    STAGE3_ERROR(symbol, il_operand, "NOT operator may not have an operand.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1306
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1307
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1308
  if(il_default_variable_type == NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1309
    STAGE3_ERROR(symbol, symbol, "Il default variable should not be NULL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1310
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1311
  }
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1312
  if(!is_ANY_BIT_compatible(il_default_variable_type)) {
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1313
    STAGE3_ERROR(symbol, symbol, "Il default variable should be of type ANY_BIT.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1314
    return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1315
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1316
  /* data type of il_default_variable_type is unchanged... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1317
  // il_default_variable_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1318
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1319
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1320
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1321
// SYM_REF0(S_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1322
void *visit_expression_type_c::visit(S_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1323
  verify_null(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1324
  if (!is_BOOL_type(il_default_variable_type)) {STAGE3_ERROR(symbol, symbol, "IL default variable should be BOOL type.");}
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1325
  if (!is_BOOL_type(il_operand_type)) {STAGE3_ERROR(symbol, il_operand, "operator S requires operand of type BOOL.");}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1326
  /* TODO: check whether il_operand_type is an LVALUE !! */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1327
  /* data type of il_default_variable_type is unchanged... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1328
  // il_default_variable_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1329
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1330
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1331
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1332
// SYM_REF0(R_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1333
void *visit_expression_type_c::visit(R_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1334
  verify_null(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1335
  if (!is_BOOL_type(il_default_variable_type)) {STAGE3_ERROR(symbol, symbol, "IL default variable should be BOOL type.");}
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1336
  if (!is_BOOL_type(il_operand_type)) {STAGE3_ERROR(symbol, il_operand, "operator R requires operand of type BOOL.");}
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1337
  /* TODO: check whether il_operand_type is an LVALUE !! */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1338
  /* data type of il_default_variable_type is unchanged... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1339
  // il_default_variable_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1340
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1341
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1342
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1343
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1344
// SYM_REF0(S1_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1345
void *visit_expression_type_c::visit(S1_operator_c *symbol){
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1346
  compute_input_operatores(symbol, "S1");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1347
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1348
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1349
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1350
// SYM_REF0(R1_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1351
void *visit_expression_type_c::visit(R1_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1352
  compute_input_operatores(symbol, "R1");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1353
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1354
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1355
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1356
// SYM_REF0(CLK_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1357
void *visit_expression_type_c::visit(CLK_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1358
  compute_input_operatores(symbol, "CLK");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1359
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1360
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1361
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1362
// SYM_REF0(CU_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1363
void *visit_expression_type_c::visit(CU_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1364
  compute_input_operatores(symbol, "CU");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1365
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1366
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1367
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1368
// SYM_REF0(CD_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1369
void *visit_expression_type_c::visit(CD_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1370
  compute_input_operatores(symbol, "CD");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1371
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1372
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1373
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1374
// SYM_REF0(PV_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1375
void *visit_expression_type_c::visit(PV_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1376
  compute_input_operatores(symbol, "PV");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1377
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1378
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1379
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1380
// SYM_REF0(IN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1381
void *visit_expression_type_c::visit(IN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1382
  compute_input_operatores(symbol, "IN");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1383
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1384
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1385
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1386
// SYM_REF0(PT_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1387
void *visit_expression_type_c::visit(PT_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1388
  compute_input_operatores(symbol, "PT");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1389
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1390
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1391
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1392
//SYM_REF0(AND_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1393
void *visit_expression_type_c::visit(AND_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1394
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1395
  il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_BIT_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1396
                                                symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1397
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1398
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1399
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1400
//SYM_REF0(OR_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1401
void *visit_expression_type_c::visit(OR_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1402
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1403
  il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_BIT_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1404
                                                symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1405
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1406
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1407
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1408
//SYM_REF0(XOR_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1409
void *visit_expression_type_c::visit(XOR_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1410
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1411
  il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_BIT_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1412
                                                symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1413
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1414
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1415
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1416
// SYM_REF0(ANDN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1417
void *visit_expression_type_c::visit(ANDN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1418
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1419
  il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_BIT_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1420
                                                symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1421
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1422
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1423
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1424
// SYM_REF0(ORN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1425
void *visit_expression_type_c::visit(ORN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1426
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1427
  il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_BIT_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1428
                                                symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1429
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1430
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1431
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1432
// SYM_REF0(XORN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1433
void *visit_expression_type_c::visit(XORN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1434
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1435
  il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_BIT_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1436
                                                symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1437
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1438
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1439
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1440
// SYM_REF0(ADD_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1441
void *visit_expression_type_c::visit(ADD_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1442
  verify_null(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1443
  symbol_c *left_type  = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1444
  symbol_c *right_type = il_operand_type;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1445
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1446
/* The following is not required, it is already handled by compute_expression() ... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1447
/*
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1448
  if      (is_type(left_type, time_type_name_c) && is_type(right_type, time_type_name_c))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1449
    il_default_variable_type = &time_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1450
*/
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1451
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1452
  if      (is_type(left_type, tod_type_name_c)      && is_type(right_type, time_type_name_c))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1453
    il_default_variable_type = &tod_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1454
  else if (is_type(left_type, safetod_type_name_c)  && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1455
    il_default_variable_type = &tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1456
  else if (is_type(left_type, tod_type_name_c)      && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1457
    il_default_variable_type = &tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1458
  else if (is_type(left_type, safetod_type_name_c)  && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1459
    il_default_variable_type = &safetod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1460
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1461
  else if (is_type(left_type, dt_type_name_c)       && is_type(right_type, time_type_name_c))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1462
    il_default_variable_type = &dt_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1463
  else if (is_type(left_type, safedt_type_name_c)   && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1464
    il_default_variable_type = &dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1465
  else if (is_type(left_type, dt_type_name_c)       && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1466
    il_default_variable_type = &dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1467
  else if (is_type(left_type, safedt_type_name_c)   && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1468
    il_default_variable_type = &safedt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1469
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1470
  else il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_MAGNITUDE_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1471
                                                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1472
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1473
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1474
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1475
// SYM_REF0(SUB_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1476
void *visit_expression_type_c::visit(SUB_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1477
  verify_null(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1478
  symbol_c *left_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1479
  symbol_c *right_type = il_operand_type;;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1480
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1481
/* The following is not required, it is already handled by compute_expression() ... */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1482
/*
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1483
  if      (typeid(*left_type) == typeid(time_type_name_c) && typeid(*right_type) == typeid(time_type_name_c))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1484
    il_default_variable_type = &time_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1485
*/
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1486
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1487
  if      (is_type(left_type, tod_type_name_c)       && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1488
    il_default_variable_type = &tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1489
  else if (is_type(left_type, safetod_type_name_c)   && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1490
    il_default_variable_type = &tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1491
  else if (is_type(left_type, tod_type_name_c)       && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1492
    il_default_variable_type = &tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1493
  else if (is_type(left_type, safetod_type_name_c)   && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1494
    il_default_variable_type = &safetod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1495
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1496
  else if (is_type(left_type, dt_type_name_c)       && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1497
    il_default_variable_type = &dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1498
  else if (is_type(left_type, safedt_type_name_c)   && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1499
    il_default_variable_type = &dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1500
  else if (is_type(left_type, dt_type_name_c)       && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1501
    il_default_variable_type = &dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1502
  else if (is_type(left_type, safedt_type_name_c)   && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1503
    il_default_variable_type = &safedt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1504
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1505
  else if (is_type(left_type, date_type_name_c)     && is_type(right_type, date_type_name_c))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1506
    il_default_variable_type = &time_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1507
  else if (is_type(left_type, safedate_type_name_c) && is_type(right_type, date_type_name_c))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1508
    il_default_variable_type = &time_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1509
  else if (is_type(left_type, date_type_name_c)     && is_type(right_type, safedate_type_name_c))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1510
    il_default_variable_type = &time_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1511
  else if (is_type(left_type, safedate_type_name_c) && is_type(right_type, safedate_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1512
    il_default_variable_type = &safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1513
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1514
  else if (is_type(left_type, tod_type_name_c)      && is_type(right_type, tod_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1515
    il_default_variable_type = &time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1516
  else if (is_type(left_type, safetod_type_name_c)  && is_type(right_type, tod_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1517
    il_default_variable_type = &time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1518
  else if (is_type(left_type, tod_type_name_c)      && is_type(right_type, safetod_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1519
    il_default_variable_type = &time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1520
  else if (is_type(left_type, safetod_type_name_c)  && is_type(right_type, safetod_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1521
    il_default_variable_type = &safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1522
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1523
  else if (is_type(left_type, dt_type_name_c)       && is_type(right_type, dt_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1524
    il_default_variable_type = &time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1525
  else if (is_type(left_type, safedt_type_name_c)   && is_type(right_type, dt_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1526
    il_default_variable_type = &time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1527
  else if (is_type(left_type, dt_type_name_c)       && is_type(right_type, safedt_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1528
    il_default_variable_type = &time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1529
  else if (is_type(left_type, safedt_type_name_c)   && is_type(right_type, safedt_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1530
    il_default_variable_type = &safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1531
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1532
  else il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_MAGNITUDE_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1533
                                                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1534
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1535
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1536
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1537
// SYM_REF0(MUL_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1538
void *visit_expression_type_c::visit(MUL_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1539
  verify_null(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1540
  symbol_c *left_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1541
  symbol_c *right_type = il_operand_type;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1542
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1543
  if      (is_type(left_type, time_type_name_c)     && is_ANY_NUM_compatible(right_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1544
    il_default_variable_type = &time_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1545
  else if (is_type(left_type, safetime_type_name_c) && is_ANY_NUM_type(right_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1546
    il_default_variable_type = &time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1547
  else if (is_type(left_type, safetime_type_name_c) && is_ANY_SAFENUM_type(right_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1548
    il_default_variable_type = &safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1549
  /* Since we have already checked for ANY_NUM_type and ANY_SAFENUM_type in the previous lines,
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1550
   * this next line is really only to check for integers/reals of undefined type on 'right_type'... 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1551
   */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1552
  else if (is_type(left_type, safetime_type_name_c) && is_ANY_NUM_compatible(right_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1553
    il_default_variable_type = &safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1554
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1555
  else il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_NUM_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1556
                                                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1557
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1558
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1559
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1560
// SYM_REF0(DIV_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1561
void *visit_expression_type_c::visit(DIV_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1562
  verify_null(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1563
  symbol_c *left_type = il_default_variable_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1564
  symbol_c *right_type = il_operand_type;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1565
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1566
  if      (is_type(left_type, time_type_name_c)     && is_ANY_NUM_compatible(right_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1567
    il_default_variable_type = &time_type_name;
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1568
  else if (is_type(left_type, safetime_type_name_c) && is_ANY_NUM_type(right_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1569
    il_default_variable_type = &time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1570
  else if (is_type(left_type, safetime_type_name_c) && is_ANY_SAFENUM_type(right_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1571
    il_default_variable_type = &safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1572
  /* Since we have already checked for ANY_NUM_type and ANY_SAFENUM_type in the previous lines,
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1573
   * this next line is really only to check for integers/reals of undefined type on 'right_type'... 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1574
   */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1575
  else if (is_type(left_type, safetime_type_name_c) && is_ANY_NUM_compatible(right_type))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1576
    il_default_variable_type = &safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1577
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1578
  else il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_NUM_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1579
                                                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1580
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1581
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1582
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1583
// SYM_REF0(MOD_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1584
void *visit_expression_type_c::visit(MOD_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1585
  verify_null(symbol);
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1586
  il_default_variable_type = compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_INT_compatible); 
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1587
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1588
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1589
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1590
// SYM_REF0(GT_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1591
void *visit_expression_type_c::visit(GT_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1592
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1593
  compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1594
                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1595
  il_default_variable_type = &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1596
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1597
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1598
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1599
//SYM_REF0(GE_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1600
void *visit_expression_type_c::visit(GE_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1601
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1602
  compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1603
                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1604
  il_default_variable_type = &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1605
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1606
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1607
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1608
//SYM_REF0(EQ_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1609
void *visit_expression_type_c::visit(EQ_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1610
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1611
  compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1612
                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1613
  il_default_variable_type = &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1614
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1615
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1616
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1617
//SYM_REF0(LT_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1618
void *visit_expression_type_c::visit(LT_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1619
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1620
  compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1621
                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1622
  il_default_variable_type = &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1623
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1624
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1625
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1626
//SYM_REF0(LE_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1627
void *visit_expression_type_c::visit(LE_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1628
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1629
  compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1630
                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1631
  il_default_variable_type = &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1632
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1633
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1634
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1635
//SYM_REF0(NE_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1636
void *visit_expression_type_c::visit(NE_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1637
  verify_null(symbol);
266
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1638
  compute_expression(il_default_variable_type, il_operand_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible,
2f6d8866ec8d Fixing error messages for IL semantic errors (brocken in a previous changeset/commit).
Mario de Sousa <msousa@fe.up.pt>
parents: 263
diff changeset
  1639
                     symbol                  , il_operand);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1640
  il_default_variable_type = &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1641
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1642
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1643
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1644
// SYM_REF0(CAL_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1645
void *visit_expression_type_c::visit(CAL_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1646
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1647
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1648
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1649
// SYM_REF0(CALC_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1650
void *visit_expression_type_c::visit(CALC_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1651
  if(il_default_variable_type == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1652
    STAGE3_ERROR(symbol, symbol, "CALC: il default variable should not be NULL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1653
  if (!is_BOOL_type(il_default_variable_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1654
    STAGE3_ERROR(symbol, symbol, "CALC operator requires il_default_variable to be of type BOOL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1655
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1656
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1657
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1658
// SYM_REF0(CALCN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1659
void *visit_expression_type_c::visit(CALCN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1660
  if(il_default_variable_type == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1661
    STAGE3_ERROR(symbol, symbol, "CALCN: il_default_variable should not be NULL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1662
  if (!is_BOOL_type(il_default_variable_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1663
    STAGE3_ERROR(symbol, symbol, "CALCN operator requires il_default_variable to be of type BOOL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1664
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1665
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1666
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1667
// SYM_REF0(RET_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1668
void *visit_expression_type_c::visit(RET_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1669
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1670
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1671
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1672
// SYM_REF0(RETC_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1673
void *visit_expression_type_c::visit(RETC_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1674
  if(il_default_variable_type == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1675
    STAGE3_ERROR(symbol, symbol, "RETC: il default variable should not be NULL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1676
  if (!is_BOOL_type(il_default_variable_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1677
    STAGE3_ERROR(symbol, symbol, "RETC operator requires il_default_variable to be of type BOOL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1678
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1679
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1680
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1681
// SYM_REF0(RETCN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1682
void *visit_expression_type_c::visit(RETCN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1683
  if(il_default_variable_type == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1684
    STAGE3_ERROR(symbol, symbol, "RETCN: il_default_variable should not be NULL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1685
  if (!is_BOOL_type(il_default_variable_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1686
    STAGE3_ERROR(symbol, symbol, "RETCN operator requires il_default_variable to be of type BOOL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1687
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1688
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1689
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1690
// SYM_REF0(JMP_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1691
void *visit_expression_type_c::visit(JMP_operator_c *symbol){
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1692
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1693
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1694
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1695
// SYM_REF0(JMPC_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1696
void *visit_expression_type_c::visit(JMPC_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1697
  if(il_default_variable_type == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1698
    STAGE3_ERROR(symbol, symbol, "JMPC: il default variable should not be NULL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1699
  if (!is_BOOL_type(il_default_variable_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1700
    STAGE3_ERROR(symbol, symbol, "JMPC operator requires il_default_variable to be of type BOOL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1701
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1702
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1703
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1704
// SYM_REF0(JMPCN_operator_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1705
void *visit_expression_type_c::visit(JMPCN_operator_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1706
  if(il_default_variable_type == NULL)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1707
    STAGE3_ERROR(symbol, symbol, "JMPCN: il_default_variable should not be NULL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1708
  if (!is_BOOL_type(il_default_variable_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1709
    STAGE3_ERROR(symbol, symbol, "JMPCN operator requires il_default_variable to be of type BOOL.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1710
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1711
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1712
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1713
/* Symbol class handled together with function call checks */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1714
/*  any_identifier ASSIGN */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1715
// SYM_REF1(il_assign_operator_c, variable_name)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1716
// void *visit_expression_type_c::visit(il_assign_operator_c *symbol, variable_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1717
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1718
/* Symbol class handled together with function call checks */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1719
/*| [NOT] any_identifier SENDTO */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1720
// SYM_REF2(il_assign_out_operator_c, option, variable_name)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1721
// void *visit_expression_type_c::visit(il_assign_operator_c *symbol, option, variable_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1722
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1723
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1724
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1725
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1726
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1727
/***************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1728
/* B.3 - Language ST (Structured Text) */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1729
/***************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1730
/***********************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1731
/* B 3.1 - Expressions */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1732
/***********************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1733
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1734
void *visit_expression_type_c::visit(or_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1735
  symbol_c *left_type = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1736
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1737
  return compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_BIT_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1738
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1739
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1740
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1741
void *visit_expression_type_c::visit(xor_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1742
  symbol_c *left_type = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1743
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1744
  return compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_BIT_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1745
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1746
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1747
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1748
void *visit_expression_type_c::visit(and_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1749
  symbol_c *left_type = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1750
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1751
  return compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_BIT_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1752
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1753
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1754
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1755
void *visit_expression_type_c::visit(equ_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1756
  symbol_c *left_type = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1757
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1758
  compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1759
  return &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1760
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1761
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1762
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1763
void *visit_expression_type_c::visit(notequ_expression_c *symbol)  {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1764
  symbol_c *left_type = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1765
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1766
  compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1767
  return &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1768
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1769
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1770
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1771
void *visit_expression_type_c::visit(lt_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1772
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1773
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1774
  compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1775
  return &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1776
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1777
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1778
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1779
void *visit_expression_type_c::visit(gt_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1780
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1781
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1782
  compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1783
  return &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1784
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1785
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1786
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1787
void *visit_expression_type_c::visit(le_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1788
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1789
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1790
  compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1791
  return &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1792
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1793
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1794
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1795
void *visit_expression_type_c::visit(ge_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1796
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1797
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1798
  compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_ELEMENTARY_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1799
  return &search_expression_type_c::bool_type_name;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1800
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1801
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1802
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1803
void *visit_expression_type_c::visit(add_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1804
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1805
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1806
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1807
/* The following is already checked in compute_expression */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1808
/*
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1809
  if (is_type(left_type, time_type_name_c) && is_type(right_type, time_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1810
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1811
*/
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1812
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1813
  if (is_type(left_type, tod_type_name_c)      && is_type(right_type, time_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1814
    return (void *)&tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1815
  if (is_type(left_type, safetod_type_name_c)  && is_type(right_type, time_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1816
    return (void *)&tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1817
  if (is_type(left_type, tod_type_name_c)      && is_type(right_type, safetime_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1818
    return (void *)&tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1819
  if (is_type(left_type, safetod_type_name_c)  && is_type(right_type, safetime_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1820
    return (void *)&safetod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1821
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1822
  if (is_type(left_type, dt_type_name_c)       && is_type(right_type, time_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1823
    return (void *)&dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1824
  if (is_type(left_type, safedt_type_name_c)   && is_type(right_type, time_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1825
    return (void *)&dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1826
  if (is_type(left_type, dt_type_name_c)       && is_type(right_type, safetime_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1827
    return (void *)&dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1828
  if (is_type(left_type, safedt_type_name_c)   && is_type(right_type, safetime_type_name_c)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1829
    return (void *)&safedt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1830
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1831
  return compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_MAGNITUDE_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1832
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1833
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1834
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1835
void *visit_expression_type_c::visit(sub_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1836
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1837
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1838
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1839
/* The following is already checked in compute_expression */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1840
/*
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1841
  if (is_type(left_type, time_type_name_c) && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1842
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1843
*/
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1844
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1845
  if (is_type(left_type, tod_type_name_c)     && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1846
    return (void *)&tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1847
  if (is_type(left_type, safetod_type_name_c) && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1848
    return (void *)&tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1849
  if (is_type(left_type, tod_type_name_c)     && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1850
    return (void *)&tod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1851
  if (is_type(left_type, safetod_type_name_c) && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1852
    return (void *)&safetod_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1853
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1854
  if (is_type(left_type, dt_type_name_c)     && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1855
    return (void *)&dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1856
  if (is_type(left_type, safedt_type_name_c) && is_type(right_type, time_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1857
    return (void *)&dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1858
  if (is_type(left_type, dt_type_name_c)     && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1859
    return (void *)&dt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1860
  if (is_type(left_type, safedt_type_name_c) && is_type(right_type, safetime_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1861
    return (void *)&safedt_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1862
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1863
  if (is_type(left_type, tod_type_name_c)     && is_type(right_type, tod_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1864
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1865
  if (is_type(left_type, safetod_type_name_c) && is_type(right_type, tod_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1866
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1867
  if (is_type(left_type, tod_type_name_c)     && is_type(right_type, safetod_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1868
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1869
  if (is_type(left_type, safetod_type_name_c) && is_type(right_type, safetod_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1870
    return (void *)&safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1871
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1872
  if (is_type(left_type, date_type_name_c)     && is_type(right_type, date_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1873
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1874
  if (is_type(left_type, safedate_type_name_c) && is_type(right_type, date_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1875
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1876
  if (is_type(left_type, date_type_name_c)     && is_type(right_type, safedate_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1877
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1878
  if (is_type(left_type, safedate_type_name_c) && is_type(right_type, safedate_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1879
    return (void *)&safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1880
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1881
  if (is_type(left_type, dt_type_name_c)     && is_type(right_type, dt_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1882
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1883
  if (is_type(left_type, safedt_type_name_c) && is_type(right_type, dt_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1884
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1885
  if (is_type(left_type, dt_type_name_c)     && is_type(right_type, safedt_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1886
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1887
  if (is_type(left_type, safedt_type_name_c) && is_type(right_type, safedt_type_name_c))
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1888
    return (void *)&safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1889
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1890
  return compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_MAGNITUDE_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1891
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1892
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1893
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1894
void *visit_expression_type_c::visit(mul_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1895
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1896
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1897
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1898
  if (is_type(left_type, time_type_name_c)     && is_ANY_NUM_compatible(right_type)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1899
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1900
  if (is_type(left_type, safetime_type_name_c) && is_ANY_NUM_type(right_type)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1901
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1902
  if (is_type(left_type, safetime_type_name_c) && is_ANY_SAFENUM_type(right_type)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1903
    return (void *)&safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1904
  /* Since we have already checked for ANY_NUM_type and ANY_SAFENUM_type in the previous lines,
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1905
   * this next line is really only to check for integers/reals of undefined type on 'right_type'... 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1906
   */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1907
  if (is_type(left_type, safetime_type_name_c) && is_ANY_NUM_compatible(right_type)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1908
    return (void *)&safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1909
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1910
  return compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_NUM_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1911
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1912
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1913
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1914
void *visit_expression_type_c::visit(div_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1915
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1916
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1917
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1918
  if (is_type(left_type, time_type_name_c)     && is_ANY_NUM_compatible(right_type)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1919
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1920
  if (is_type(left_type, safetime_type_name_c) && is_ANY_NUM_type(right_type)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1921
    return (void *)&time_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1922
  if (is_type(left_type, safetime_type_name_c) && is_ANY_SAFENUM_type(right_type)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1923
    return (void *)&safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1924
  /* Since we have already checked for ANY_NUM_type and ANY_SAFENUM_type in the previous lines,
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1925
   * this next line is really only to check for integers/reals of undefined type on 'right_type'... 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1926
   */
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1927
  if (is_type(left_type, safetime_type_name_c) && is_ANY_NUM_compatible(right_type)) 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1928
    return (void *)&safetime_type_name;
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1929
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1930
  return compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_NUM_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1931
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1932
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1933
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1934
void *visit_expression_type_c::visit(mod_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1935
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1936
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1937
  return compute_expression(left_type, right_type, &visit_expression_type_c::is_ANY_INT_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1938
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1939
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1940
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1941
void *visit_expression_type_c::visit(power_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1942
  symbol_c *left_type  = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1943
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1944
  if (!is_ANY_REAL_compatible(left_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1945
    STAGE3_ERROR(symbol->l_exp, symbol->l_exp, "first operand of ** operator has invalid data type, should be of type ANY_REAL.");
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1946
  if (!is_ANY_NUM_compatible(right_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1947
    STAGE3_ERROR(symbol->r_exp, symbol->r_exp, "second operand of ** operator has invalid data type, should be of type ANY_NUM.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1948
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1949
  return (void *)left_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1950
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1951
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1952
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1953
void *visit_expression_type_c::visit(neg_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1954
  symbol_c *exp_type = base_type((symbol_c *)symbol->exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1955
  if (!is_ANY_MAGNITUDE_compatible(exp_type))
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1956
    STAGE3_ERROR(symbol, symbol, "operand of negate expression '-' has invalid data type, should be of type ANY_MAGNITUDE.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1957
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1958
  return exp_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1959
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1960
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1961
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1962
void *visit_expression_type_c::visit(not_expression_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1963
  symbol_c *type = base_type((symbol_c *)symbol->exp->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  1964
  return compute_expression(type, type, &visit_expression_type_c::is_ANY_BIT_compatible);
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1965
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1966
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1967
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1968
void *visit_expression_type_c::visit(function_invocation_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1969
  function_declaration_c *f_decl = function_symtable.find_value(symbol->function_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1970
  if (f_decl == function_symtable.end_value()) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1971
    /* TODO: the following code is for standard library functions. We do not yet support this... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1972
    void *res = compute_standard_function_default(symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1973
    if (res != NULL) return res;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1974
    ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1975
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1976
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1977
  /* now check the semantics of the function call... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1978
  /* If the syntax parser is working correctly, exactly one of the 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1979
   * following two symbols will be NULL, while the other is != NULL.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1980
   */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1981
  if (symbol->   formal_param_list != NULL) check_formal_call   (symbol, f_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1982
  if (symbol->nonformal_param_list != NULL) check_nonformal_call(symbol, f_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1983
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1984
  return base_type(f_decl->type_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1985
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1986
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1987
/********************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1988
/* B 3.2 Statements */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1989
/********************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1990
// SYM_LIST(statement_list_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1991
/* The visitor of the base class search_visitor_c will handle calling each instruction in the list.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1992
 * We do not need to do anything here...
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1993
 */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1994
// void *visit_expression_type_c::visit(statement_list_c *symbol)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1995
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1996
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1997
/*********************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1998
/* B 3.2.1 Assignment Statements */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  1999
/*********************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2000
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2001
void *visit_expression_type_c::visit(assignment_statement_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2002
  symbol_c *left_type = base_type((symbol_c *)symbol->l_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2003
  symbol_c *right_type = base_type((symbol_c *)symbol->r_exp->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2004
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2005
  if (!is_valid_assignment(left_type, right_type))  {
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2006
     STAGE3_ERROR(symbol, symbol, "data type mismatch in assignment statement!\n");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2007
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2008
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2009
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2010
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2011
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2012
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2013
/*****************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2014
/* B 3.2.2 Subprogram Control Statements */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2015
/*****************************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2016
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2017
/*  RETURN */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2018
// SYM_REF0(return_statement_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2019
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2020
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2021
/* fb_name '(' [param_assignment_list] ')' */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2022
/* param_assignment_list -> may be NULL ! */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2023
// SYM_REF3(fb_invocation_c, fb_name, formal_param_list, nonformal_param_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2024
void *visit_expression_type_c::visit(fb_invocation_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2025
  symbol_c *fb_decl = search_varfb_instance_type->get_type(symbol->fb_name);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2026
    /* The following should never occur. The function block must be defined, 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2027
     * and the FB type being called MUST be in the symtable... 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2028
     * This was all already checked at stage 2!
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2029
     */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2030
  if (NULL == fb_decl) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2031
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2032
  /* now check the semantics of the fb call... */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2033
  /* If the syntax parser is working correctly, exactly one of the 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2034
   * following two symbols will be NULL, while the other is != NULL.
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2035
   */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2036
  if (symbol->   formal_param_list != NULL) check_formal_call   (symbol, fb_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2037
  if (symbol->nonformal_param_list != NULL) check_nonformal_call(symbol, fb_decl);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2038
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2039
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2040
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2041
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2042
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2043
#if 0
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2044
/* helper symbol for fb_invocation */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2045
/* param_assignment_list ',' param_assignment */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2046
SYM_LIST(param_assignment_list_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2047
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2048
/*  variable_name ASSIGN expression */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2049
SYM_REF2(input_variable_param_assignment_c, variable_name, expression)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2050
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2051
/* [NOT] variable_name '=>' variable */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2052
SYM_REF3(output_variable_param_assignment_c, not_param, variable_name, variable)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2053
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2054
/* helper CLASS for output_variable_param_assignment */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2055
SYM_REF0(not_paramassign_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2056
#endif
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2057
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2058
/********************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2059
/* B 3.2.3 Selection Statements */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2060
/********************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2061
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2062
/* IF expression THEN statement_list elseif_statement_list ELSE statement_list END_IF */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2063
// SYM_REF4(if_statement_c, expression, statement_list, elseif_statement_list, else_statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2064
void *visit_expression_type_c::visit(if_statement_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2065
  symbol_c *expr_type = base_type((symbol_c*)symbol->expression->accept(*this));
260
70dfd493e639 Error messages (stage3) now better identify the location of the error.
Mario de Sousa <msousa@fe.up.pt>
parents: 259
diff changeset
  2066
  if (!is_BOOL_type(expr_type)) STAGE3_ERROR(symbol->expression,symbol->expression,"IF conditional expression is not of boolean type.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2067
  if (NULL != symbol->statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2068
    symbol->statement_list->accept(*this); 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2069
  if (NULL != symbol->elseif_statement_list)  
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2070
    symbol->elseif_statement_list->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2071
  if (NULL != symbol->else_statement_list)  
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2072
    symbol->else_statement_list->accept(*this);  
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2073
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2074
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2075
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2076
/* helper symbol for if_statement */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2077
// SYM_LIST(elseif_statement_list_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2078
// void *visit_expression_type_c::visit(elseif_statement_list_c *symbol) { }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2079
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2080
/* helper symbol for elseif_statement_list */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2081
/* ELSIF expression THEN statement_list    */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2082
// SYM_REF2(elseif_statement_c, expression, statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2083
void *visit_expression_type_c::visit(elseif_statement_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2084
  symbol_c *elseif_expr_type = base_type((symbol_c*)symbol->expression->accept(*this));
260
70dfd493e639 Error messages (stage3) now better identify the location of the error.
Mario de Sousa <msousa@fe.up.pt>
parents: 259
diff changeset
  2085
  if(!is_BOOL_type(elseif_expr_type)) STAGE3_ERROR(symbol->expression,symbol->expression,"ELSIF conditional expression is not of boolean type.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2086
  if (NULL != symbol->statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2087
    symbol->statement_list->accept(*this); 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2088
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2089
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2090
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2091
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2092
/* CASE expression OF case_element_list ELSE statement_list END_CASE */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2093
// SYM_REF3(case_statement_c, expression, case_element_list, statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2094
void *visit_expression_type_c::visit(case_statement_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2095
  case_expression_type = base_type((symbol_c*)symbol->expression->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2096
  if (NULL != case_expression_type) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2097
    if (NULL != symbol->case_element_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2098
      symbol->case_element_list->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2099
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2100
  if (NULL != symbol->statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2101
    symbol->statement_list->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2102
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2103
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2104
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2105
#if 0
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2106
/* helper symbol for case_statement */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2107
// SYM_LIST(case_element_list_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2108
// void *visit_expression_type_c::visit(case_element_list_c *symbol);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2109
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2110
/*  case_list ':' statement_list */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2111
// SYM_REF2(case_element_c, case_list, statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2112
void *visit_expression_type_c::visit(case_element_c *symbol);  
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2113
#endif
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2114
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2115
// SYM_LIST(case_list_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2116
void *visit_expression_type_c::visit(case_list_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2117
  symbol_c *element_type;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2118
  for(int i = 0; i < symbol->n; i++) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2119
    element_type = (symbol_c *)symbol->elements[i]->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2120
    if (NULL == element_type) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2121
      STAGE3_ERROR(symbol->elements[i], symbol->elements[i], "Case list element has undefined data type.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2122
    } else {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2123
      element_type = base_type(element_type);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2124
      if (NULL != element_type){
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2125
        /* The CASE value is only used for comparison (and not assingment), so we only check for compatibility! */ 
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2126
        if (!is_compatible_type(case_expression_type, element_type))
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2127
          STAGE3_ERROR(symbol->elements[i], symbol->elements[i], "Invalid data type of case list element.");
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2128
      }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2129
    }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2130
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2131
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2132
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2133
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2134
/********************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2135
/* B 3.2.4 Iteration Statements */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2136
/********************************/
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2137
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2138
/*  FOR control_variable ASSIGN expression TO expression [BY expression] DO statement_list END_FOR */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2139
// SYM_REF5(for_statement_c, control_variable, beg_expression, end_expression, by_expression, statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2140
void *visit_expression_type_c::visit(for_statement_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2141
  symbol_c *var_type = (symbol_c*)symbol->control_variable->accept(*this);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2142
  if (NULL == var_type) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2143
  var_type = base_type(var_type);
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2144
  if (NULL == var_type) ERROR;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2145
  // ASSIGN
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2146
  symbol_c *beg_expr_type = base_type((symbol_c*)symbol->beg_expression->accept(*this));
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2147
  if (NULL != beg_expr_type) {
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2148
    /* The BEG value is assigned to the variable, so we check for assignment validity! */ 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2149
    if(!is_valid_assignment(var_type, beg_expr_type)) 
260
70dfd493e639 Error messages (stage3) now better identify the location of the error.
Mario de Sousa <msousa@fe.up.pt>
parents: 259
diff changeset
  2150
      STAGE3_ERROR(symbol->beg_expression, symbol->beg_expression, "Data type mismatch between control variable and initial value.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2151
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2152
  // TO
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2153
  symbol_c *end_expr_type = base_type((symbol_c*)symbol->end_expression->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2154
  if (NULL != end_expr_type) { 
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2155
    /* The TO value is only used for comparison, so we only check for compatibility! */ 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2156
    if(!is_compatible_type(var_type, end_expr_type)) 
260
70dfd493e639 Error messages (stage3) now better identify the location of the error.
Mario de Sousa <msousa@fe.up.pt>
parents: 259
diff changeset
  2157
      STAGE3_ERROR(symbol->end_expression, symbol->end_expression, "Data type mismatch between control variable and final value.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2158
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2159
  // BY
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2160
  if(symbol->by_expression != NULL) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2161
    symbol_c *by_expr_type = base_type((symbol_c*)symbol->by_expression->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2162
    if (NULL != end_expr_type) {   
257
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2163
      /* The BY value is used in an expression (add, sub, ...), so we only check for compatibility! */ 
90782e241346 Huge change.
Mario de Sousa <msousa@fe.up.pt>
parents: 204
diff changeset
  2164
      if(!is_compatible_type(var_type, by_expr_type)) 
260
70dfd493e639 Error messages (stage3) now better identify the location of the error.
Mario de Sousa <msousa@fe.up.pt>
parents: 259
diff changeset
  2165
        STAGE3_ERROR(symbol->by_expression, symbol->by_expression, "Data type mismatch between control variable and BY value.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2166
    }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2167
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2168
  // DO
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2169
  if (NULL != symbol->statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2170
    symbol->statement_list->accept(*this); 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2171
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2172
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2173
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2174
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2175
/*  WHILE expression DO statement_list END_WHILE */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2176
// SYM_REF2(while_statement_c, expression, statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2177
void *visit_expression_type_c::visit(while_statement_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2178
  symbol_c *expr_type = base_type((symbol_c*)symbol->expression->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2179
  if (NULL != expr_type) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2180
    if(!is_BOOL_type(expr_type)) 
260
70dfd493e639 Error messages (stage3) now better identify the location of the error.
Mario de Sousa <msousa@fe.up.pt>
parents: 259
diff changeset
  2181
      STAGE3_ERROR(symbol->expression,symbol->expression,"WHILE conditional expression is not of boolean type.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2182
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2183
 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2184
  if (NULL != symbol->statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2185
    symbol->statement_list->accept(*this); 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2186
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2187
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2188
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2189
/*  REPEAT statement_list UNTIL expression END_REPEAT */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2190
// SYM_REF2(repeat_statement_c, statement_list, expression)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2191
void *visit_expression_type_c::visit(repeat_statement_c *symbol) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2192
  if (NULL != symbol->statement_list)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2193
    symbol->statement_list->accept(*this); 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2194
 
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2195
  symbol_c *expr_type = base_type((symbol_c*)symbol->expression->accept(*this));
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2196
  if (NULL != expr_type) {
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2197
    if(!is_BOOL_type(expr_type)) 
260
70dfd493e639 Error messages (stage3) now better identify the location of the error.
Mario de Sousa <msousa@fe.up.pt>
parents: 259
diff changeset
  2198
      STAGE3_ERROR(symbol->expression,symbol->expression,"REPEAT conditional expression is not of boolean type.");
204
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2199
  }
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2200
  return NULL;
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2201
}
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2202
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2203
/*  EXIT */
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2204
// SYM_REF0(exit_statement_c)
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2205
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2206
8ffa211b7f9a Adding missing Stage3 files.
Catarina Boucinha <ccb@fe.up.pt>
parents:
diff changeset
  2207