author | mjsousa |
Tue, 20 May 2014 08:24:25 +0100 | |
changeset 891 | 58109ca87903 |
parent 873 | dea39ef02847 |
child 909 | 8b2a31dea131 |
permissions | -rwxr-xr-x |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1 |
/* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2 |
* matiec - a compiler for the programming languages defined in IEC 61131-3 |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
3 |
* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
4 |
* Copyright (C) 2009-2012 Mario de Sousa (msousa@fe.up.pt) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
5 |
* Copyright (C) 2012 Manuele Conti (manuele.conti@sirius-es.it) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
6 |
* Copyright (C) 2012 Matteo Facchinetti (matteo.facchinetti@sirius-es.it) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
7 |
* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
8 |
* This program is free software: you can redistribute it and/or modify |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
9 |
* it under the terms of the GNU General Public License as published by |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
10 |
* the Free Software Foundation, either version 3 of the License, or |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
11 |
* (at your option) any later version. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
12 |
* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
13 |
* This program is distributed in the hope that it will be useful, |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
14 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
15 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
16 |
* GNU General Public License for more details. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
17 |
* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
18 |
* You should have received a copy of the GNU General Public License |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
19 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
20 |
* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
21 |
* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
22 |
* This code is made available on the understanding that it will not be |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
23 |
* used in safety-critical situations without a full and competent review. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
24 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
25 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
26 |
/* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
27 |
* An IEC 61131-3 compiler. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
28 |
* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
29 |
* Based on the |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
30 |
* FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
31 |
* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
32 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
33 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
34 |
|
541 | 35 |
/* TODO - things yet not checked by this data type checker... |
36 |
* |
|
37 |
* - check variable declarations |
|
38 |
* - check data type declarations |
|
39 |
* - check inside configurations (variable declarations) |
|
40 |
* - check SFC code |
|
41 |
* - must fix S and R IL functions (includes potientialy fixing stage4 code!) |
|
42 |
*/ |
|
43 |
||
44 |
||
552 | 45 |
/* NOTE: The algorithm implemented here assumes that flow control analysis has already been completed! |
46 |
* BEFORE running this visitor, be sure to CALL the flow_control_analysis_c visitor! |
|
47 |
*/ |
|
48 |
||
49 |
||
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
50 |
/* |
552 | 51 |
* Fill the candidate datatype list for all symbols that may legally 'have' a data type (e.g. variables, literals, function calls, expressions, etc.) |
52 |
* |
|
53 |
* The candidate datatype list will be filled with a list of all the data types that expression may legally take. |
|
54 |
* For example, the very simple literal '0' (as in foo := 0), may represent a: |
|
55 |
* BOOL, BYTE, WORD, DWORD, LWORD, USINT, SINT, UINT, INT, UDINT, DINT, ULINT, LINT (as well as the SAFE versions of these data tyes too!) |
|
719
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
56 |
* |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
57 |
* WARNING: This visitor class starts off by building a map of all enumeration constants that are defined in the source code (i.e. a library_c symbol), |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
58 |
* and this map is later used to determine the datatpe of each use of an enumeration constant. By implication, the fill_candidate_datatypes_c |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
59 |
* visitor class will only work corretly if it is asked to visit a symbol of class library_c!! |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
60 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
61 |
|
604
2989051a0a64
Fixing includes to define INTxx_MAX etc...
Mario de Sousa <msousa@fe.up.pt>
parents:
603
diff
changeset
|
62 |
#include <../main.hh> /* required for UINT64_MAX, INT64_MAX, INT64_MIN, ... */ |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
63 |
#include "fill_candidate_datatypes.hh" |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
64 |
#include "datatype_functions.hh" |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
65 |
#include <typeinfo> |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
66 |
#include <list> |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
67 |
#include <string> |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
68 |
#include <string.h> |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
69 |
#include <strings.h> |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
70 |
|
612 | 71 |
#define GET_CVALUE(dtype, symbol) ((symbol)->const_value._##dtype.value) |
72 |
#define VALID_CVALUE(dtype, symbol) (symbol_c::cs_const_value == (symbol)->const_value._##dtype.status) |
|
73 |
#define IS_OVERFLOW(dtype, symbol) (symbol_c::cs_overflow == (symbol)->const_value._##dtype.status) |
|
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
74 |
|
724
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
75 |
|
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
76 |
|
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
77 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
78 |
/* set to 1 to see debug info during execution */ |
454
099aa5d655de
Finish support for semantic verification of IL paranthesised expressions.
Mario de Sousa <msousa@fe.up.pt>
parents:
453
diff
changeset
|
79 |
static int debug = 0; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
80 |
|
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
81 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
82 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
83 |
/*****************************************************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
84 |
/* */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
85 |
/* A small helper class... */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
86 |
/* */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
87 |
/*****************************************************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
88 |
|
719
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
89 |
/* Add to the global_enumerated_value_symtable the global enum value constants, i.e. the enum constants used in the enumerated |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
90 |
* datatypes that are defined inside a TYPE ... END_TYPE declaration. |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
91 |
*/ |
724
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
92 |
/* NOTE: we do not store any NULL values in this symbol table, so we can safely use NULL and the null value. */ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
93 |
|
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
94 |
symbol_c null_enumvalue_symbol; /* cannot be static, so it may be used in the template!! */ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
95 |
typedef dsymtable_c<symbol_c *, &null_enumvalue_symbol> enumerated_value_symtable_t; |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
96 |
static enumerated_value_symtable_t global_enumerated_value_symtable; |
719
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
97 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
98 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
99 |
class populate_globalenumvalue_symtable_c: public iterator_visitor_c { |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
100 |
private: |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
101 |
symbol_c *current_enumerated_type; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
102 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
103 |
public: |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
104 |
populate_globalenumvalue_symtable_c(void) {current_enumerated_type = NULL;}; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
105 |
~populate_globalenumvalue_symtable_c(void) {} |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
106 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
107 |
public: |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
108 |
/*************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
109 |
/* B.1 - Common elements */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
110 |
/*************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
111 |
/**********************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
112 |
/* B.1.3 - Data types */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
113 |
/**********************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
114 |
/********************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
115 |
/* B 1.3.3 - Derived data types */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
116 |
/********************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
117 |
/* enumerated_type_name ':' enumerated_spec_init */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
118 |
void *visit(enumerated_type_declaration_c *symbol) { |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
119 |
//current_enumerated_type = symbol->enumerated_type_name; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
120 |
current_enumerated_type = symbol; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
121 |
symbol->enumerated_spec_init->accept(*this); |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
122 |
current_enumerated_type = NULL; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
123 |
return NULL; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
124 |
} |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
125 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
126 |
/* enumerated_specification ASSIGN enumerated_value */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
127 |
void *visit(enumerated_spec_init_c *symbol) { |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
128 |
return symbol->enumerated_specification->accept(*this); |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
129 |
} |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
130 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
131 |
/* [enumerated_type_name '#'] identifier */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
132 |
void *visit(enumerated_value_c *symbol) { |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
133 |
if (current_enumerated_type == NULL) ERROR; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
134 |
if (symbol->type != NULL) ERROR; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
135 |
|
724
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
136 |
enumerated_value_symtable_t::iterator lower = global_enumerated_value_symtable.lower_bound(symbol->value); |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
137 |
enumerated_value_symtable_t::iterator upper = global_enumerated_value_symtable.upper_bound(symbol->value); |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
138 |
for (; lower != upper; lower++) |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
139 |
if (lower->second == current_enumerated_type) { |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
140 |
/* The same identifier is used more than once as an enumerated value/constant inside the same enumerated datat type! */ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
141 |
return NULL; /* No need to insert it! It is already in the table! */ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
142 |
} |
719
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
143 |
|
720
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
144 |
global_enumerated_value_symtable.insert(symbol->value, current_enumerated_type); |
719
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
145 |
return NULL; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
146 |
} |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
147 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
148 |
/**************************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
149 |
/* B.1.5 - Program organization units */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
150 |
/**************************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
151 |
/* B 1.5.1 - Functions */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
152 |
void *visit(function_declaration_c *symbol) {return NULL;} |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
153 |
/* B 1.5.2 - Function Blocks */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
154 |
void *visit(function_block_declaration_c *symbol) {return NULL;} |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
155 |
/* B 1.5.3 - Programs */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
156 |
void *visit(program_declaration_c *symbol) {return NULL;} |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
157 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
158 |
}; /* populate_globalenumvalue_symtable_c */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
159 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
160 |
static populate_globalenumvalue_symtable_c populate_globalenumvalue_symtable; |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
161 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
162 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
163 |
/*****************************************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
164 |
/* */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
165 |
/* A small helper class... */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
166 |
/* */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
167 |
/*****************************************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
168 |
|
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
169 |
/* Add to the local_enumerated_value_symtable the local enum value constants */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
170 |
/* Notes: |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
171 |
* Some enumerations are |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
172 |
* (A) declared anonymously inside a VAR ... END_VAR declaration |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
173 |
* (e.g. VAR enum_var : (enumvalue1, enumvalue2); END_VAR) |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
174 |
* while others are |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
175 |
* (B) declared (with a name) inside a TYPE .. END_TYPE declaration. |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
176 |
* |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
177 |
* Values in (A) are added to the enumerated_value_symtable in absyntaxt_utils.cc. |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
178 |
* Values in (B) are only in scope inside the POU with the VAR END_VAR declaration. |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
179 |
* |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
180 |
* This class will add the enum values in (B) to the local_enumerated_value_symtable. |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
181 |
* |
720
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
182 |
* If a locally defined enum value is identical to another locally defined enum_value, a |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
183 |
* duplicate entry is created. |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
184 |
* However, if a locally defined enum value is identical to another globally defined enum_value, the |
720
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
185 |
* corresponding entry in local_enumerated_value_symtable is also set to the local datatype. |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
186 |
* This is because anonynous locally feined enum datatypes are anonymous, and its enum values cannot therefore |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
187 |
* be disambiguated using EnumType#enum_value (since the enum type does not have a name, it is anonymous!). |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
188 |
* For this reason we implement the semantics where locally defined enum values, when in scope, will 'cover' |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
189 |
* the globally defined enum value with the same name/identifier. |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
190 |
* For example: |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
191 |
* |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
192 |
* TYPE GlobalEnumT: (xxx1, xxx2, xxx3) END_TYPE |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
193 |
* |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
194 |
* FUNCTION_BLOCK FOO |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
195 |
* VAR_INPUT |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
196 |
* GlobalEnumVar: GlobalEnumT; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
197 |
* LocalEnumVar : (xxx1, yyy2, yyy3); |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
198 |
* END_VAR |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
199 |
* LocalEnumVar := xxx1; <-- We consider it OK!!! xxx1 will reference the anonymous type used for LocalEnumVar |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
200 |
* GlobalEnumVar := xxx1; <-- We consider it an error. xxx1 will reference the anonymous type used for LocalEnumVar |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
201 |
* GlobalEnumVar := GlobalEnumT#xxx1; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
202 |
* END_FUNCTION_BLOCK |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
203 |
*/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
204 |
|
724
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
205 |
static enumerated_value_symtable_t local_enumerated_value_symtable; |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
206 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
207 |
|
738
e47cc8c954db
Start to move enumeration declaration checking to its own class.
Mario de Sousa <msousa@fe.up.pt>
parents:
735
diff
changeset
|
208 |
class populate_localenumvalue_symtable_c: public iterator_visitor_c { |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
209 |
private: |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
210 |
symbol_c *current_enumerated_type; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
211 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
212 |
public: |
738
e47cc8c954db
Start to move enumeration declaration checking to its own class.
Mario de Sousa <msousa@fe.up.pt>
parents:
735
diff
changeset
|
213 |
populate_localenumvalue_symtable_c(void) {current_enumerated_type = NULL;}; |
e47cc8c954db
Start to move enumeration declaration checking to its own class.
Mario de Sousa <msousa@fe.up.pt>
parents:
735
diff
changeset
|
214 |
~populate_localenumvalue_symtable_c(void) {} |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
215 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
216 |
public: |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
217 |
/*************************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
218 |
/* B.1 - Common elements */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
219 |
/*************************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
220 |
/**********************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
221 |
/* B.1.3 - Data types */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
222 |
/**********************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
223 |
/********************************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
224 |
/* B 1.3.3 - Derived data types */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
225 |
/********************************/ |
719
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
226 |
/* TYPE type_declaration_list END_TYPE */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
227 |
void *visit(data_type_declaration_c *symbol) {return NULL;} // do not visit the type declarations!! |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
228 |
|
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
229 |
/* enumerated_specification ASSIGN enumerated_value */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
230 |
void *visit(enumerated_spec_init_c *symbol) { |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
231 |
current_enumerated_type = symbol; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
232 |
symbol->enumerated_specification->accept(*this); |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
233 |
/* DO NOT visit the symbol->enumerated_value !!! */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
234 |
current_enumerated_type = NULL; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
235 |
return NULL; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
236 |
} |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
237 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
238 |
/* [enumerated_type_name '#'] identifier */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
239 |
void *visit(enumerated_value_c *symbol) { |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
240 |
/* if the enumerated_value_c is not inside a enumerated_spec_init_c (e.g. used as the inital value of a variable), we simply return */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
241 |
if (current_enumerated_type == NULL) return NULL; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
242 |
/* this is really an ERROR! The initial value may use the syntax NUM_TYPE#enum_value, but in that case we should have return'd in the above statement !! */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
243 |
if (symbol->type != NULL) ERROR; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
244 |
|
724
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
245 |
enumerated_value_symtable_t::iterator lower = local_enumerated_value_symtable.lower_bound(symbol->value); |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
246 |
enumerated_value_symtable_t::iterator upper = local_enumerated_value_symtable.upper_bound(symbol->value); |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
247 |
for (; lower != upper; lower++) |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
248 |
if (lower->second == current_enumerated_type) { |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
249 |
/* The same identifier is used more than once as an enumerated value/constant inside the same enumerated datat type! */ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
250 |
return NULL; /* No need to insert it! It is already in the table! */ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
251 |
} |
720
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
252 |
|
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
253 |
/* add it to the local symbol table. */ |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
254 |
local_enumerated_value_symtable.insert(symbol->value, current_enumerated_type); |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
255 |
return NULL; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
256 |
} |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
257 |
}; // class populate_enumvalue_symtable_c |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
258 |
|
738
e47cc8c954db
Start to move enumeration declaration checking to its own class.
Mario de Sousa <msousa@fe.up.pt>
parents:
735
diff
changeset
|
259 |
static populate_localenumvalue_symtable_c populate_enumvalue_symtable; |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
260 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
261 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
262 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
263 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
264 |
/*****************************************************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
265 |
/* */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
266 |
/* Main FILL candidate datatypes algorithm... */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
267 |
/* */ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
268 |
/*****************************************************/ |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
269 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
270 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
271 |
fill_candidate_datatypes_c::fill_candidate_datatypes_c(symbol_c *ignore) { |
661
f537c3315f83
Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents:
652
diff
changeset
|
272 |
il_operand = NULL; |
f537c3315f83
Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents:
652
diff
changeset
|
273 |
prev_il_instruction = NULL; |
f537c3315f83
Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents:
652
diff
changeset
|
274 |
search_varfb_instance_type = NULL; |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
275 |
current_enumerated_spec_type = NULL; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
276 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
277 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
278 |
fill_candidate_datatypes_c::~fill_candidate_datatypes_c(void) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
279 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
280 |
|
719
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
281 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
282 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
283 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
284 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
285 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
286 |
|
478
b13feab3b918
Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents:
476
diff
changeset
|
287 |
symbol_c *fill_candidate_datatypes_c::widening_conversion(symbol_c *left_type, symbol_c *right_type, const struct widen_entry widen_table[]) { |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
288 |
int k; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
289 |
/* find a widening table entry compatible */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
290 |
for (k = 0; NULL != widen_table[k].left; k++) |
478
b13feab3b918
Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents:
476
diff
changeset
|
291 |
if ((typeid(*left_type) == typeid(*widen_table[k].left)) && (typeid(*right_type) == typeid(*widen_table[k].right))) |
476
38d85e9a0507
Add check widening status for IL operator.
Manuele Conti <conti.ma@alice.it>
parents:
473
diff
changeset
|
292 |
return widen_table[k].result; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
293 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
294 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
295 |
|
421
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
296 |
|
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
297 |
/* add a data type to a candidate data type list, while guaranteeing no duplicate entries! */ |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
298 |
/* Returns true if it really did add the datatype to the list, or false if it was already present in the list! */ |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
299 |
bool fill_candidate_datatypes_c::add_datatype_to_candidate_list(symbol_c *symbol, symbol_c *datatype) { |
478
b13feab3b918
Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents:
476
diff
changeset
|
300 |
/* If it is an invalid data type, do not insert! |
b13feab3b918
Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents:
476
diff
changeset
|
301 |
* NOTE: it reduces overall code size to do this test here, instead of doing every time before calling the add_datatype_to_candidate_list() function. |
b13feab3b918
Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents:
476
diff
changeset
|
302 |
*/ |
676
ca4f17211251
Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
666
diff
changeset
|
303 |
if (!get_datatype_info_c::is_type_valid(datatype)) /* checks for NULL and invalid_type_name_c */ |
478
b13feab3b918
Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents:
476
diff
changeset
|
304 |
return false; |
b13feab3b918
Change setting of deprecated_operation from fill to narrow_candidate_datatypes_c.
Mario de Sousa <msousa@fe.up.pt>
parents:
476
diff
changeset
|
305 |
|
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
306 |
if (search_in_candidate_datatype_list(datatype, symbol->candidate_datatypes) >= 0) |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
307 |
/* already in the list, Just return! */ |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
308 |
return false; |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
309 |
|
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
310 |
/* not yet in the candidate data type list, so we insert it now! */ |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
311 |
symbol->candidate_datatypes.push_back(datatype); |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
312 |
return true; |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
313 |
} |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
314 |
|
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
315 |
|
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
316 |
bool fill_candidate_datatypes_c::add_2datatypes_to_candidate_list(symbol_c *symbol, symbol_c *datatype1, symbol_c *datatype2) { |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
317 |
add_datatype_to_candidate_list(symbol, datatype1); |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
318 |
add_datatype_to_candidate_list(symbol, datatype2); |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
319 |
return true; |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
320 |
} |
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
321 |
|
607
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
322 |
|
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
323 |
|
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
324 |
void fill_candidate_datatypes_c::remove_incompatible_datatypes(symbol_c *symbol) { |
607
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
325 |
#ifdef __REMOVE__ |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
326 |
#error __REMOVE__ macro already exists. Choose another name! |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
327 |
#endif |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
328 |
#define __REMOVE__(datatype)\ |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
329 |
remove_from_candidate_datatype_list(&get_datatype_info_c::datatype, symbol->candidate_datatypes);\ |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
330 |
remove_from_candidate_datatype_list(&get_datatype_info_c::safe##datatype, symbol->candidate_datatypes); |
607
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
331 |
|
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
332 |
{/* Remove unsigned data types */ |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
333 |
uint64_t value = 0; |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
334 |
if (VALID_CVALUE( uint64, symbol)) value = GET_CVALUE(uint64, symbol); |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
335 |
if (IS_OVERFLOW ( uint64, symbol)) value = (uint64_t)UINT32_MAX + (uint64_t)1; |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
336 |
|
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
337 |
if (value > 1 ) {__REMOVE__(bool_type_name);} |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
338 |
if (value > UINT8_MAX ) {__REMOVE__(usint_type_name); __REMOVE__( byte_type_name);} |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
339 |
if (value > UINT16_MAX ) {__REMOVE__( uint_type_name); __REMOVE__( word_type_name);} |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
340 |
if (value > UINT32_MAX ) {__REMOVE__(udint_type_name); __REMOVE__(dword_type_name);} |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
341 |
if (IS_OVERFLOW( uint64, symbol)) {__REMOVE__(ulint_type_name); __REMOVE__(lword_type_name);} |
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
342 |
} |
607
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
343 |
|
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
344 |
{/* Remove signed data types */ |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
345 |
int64_t value = 0; |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
346 |
if (VALID_CVALUE( int64, symbol)) value = GET_CVALUE(int64, symbol); |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
347 |
if (IS_OVERFLOW ( int64, symbol)) value = (int64_t)INT32_MAX + (int64_t)1; |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
348 |
|
609
9ab033d2bb55
signed integer limits do not affect ANY_INT constant values.
Mario de Sousa <msousa@fe.up.pt>
parents:
607
diff
changeset
|
349 |
if ((value < INT8_MIN) || (value > INT8_MAX)) {__REMOVE__(sint_type_name);} |
9ab033d2bb55
signed integer limits do not affect ANY_INT constant values.
Mario de Sousa <msousa@fe.up.pt>
parents:
607
diff
changeset
|
350 |
if ((value < INT16_MIN) || (value > INT16_MAX)) {__REMOVE__( int_type_name);} |
9ab033d2bb55
signed integer limits do not affect ANY_INT constant values.
Mario de Sousa <msousa@fe.up.pt>
parents:
607
diff
changeset
|
351 |
if ((value < INT32_MIN) || (value > INT32_MAX)) {__REMOVE__(dint_type_name);} |
9ab033d2bb55
signed integer limits do not affect ANY_INT constant values.
Mario de Sousa <msousa@fe.up.pt>
parents:
607
diff
changeset
|
352 |
if (IS_OVERFLOW( int64, symbol)) {__REMOVE__(lint_type_name);} |
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
353 |
} |
607
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
354 |
|
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
355 |
{/* Remove floating point data types */ |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
356 |
real64_t value = 0; |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
357 |
if (VALID_CVALUE( real64, symbol)) value = GET_CVALUE(real64, symbol); |
610
50b708dff319
fix bug: remove REAL from candidate datatypes when real constant has overflowed.
Mario de Sousa <msousa@fe.up.pt>
parents:
609
diff
changeset
|
358 |
if (IS_OVERFLOW ( real64, symbol)) value = (real64_t)REAL32_MAX + (real64_t)1; |
607
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
359 |
if (value > REAL32_MAX ) {__REMOVE__( real_type_name);} |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
360 |
if (value < -REAL32_MAX ) {__REMOVE__( real_type_name);} |
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
361 |
if (IS_OVERFLOW( real64, symbol)) {__REMOVE__(lreal_type_name);} |
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
362 |
} |
607
be9ba3531afb
cleaning up code. Changing HUGE_VAL to INFINITY.
Mario de Sousa <msousa@fe.up.pt>
parents:
605
diff
changeset
|
363 |
#undef __REMOVE__ |
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
364 |
} |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
365 |
|
421
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
366 |
|
420
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
367 |
/* returns true if compatible function/FB invocation, otherwise returns false */ |
424
43d73e28eca8
Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents:
422
diff
changeset
|
368 |
/* Assumes that the candidate_datatype lists of all the parameters being passed haved already been filled in */ |
443
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
369 |
/* |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
370 |
* All parameters being passed to the called function MUST be in the parameter list to which f_call points to! |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
371 |
* This means that, for non formal function calls in IL, de current (default value) must be artificially added to the |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
372 |
* beginning of the parameter list BEFORE calling handle_function_call(). |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
373 |
*/ |
420
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
374 |
bool fill_candidate_datatypes_c::match_nonformal_call(symbol_c *f_call, symbol_c *f_decl) { |
449
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
375 |
symbol_c *call_param_value, *param_datatype; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
376 |
identifier_c *param_name; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
377 |
function_param_iterator_c fp_iterator(f_decl); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
378 |
function_call_param_iterator_c fcp_iterator(f_call); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
379 |
int extensible_parameter_highest_index = -1; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
380 |
unsigned int i; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
381 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
382 |
/* Iterating through the non-formal parameters of the function call */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
383 |
while((call_param_value = fcp_iterator.next_nf()) != NULL) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
384 |
/* Iterate to the next parameter of the function being called. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
385 |
* Get the name of that parameter, and ignore if EN or ENO. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
386 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
387 |
do { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
388 |
param_name = fp_iterator.next(); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
389 |
/* If there is no other parameter declared, then we are passing too many parameters... */ |
420
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
390 |
if(param_name == NULL) return false; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
391 |
} while ((strcmp(param_name->value, "EN") == 0) || (strcmp(param_name->value, "ENO") == 0)); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
392 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
393 |
/* Get the parameter type */ |
449
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
394 |
param_datatype = base_type(fp_iterator.param_type()); |
420
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
395 |
|
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
396 |
/* check whether one of the candidate_data_types of the value being passed is the same as the param_type */ |
449
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
397 |
if (search_in_candidate_datatype_list(param_datatype, call_param_value->candidate_datatypes) < 0) |
442 | 398 |
return false; /* return false if param_type not in the list! */ |
420
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
399 |
} |
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
400 |
/* call is compatible! */ |
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
401 |
return true; |
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
402 |
} |
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
403 |
|
421
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
404 |
|
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
405 |
|
420
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
406 |
/* returns true if compatible function/FB invocation, otherwise returns false */ |
424
43d73e28eca8
Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents:
422
diff
changeset
|
407 |
/* Assumes that the candidate_datatype lists of all the parameters being passed haved already been filled in */ |
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
408 |
bool fill_candidate_datatypes_c::match_formal_call(symbol_c *f_call, symbol_c *f_decl, symbol_c **first_param_datatype) { |
449
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
409 |
symbol_c *call_param_value, *call_param_name, *param_datatype; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
410 |
symbol_c *verify_duplicate_param; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
411 |
identifier_c *param_name; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
412 |
function_param_iterator_c fp_iterator(f_decl); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
413 |
function_call_param_iterator_c fcp_iterator(f_call); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
414 |
int extensible_parameter_highest_index = -1; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
415 |
identifier_c *extensible_parameter_name; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
416 |
unsigned int i; |
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
417 |
bool is_first_param = true; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
418 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
419 |
/* Iterating through the formal parameters of the function call */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
420 |
while((call_param_name = fcp_iterator.next_f()) != NULL) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
421 |
/* Obtaining the value being passed in the function call */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
422 |
call_param_value = fcp_iterator.get_current_value(); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
423 |
/* the following should never occur. If it does, then we have a bug in our code... */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
424 |
if (NULL == call_param_value) ERROR; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
425 |
|
449
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
426 |
/* Obtaining the assignment direction: := (assign_in) or => (assign_out) */ |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
427 |
function_call_param_iterator_c::assign_direction_t call_param_dir = fcp_iterator.get_assign_direction(); |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
428 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
429 |
/* Checking if there are duplicated parameter values */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
430 |
verify_duplicate_param = fcp_iterator.search_f(call_param_name); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
431 |
if(verify_duplicate_param != call_param_value) |
420
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
432 |
return false; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
433 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
434 |
/* Obtaining the type of the value being passed in the function call */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
435 |
std::vector <symbol_c *>&call_param_types = call_param_value->candidate_datatypes; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
436 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
437 |
/* Find the corresponding parameter in function declaration */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
438 |
param_name = fp_iterator.search(call_param_name); |
421
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
439 |
if(param_name == NULL) return false; |
449
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
440 |
/* Get the parameter data type */ |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
441 |
param_datatype = base_type(fp_iterator.param_type()); |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
442 |
/* Get the parameter direction: IN, OUT, IN_OUT */ |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
443 |
function_param_iterator_c::param_direction_t param_dir = fp_iterator.param_direction(); |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
444 |
|
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
445 |
/* check whether direction (IN, OUT, IN_OUT) and assignment types (:= , =>) are compatible !!! */ |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
446 |
if (function_call_param_iterator_c::assign_in == call_param_dir) { |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
447 |
if ((function_param_iterator_c::direction_in != param_dir) && |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
448 |
(function_param_iterator_c::direction_inout != param_dir)) |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
449 |
return false; |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
450 |
} else if (function_call_param_iterator_c::assign_out == call_param_dir) { |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
451 |
if ((function_param_iterator_c::direction_out != param_dir)) |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
452 |
return false; |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
453 |
} else ERROR; |
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
454 |
|
421
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
455 |
/* check whether one of the candidate_data_types of the value being passed is the same as the param_type */ |
449
3c6225521059
Semantic verification: Add compatibility check for parameter direction in function invocation.
Mario de Sousa <msousa@fe.up.pt>
parents:
448
diff
changeset
|
456 |
if (search_in_candidate_datatype_list(param_datatype, call_param_types) < 0) |
442 | 457 |
return false; /* return false if param_type not in the list! */ |
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
458 |
|
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
459 |
/* If this is the first parameter, then copy the datatype to *first_param_datatype */ |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
460 |
if (is_first_param) |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
461 |
if (NULL != first_param_datatype) |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
462 |
*first_param_datatype = param_datatype; |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
463 |
is_first_param = false; |
421
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
464 |
} |
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
465 |
/* call is compatible! */ |
420
866eb35e4e14
Fix search_varfb_instance_decl to be able to find variables and FB when only given an identifier.
Mario de Sousa <msousa@fe.up.pt>
parents:
419
diff
changeset
|
466 |
return true; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
467 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
468 |
|
421
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
469 |
|
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
470 |
|
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
471 |
|
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
472 |
/* Handle a generic function call! |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
473 |
* Assumes that the parameter_list containing the values being passed in this function invocation |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
474 |
* has already had all the candidate_datatype lists filled in! |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
475 |
* |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
476 |
* All parameters being passed to the called function MUST be in the parameter list to which f_call points to! |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
477 |
* This means that, for non formal function calls in IL, de current (default value) must be artificially added to the |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
478 |
* beginning of the parameter list BEFORE calling handle_function_call(). |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
479 |
*/ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
480 |
/* |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
481 |
typedef struct { |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
482 |
symbol_c *function_name, |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
483 |
symbol_c *nonformal_operand_list, |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
484 |
symbol_c * formal_operand_list, |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
485 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
486 |
std::vector <symbol_c *> &candidate_functions, |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
487 |
symbol_c &*called_function_declaration, |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
488 |
int &extensible_param_count |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
489 |
} generic_function_call_t; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
490 |
*/ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
491 |
/* |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
492 |
void narrow_candidate_datatypes_c::narrow_function_invocation(symbol_c *fcall, generic_function_call_t fcall_data) { |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
493 |
void *fill_candidate_datatypes_c::handle_function_call(symbol_c *f_call, symbol_c *function_name, invocation_type_t invocation_type, |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
494 |
std::vector <symbol_c *> *candidate_datatypes, |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
495 |
std::vector <symbol_c *> *candidate_functions) { |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
496 |
*/ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
497 |
void fill_candidate_datatypes_c::handle_function_call(symbol_c *fcall, generic_function_call_t fcall_data) { |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
498 |
function_declaration_c *f_decl; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
499 |
list_c *parameter_list; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
500 |
list_c *parameter_candidate_datatypes; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
501 |
symbol_c *returned_parameter_type; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
502 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
503 |
if (debug) std::cout << "function()\n"; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
504 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
505 |
function_symtable_t::iterator lower = function_symtable.lower_bound(fcall_data.function_name); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
506 |
function_symtable_t::iterator upper = function_symtable.upper_bound(fcall_data.function_name); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
507 |
/* If the name of the function being called is not found in the function symbol table, then this is an invalid call */ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
508 |
/* Since the lexical parser already checks for this, then if this occurs then we have an internal compiler error. */ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
509 |
if (lower == function_symtable.end()) ERROR; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
510 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
511 |
/* Look for all compatible function declarations, and add their return datatypes |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
512 |
* to the candidate_datatype list of this function invocation. |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
513 |
* |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
514 |
* If only one function exists, we add its return datatype to the candidate_datatype list, |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
515 |
* even if the parameters passed to it are invalid. |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
516 |
* This guarantees that the remainder of the expression in which the function call is inserted |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
517 |
* is treated as if the function call returns correctly, and therefore does not generate |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
518 |
* spurious error messages. |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
519 |
* Even if the parameters to the function call are invalid, doing this is still safe, as the |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
520 |
* expressions inside the function call will themselves have erros and will guarantee that |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
521 |
* compilation is aborted in stage3 (in print_datatypes_error_c). |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
522 |
*/ |
720
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
523 |
if (function_symtable.count(fcall_data.function_name) == 1) { |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
524 |
f_decl = function_symtable.get_value(lower); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
525 |
returned_parameter_type = base_type(f_decl->type_name); |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
526 |
if (add_datatype_to_candidate_list(fcall, returned_parameter_type)) |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
527 |
/* we only add it to the function declaration list if this entry was not already present in the candidate datatype list! */ |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
528 |
fcall_data.candidate_functions.push_back(f_decl); |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
529 |
|
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
530 |
} |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
531 |
for(; lower != upper; lower++) { |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
532 |
bool compatible = false; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
533 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
534 |
f_decl = function_symtable.get_value(lower); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
535 |
/* Check if function declaration in symbol_table is compatible with parameters */ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
536 |
if (NULL != fcall_data.nonformal_operand_list) compatible=match_nonformal_call(fcall, f_decl); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
537 |
if (NULL != fcall_data. formal_operand_list) compatible= match_formal_call(fcall, f_decl); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
538 |
if (compatible) { |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
539 |
/* Add the data type returned by the called functions. |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
540 |
* However, only do this if this data type is not already present in the candidate_datatypes list_c |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
541 |
*/ |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
542 |
returned_parameter_type = base_type(f_decl->type_name); |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
543 |
if (add_datatype_to_candidate_list(fcall, returned_parameter_type)) |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
544 |
/* we only add it to the function declaration list if this entry was not already present in the candidate datatype list! */ |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
545 |
fcall_data.candidate_functions.push_back(f_decl); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
546 |
} |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
547 |
} |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
548 |
if (debug) std::cout << "end_function() [" << fcall->candidate_datatypes.size() << "] result.\n"; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
549 |
return; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
550 |
} |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
551 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
552 |
|
447
aad0f3e5df33
Start of support for semantic verification of FB calls in IL using special IL instructions.
Mario de Sousa <msousa@fe.up.pt>
parents:
445
diff
changeset
|
553 |
/* handle implicit FB call in IL. |
448
1bd18fc06911
Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents:
447
diff
changeset
|
554 |
* e.g. CLK ton_var |
447
aad0f3e5df33
Start of support for semantic verification of FB calls in IL using special IL instructions.
Mario de Sousa <msousa@fe.up.pt>
parents:
445
diff
changeset
|
555 |
* CU counter_var |
aad0f3e5df33
Start of support for semantic verification of FB calls in IL using special IL instructions.
Mario de Sousa <msousa@fe.up.pt>
parents:
445
diff
changeset
|
556 |
*/ |
489
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
557 |
void *fill_candidate_datatypes_c::handle_implicit_il_fb_call(symbol_c *il_instruction, const char *param_name, symbol_c *&called_fb_declaration) { |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
558 |
symbol_c *fb_decl = (NULL == il_operand)? NULL : search_varfb_instance_type->get_basetype_decl(il_operand); |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
559 |
if (! get_datatype_info_c::is_function_block(fb_decl)) fb_decl = NULL; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
560 |
|
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
561 |
/* Although a call to a non-declared FB is a semantic error, this is currently caught by stage 2! */ |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
562 |
/* However, when calling using the 'S' and 'R' operators, this error is not caught by stage 2, as these operators have two possible semantics */ |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
563 |
// if (NULL == fb_type_id) ERROR; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
564 |
|
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
565 |
/* The narrow_candidate_datatypes_c does not rely on this called_fb_declaration pointer being == NULL to conclude that |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
566 |
* we have a datatype incompatibility error, so we set it to fb_decl to allow the print_datatype_error_c to print out |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
567 |
* more informative error messages! |
450
eb1b28acec2e
Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
449
diff
changeset
|
568 |
*/ |
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
569 |
called_fb_declaration = fb_decl; |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
570 |
|
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
571 |
/* This implicit FB call does not change the value stored in the current/default IL variable */ |
456 | 572 |
/* It does, however, require that the datatype be compatible with the input parameter of the FB being called. |
573 |
* If we were to follow the filling & narrowing algorithm correctly (implemented in fill_candidate_datatypes_c |
|
574 |
* & narrow_candidate_datatypes_c respectively), we should be restricting the candidate_datatpes to the datatypes |
|
575 |
* that are compatible to the FB call. |
|
576 |
* However, doing the above will often result in some very confusing error messages for the user, especially in the case |
|
577 |
* in which the FB call is wrong, so the resulting cadidate datatypes is an empty list. In this case, the user would see |
|
578 |
* many error messages related to the IL instructions that follow the FB call, even though those IL instructions may be perfectly |
|
579 |
* correct. |
|
580 |
* For now, we will simply let the narrow_candidate_datatypes_c verify if the datatypes are compatible (something that should be done |
|
581 |
* here). |
|
582 |
*/ |
|
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
583 |
if (NULL != prev_il_instruction) |
467
4910eaa1206a
Delete no longer needed copy_candidate_datatype_list() function.
Mario de Sousa <msousa@fe.up.pt>
parents:
465
diff
changeset
|
584 |
il_instruction->candidate_datatypes = prev_il_instruction->candidate_datatypes; |
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
585 |
|
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
586 |
if (debug) std::cout << "handle_implicit_il_fb_call() [" << prev_il_instruction->candidate_datatypes.size() << "] ==> " << il_instruction->candidate_datatypes.size() << " result.\n"; |
489
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
587 |
return NULL; |
447
aad0f3e5df33
Start of support for semantic verification of FB calls in IL using special IL instructions.
Mario de Sousa <msousa@fe.up.pt>
parents:
445
diff
changeset
|
588 |
} |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
589 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
590 |
|
479 | 591 |
|
592 |
||
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
593 |
|
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
594 |
/* handle the S and R IL operators... */ |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
595 |
/* operator_str should be set to either "S" or "R" */ |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
596 |
void *fill_candidate_datatypes_c::handle_S_and_R_operator(symbol_c *symbol, const char *operator_str, symbol_c *&called_fb_declaration) { |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
597 |
/* NOTE: this operator has two possible semantic meanings: |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
598 |
* - Set/Reset the BOOL operand variable to true |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
599 |
* - call the FB specified by the operand. |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
600 |
* Which of the two semantics will have to be determined by the datatype of the operand! |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
601 |
*/ |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
602 |
symbol_c *prev_instruction_type, *operand_type; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
603 |
|
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
604 |
if (NULL == prev_il_instruction) return NULL; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
605 |
if (NULL == il_operand) return NULL; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
606 |
|
837 | 607 |
/* Try the Set/Reset semantics */ |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
608 |
for (unsigned int i = 0; i < prev_il_instruction->candidate_datatypes.size(); i++) { |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
609 |
for(unsigned int j = 0; j < il_operand->candidate_datatypes.size(); j++) { |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
610 |
prev_instruction_type = prev_il_instruction->candidate_datatypes[i]; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
611 |
operand_type = il_operand->candidate_datatypes[j]; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
612 |
/* IEC61131-3, Table 52, Note (e) states that the datatype of the operand must be BOOL! |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
613 |
* IEC61131-3, Table 52, line 3 states that this operator should "Set operand to 1 if current result is Boolean 1" |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
614 |
* which implies that the prev_instruction_type MUST also be BOOL compatible. |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
615 |
*/ |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
616 |
if (get_datatype_info_c::is_BOOL_compatible(prev_instruction_type) && get_datatype_info_c::is_BOOL_compatible(operand_type)) |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
617 |
add_datatype_to_candidate_list(symbol, prev_instruction_type); |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
618 |
} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
619 |
} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
620 |
|
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
621 |
/* if the appropriate semantics is not a Set/Reset of a boolean variable, the we try for the FB invocation! */ |
837 | 622 |
if (symbol->candidate_datatypes.size() == 0) { |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
623 |
handle_implicit_il_fb_call(symbol, operator_str, called_fb_declaration); |
837 | 624 |
/* If it is also not a valid FB call, make sure the candidate_datatypes is empty (handle_implicit_il_fb_call may leave it non-empty!!) */ |
625 |
/* From here on out, all later code will consider the symbol->called_fb_declaration being NULL as an indication that this operator must use the |
|
626 |
* Set/Reset semantics, so we must also guarantee that the remainder of the state of this symbol is compatible with that assumption! |
|
627 |
*/ |
|
628 |
if (NULL == called_fb_declaration) |
|
629 |
symbol->candidate_datatypes.clear(); |
|
630 |
} |
|
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
631 |
|
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
632 |
if (debug) std::cout << operator_str << " [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
633 |
return NULL; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
634 |
} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
635 |
|
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
636 |
|
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
637 |
|
479 | 638 |
/* handle a binary IL operator, like ADD, SUB, etc... */ |
639 |
void *fill_candidate_datatypes_c::handle_binary_operator(const struct widen_entry widen_table[], symbol_c *symbol, symbol_c *l_expr, symbol_c *r_expr) { |
|
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
640 |
if (NULL == l_expr) return NULL; /* if no prev_il_instruction */ |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
641 |
if (NULL == r_expr) return NULL; /* if no IL operand!! */ |
479 | 642 |
|
643 |
for(unsigned int i = 0; i < l_expr->candidate_datatypes.size(); i++) |
|
644 |
for(unsigned int j = 0; j < r_expr->candidate_datatypes.size(); j++) |
|
645 |
/* NOTE: add_datatype_to_candidate_list() will only really add the datatype if it is != NULL !!! */ |
|
646 |
add_datatype_to_candidate_list(symbol, widening_conversion(l_expr->candidate_datatypes[i], r_expr->candidate_datatypes[j], widen_table)); |
|
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
647 |
remove_incompatible_datatypes(symbol); |
479 | 648 |
if (debug) std::cout << "[" << l_expr->candidate_datatypes.size() << "," << r_expr->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
649 |
return NULL; |
|
650 |
} |
|
651 |
||
652 |
||
652
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
653 |
|
479 | 654 |
/* handle a binary ST expression, like '+', '-', etc... */ |
655 |
void *fill_candidate_datatypes_c::handle_binary_expression(const struct widen_entry widen_table[], symbol_c *symbol, symbol_c *l_expr, symbol_c *r_expr) { |
|
656 |
l_expr->accept(*this); |
|
657 |
r_expr->accept(*this); |
|
658 |
return handle_binary_operator(widen_table, symbol, l_expr, r_expr); |
|
659 |
} |
|
660 |
||
661 |
||
662 |
||
652
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
663 |
/* handle the two equality comparison operations, i.e. = (euqal) and != (not equal) */ |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
664 |
/* This function is special, as it will also allow enumeration data types to be compared, with the result being a BOOL data type! |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
665 |
* This possibility os not expressed in the 'widening' tables, so we need to hard code it here |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
666 |
*/ |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
667 |
void *fill_candidate_datatypes_c::handle_equality_comparison(const struct widen_entry widen_table[], symbol_c *symbol, symbol_c *l_expr, symbol_c *r_expr) { |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
668 |
handle_binary_expression(widen_table, symbol, l_expr, r_expr); |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
669 |
for(unsigned int i = 0; i < l_expr->candidate_datatypes.size(); i++) |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
670 |
for(unsigned int j = 0; j < r_expr->candidate_datatypes.size(); j++) { |
854
13d0b67de111
Code cleanup: move datatype analysis to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
837
diff
changeset
|
671 |
if ((l_expr->candidate_datatypes[i] == r_expr->candidate_datatypes[j]) && get_datatype_info_c::is_enumerated(l_expr->candidate_datatypes[i])) |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
672 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name); |
652
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
673 |
} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
674 |
return NULL; |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
675 |
} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
676 |
|
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
677 |
|
479 | 678 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
679 |
/* a helper function... */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
680 |
symbol_c *fill_candidate_datatypes_c::base_type(symbol_c *symbol) { |
718
a9f8cc778444
Make search_base_type_c a singleton!
Mario de Sousa <msousa@fe.up.pt>
parents:
717
diff
changeset
|
681 |
/* NOTE: symbol == NULL is valid. It will occur when, for e.g., an undefined/undeclared symbolic_variable is used in the code. */ |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
682 |
if (symbol == NULL) return NULL; |
718
a9f8cc778444
Make search_base_type_c a singleton!
Mario de Sousa <msousa@fe.up.pt>
parents:
717
diff
changeset
|
683 |
return search_base_type_c::get_basetype_decl(symbol); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
684 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
685 |
|
719
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
686 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
687 |
/***************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
688 |
/* B 0 - Programming Model */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
689 |
/***************************/ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
690 |
/* main entry function! */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
691 |
void *fill_candidate_datatypes_c::visit(library_c *symbol) { |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
692 |
symbol->accept(populate_globalenumvalue_symtable); |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
693 |
/* Now let the base class iterator_visitor_c iterate through all the library elements */ |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
694 |
return iterator_visitor_c::visit(symbol); |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
695 |
} |
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
696 |
|
19595fce59f0
Move the enumerated_value_symtable to fill_candidate_datatypes_c, since it is only used there!
Mario de Sousa <msousa@fe.up.pt>
parents:
718
diff
changeset
|
697 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
698 |
/*********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
699 |
/* B 1.2 - Constants */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
700 |
/*********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
701 |
/******************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
702 |
/* B 1.2.1 - Numeric Literals */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
703 |
/******************************/ |
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
704 |
#define sizeoftype(symbol) get_sizeof_datatype_c::getsize(symbol) |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
705 |
|
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
706 |
void *fill_candidate_datatypes_c::handle_any_integer(symbol_c *symbol) { |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
707 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name, &get_datatype_info_c::safebool_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
708 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::byte_type_name, &get_datatype_info_c::safebyte_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
709 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::word_type_name, &get_datatype_info_c::safeword_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
710 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::dword_type_name, &get_datatype_info_c::safedword_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
711 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::lword_type_name, &get_datatype_info_c::safelword_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
712 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::sint_type_name, &get_datatype_info_c::safesint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
713 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::int_type_name, &get_datatype_info_c::safeint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
714 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::dint_type_name, &get_datatype_info_c::safedint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
715 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::lint_type_name, &get_datatype_info_c::safelint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
716 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::usint_type_name, &get_datatype_info_c::safeusint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
717 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::uint_type_name, &get_datatype_info_c::safeuint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
718 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::udint_type_name, &get_datatype_info_c::safeudint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
719 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::ulint_type_name, &get_datatype_info_c::safeulint_type_name); |
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
720 |
remove_incompatible_datatypes(symbol); |
479 | 721 |
if (debug) std::cout << "ANY_INT [" << symbol->candidate_datatypes.size()<< "]" << std::endl; |
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
722 |
return NULL; |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
723 |
} |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
724 |
|
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
725 |
|
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
726 |
|
488 | 727 |
void *fill_candidate_datatypes_c::handle_any_real(symbol_c *symbol) { |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
728 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::real_type_name, &get_datatype_info_c::safereal_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
729 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::lreal_type_name, &get_datatype_info_c::safelreal_type_name); |
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
730 |
remove_incompatible_datatypes(symbol); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
731 |
if (debug) std::cout << "ANY_REAL [" << symbol->candidate_datatypes.size() << "]" << std::endl; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
732 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
733 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
734 |
|
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
735 |
|
488 | 736 |
|
737 |
void *fill_candidate_datatypes_c::handle_any_literal(symbol_c *symbol, symbol_c *symbol_value, symbol_c *symbol_type) { |
|
738 |
symbol_value->accept(*this); |
|
739 |
if (search_in_candidate_datatype_list(symbol_type, symbol_value->candidate_datatypes) >= 0) |
|
740 |
add_datatype_to_candidate_list(symbol, symbol_type); |
|
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
741 |
remove_incompatible_datatypes(symbol); |
643
1cc0e1ca2aad
Fix constant folding: now handles INT_MIN and neg_integer_c correctly.
Mario de Sousa <msousa@fe.up.pt>
parents:
612
diff
changeset
|
742 |
if (debug) std::cout << "ANY_LITERAL [" << symbol->candidate_datatypes.size() << "]\n"; |
488 | 743 |
return NULL; |
744 |
} |
|
745 |
||
746 |
||
747 |
||
748 |
void *fill_candidate_datatypes_c::visit( real_c *symbol) {return handle_any_real(symbol);} |
|
749 |
void *fill_candidate_datatypes_c::visit(neg_real_c *symbol) {return handle_any_real(symbol);} |
|
750 |
||
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
751 |
|
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
752 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
753 |
void *fill_candidate_datatypes_c::visit(neg_integer_c *symbol) { |
650 | 754 |
/* Please read the comment in neg_expression_c method, as it also applies here */ |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
755 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::int_type_name, &get_datatype_info_c::safeint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
756 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::sint_type_name, &get_datatype_info_c::safesint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
757 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::dint_type_name, &get_datatype_info_c::safedint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
758 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::lint_type_name, &get_datatype_info_c::safelint_type_name); |
603
a45a62dd6df9
Add remove_from_candidate_datatype_list method using constant_folding results.
Manuele Conti <conti.ma@alice.it>
parents:
558
diff
changeset
|
759 |
remove_incompatible_datatypes(symbol); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
760 |
if (debug) std::cout << "neg ANY_INT [" << symbol->candidate_datatypes.size() << "]" << std::endl; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
761 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
762 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
763 |
|
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
764 |
|
488 | 765 |
|
479 | 766 |
void *fill_candidate_datatypes_c::visit(integer_c *symbol) {return handle_any_integer(symbol);} |
767 |
void *fill_candidate_datatypes_c::visit(binary_integer_c *symbol) {return handle_any_integer(symbol);} |
|
768 |
void *fill_candidate_datatypes_c::visit(octal_integer_c *symbol) {return handle_any_integer(symbol);} |
|
769 |
void *fill_candidate_datatypes_c::visit(hex_integer_c *symbol) {return handle_any_integer(symbol);} |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
770 |
|
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
771 |
|
488 | 772 |
|
427
eb9bc99944d9
Better error reporting in function invocations, and in invalid literal values.
Mario de Sousa <msousa@fe.up.pt>
parents:
426
diff
changeset
|
773 |
// SYM_REF2(integer_literal_c, type, value) |
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
774 |
/* |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
775 |
* integer_literal: |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
776 |
* integer_type_name '#' signed_integer |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
777 |
* | integer_type_name '#' binary_integer |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
778 |
* | integer_type_name '#' octal_integer |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
779 |
* | integer_type_name '#' hex_integer |
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
780 |
*/ |
488 | 781 |
void *fill_candidate_datatypes_c::visit( integer_literal_c *symbol) {return handle_any_literal(symbol, symbol->value, symbol->type);} |
782 |
void *fill_candidate_datatypes_c::visit( real_literal_c *symbol) {return handle_any_literal(symbol, symbol->value, symbol->type);} |
|
783 |
void *fill_candidate_datatypes_c::visit(bit_string_literal_c *symbol) {return handle_any_literal(symbol, symbol->value, symbol->type);} |
|
784 |
||
785 |
void *fill_candidate_datatypes_c::visit( boolean_literal_c *symbol) { |
|
786 |
if (NULL != symbol->type) return handle_any_literal(symbol, symbol->value, symbol->type); |
|
787 |
||
427
eb9bc99944d9
Better error reporting in function invocations, and in invalid literal values.
Mario de Sousa <msousa@fe.up.pt>
parents:
426
diff
changeset
|
788 |
symbol->value->accept(*this); |
488 | 789 |
symbol->candidate_datatypes = symbol->value->candidate_datatypes; |
790 |
return NULL; |
|
791 |
} |
|
792 |
||
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
793 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
794 |
void *fill_candidate_datatypes_c::visit(boolean_true_c *symbol) { |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
795 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name, &get_datatype_info_c::safebool_type_name); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
796 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
797 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
798 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
799 |
void *fill_candidate_datatypes_c::visit(boolean_false_c *symbol) { |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
800 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name, &get_datatype_info_c::safebool_type_name); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
801 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
802 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
803 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
804 |
/*******************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
805 |
/* B.1.2.2 Character Strings */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
806 |
/*******************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
807 |
void *fill_candidate_datatypes_c::visit(double_byte_character_string_c *symbol) { |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
808 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::wstring_type_name, &get_datatype_info_c::safewstring_type_name); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
809 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
810 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
811 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
812 |
void *fill_candidate_datatypes_c::visit(single_byte_character_string_c *symbol) { |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
813 |
add_2datatypes_to_candidate_list(symbol, &get_datatype_info_c::string_type_name, &get_datatype_info_c::safestring_type_name); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
814 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
815 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
816 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
817 |
/***************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
818 |
/* B 1.2.3 - Time Literals */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
819 |
/***************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
820 |
/************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
821 |
/* B 1.2.3.1 - Duration */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
822 |
/************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
823 |
void *fill_candidate_datatypes_c::visit(duration_c *symbol) { |
472
d26759a2274a
Clean up code, and add support for 'safe' version of literals.
Mario de Sousa <msousa@fe.up.pt>
parents:
470
diff
changeset
|
824 |
add_datatype_to_candidate_list(symbol, symbol->type_name); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
825 |
if (debug) std::cout << "TIME_LITERAL [" << symbol->candidate_datatypes.size() << "]\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
826 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
827 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
828 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
829 |
/************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
830 |
/* B 1.2.3.2 - Time of day and Date */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
831 |
/************************************/ |
479 | 832 |
void *fill_candidate_datatypes_c::visit(time_of_day_c *symbol) {add_datatype_to_candidate_list(symbol, symbol->type_name); return NULL;} |
833 |
void *fill_candidate_datatypes_c::visit(date_c *symbol) {add_datatype_to_candidate_list(symbol, symbol->type_name); return NULL;} |
|
834 |
void *fill_candidate_datatypes_c::visit(date_and_time_c *symbol) {add_datatype_to_candidate_list(symbol, symbol->type_name); return NULL;} |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
835 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
836 |
/**********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
837 |
/* B 1.3 - Data types */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
838 |
/**********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
839 |
/********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
840 |
/* B 1.3.3 - Derived data types */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
841 |
/********************************/ |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
842 |
|
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
843 |
void *fill_candidate_datatypes_c::fill_type_decl(symbol_c *symbol, symbol_c *type_name, symbol_c *spec_init) { |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
844 |
/* NOTE: Unlike the rest of the 'fill' algorithm that works using a bottom->up approach, when handling |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
845 |
* data type declarations (section B.1.3.3 - Derived data types) we use a top->bottom approach. |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
846 |
* This is intentional, and not a bug! Explanation follows... |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
847 |
* Here we are essentially determining the base type of each defined data type. In many cases (especially structs, |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
848 |
* enumerations, arrays, etc...), the datatype is its own base type. However, the derived datatype is stored in |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
849 |
* multiple symbol_c classes (e.g. an enumeration uses enumerated_type_declaration_c, enumerated_spec_init_c, |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
850 |
* enumerated_value_list_c, enumerated_value_c, ...). Several of these could be chosen to work as the canonical base datatype |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
851 |
* symbol. Which symbol is used is really up to the search_base_type_c, and not this fill_candidate_datatypes_c. |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
852 |
* Here we must right the code to handle whatever the search_base_type_c chooses to use as the canonical symbol to represent |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
853 |
* the base datatype. |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
854 |
* Since the base datatype may be (and sometimes/often/always(?) actually is) the top level symbol_c (an enumerated_type_declaration_c |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
855 |
* in the case of the enumerations), it only makes sense to ask search_base_type_c for a basetype when we pass it the |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
856 |
* symbol in the highest level of the type declaration (the enumerated_type_declaration_c in the case of the enumerations). |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
857 |
* For this reason, we determine the basetype at the top level, and send that info down to the bottom level of the data type |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
858 |
* declaration. In summary, a top->down algorithm! |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
859 |
*/ |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
860 |
add_datatype_to_candidate_list(symbol, base_type(symbol)); |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
861 |
type_name->candidate_datatypes = symbol->candidate_datatypes; // use top->down algorithm!! |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
862 |
spec_init->candidate_datatypes = symbol->candidate_datatypes; // use top->down algorithm!! |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
863 |
spec_init->accept(*this); |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
864 |
return NULL; |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
865 |
} |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
866 |
|
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
867 |
|
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
868 |
void *fill_candidate_datatypes_c::fill_spec_init(symbol_c *symbol, symbol_c *type_spec, symbol_c *init_value) { |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
869 |
/* NOTE: The note in the fill_type_decl() function is also partially valid here, |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
870 |
* i.e. here too we work using a top->down algorithm for the type_spec part, but a bottom->up algorithm |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
871 |
* for the init_value part!! |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
872 |
*/ |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
873 |
/* NOTE: When a variable is declared inside a POU as, for example |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
874 |
* VAR |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
875 |
* a : ARRAY[9] OF REAL; |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
876 |
* e : ENUM (black, white, gray); |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
877 |
* s : STRUCT x, y: REAL; END_STRUCT |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
878 |
* END_VAR |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
879 |
* the anonymous datatype will be defined directly by the ***_spec_init_c, and will not have an |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
880 |
* ****_type_declaration_c. In these cases, the anonymous data type is its own basetype, and the |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
881 |
* ***_spec_init_c class will act as the canonical symbol that represents the (anonymous) basetype. |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
882 |
* |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
883 |
* This method must handle the above case, as well as the case in which the ***_spec_init_c is called |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
884 |
* from an ****_type_declaration_c. |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
885 |
*/ |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
886 |
if (symbol->candidate_datatypes.size() == 0) // i.e., if this is an anonymous datatype! |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
887 |
add_datatype_to_candidate_list(symbol, base_type(symbol)); |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
888 |
|
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
889 |
// use top->down algorithm!! |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
890 |
type_spec->candidate_datatypes = symbol->candidate_datatypes; |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
891 |
type_spec->accept(*this); |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
892 |
|
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
893 |
// use bottom->up algorithm!! |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
894 |
if (NULL != init_value) init_value->accept(*this); |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
895 |
/* NOTE: Even if the constant and the type are of incompatible data types, we let the |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
896 |
* ***_spec_init_c object inherit the data type of the type declaration (simple_specification) |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
897 |
* This will let us produce more informative error messages when checking data type compatibility |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
898 |
* with located variables (AT %QW3.4 : WORD). |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
899 |
*/ |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
900 |
// if (NULL != init_value) intersect_candidate_datatype_list(symbol /*origin, dest.*/, init_value /*with*/); |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
901 |
return NULL; |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
902 |
} |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
903 |
|
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
904 |
|
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
905 |
/* TYPE type_declaration_list END_TYPE */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
906 |
// SYM_REF1(data_type_declaration_c, type_declaration_list) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
907 |
/* NOTE: Not required. already handled by iterator_visitor_c base class */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
908 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
909 |
/* helper symbol for data_type_declaration */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
910 |
// SYM_LIST(type_declaration_list_c) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
911 |
/* NOTE: Not required. already handled by iterator_visitor_c base class */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
912 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
913 |
/* simple_type_name ':' simple_spec_init */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
914 |
// SYM_REF2(simple_type_declaration_c, simple_type_name, simple_spec_init) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
915 |
void *fill_candidate_datatypes_c::visit(simple_type_declaration_c *symbol) {return fill_type_decl(symbol, symbol->simple_type_name, symbol->simple_spec_init);} |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
916 |
|
502
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
917 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
918 |
/* simple_specification ASSIGN constant */ |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
919 |
// SYM_REF2(simple_spec_init_c, simple_specification, constant) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
920 |
void *fill_candidate_datatypes_c::visit(simple_spec_init_c *symbol) {return fill_spec_init(symbol, symbol->simple_specification, symbol->constant);} |
502
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
921 |
|
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
922 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
923 |
/* subrange_type_name ':' subrange_spec_init */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
924 |
// SYM_REF2(subrange_type_declaration_c, subrange_type_name, subrange_spec_init) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
925 |
void *fill_candidate_datatypes_c::visit(subrange_type_declaration_c *symbol) {return fill_type_decl(symbol, symbol->subrange_type_name, symbol->subrange_spec_init);} |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
926 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
927 |
/* subrange_specification ASSIGN signed_integer */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
928 |
// SYM_REF2(subrange_spec_init_c, subrange_specification, signed_integer) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
929 |
void *fill_candidate_datatypes_c::visit(subrange_spec_init_c *symbol) {return fill_spec_init(symbol, symbol->subrange_specification, symbol->signed_integer);} |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
930 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
931 |
/* integer_type_name '(' subrange')' */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
932 |
// SYM_REF2(subrange_specification_c, integer_type_name, subrange) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
933 |
// NOTE: not needed! Iterator visitor already handles this! |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
934 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
935 |
/* signed_integer DOTDOT signed_integer */ |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
936 |
/* dimension will be filled in during stage 3 (array_range_check_c) with the number of elements in this subrange */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
937 |
// SYM_REF2(subrange_c, lower_limit, upper_limit, unsigned long long int dimension;) |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
938 |
void *fill_candidate_datatypes_c::visit(subrange_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
939 |
symbol->lower_limit->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
940 |
symbol->upper_limit->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
941 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
942 |
for (unsigned int u = 0; u < symbol->upper_limit->candidate_datatypes.size(); u++) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
943 |
for(unsigned int l = 0; l < symbol->lower_limit->candidate_datatypes.size(); l++) { |
676
ca4f17211251
Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
666
diff
changeset
|
944 |
if (get_datatype_info_c::is_type_equal(symbol->upper_limit->candidate_datatypes[u], symbol->lower_limit->candidate_datatypes[l])) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
945 |
add_datatype_to_candidate_list(symbol, symbol->lower_limit->candidate_datatypes[l]); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
946 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
947 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
948 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
949 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
950 |
|
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
951 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
952 |
/* enumerated_type_name ':' enumerated_spec_init */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
953 |
// SYM_REF2(enumerated_type_declaration_c, enumerated_type_name, enumerated_spec_init) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
954 |
void *fill_candidate_datatypes_c::visit(enumerated_type_declaration_c *symbol) {return fill_type_decl(symbol, symbol->enumerated_type_name, symbol->enumerated_spec_init);} |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
955 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
956 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
957 |
/* enumerated_specification ASSIGN enumerated_value */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
958 |
// SYM_REF2(enumerated_spec_init_c, enumerated_specification, enumerated_value) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
959 |
// NOTE: enumerated_specification is either an enumerated_value_list_c or identifier_c. |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
960 |
void *fill_candidate_datatypes_c::visit(enumerated_spec_init_c *symbol) {return fill_spec_init(symbol, symbol->enumerated_specification, symbol->enumerated_value);} |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
961 |
|
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
962 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
963 |
/* helper symbol for enumerated_specification->enumerated_spec_init */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
964 |
/* enumerated_value_list ',' enumerated_value */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
965 |
// SYM_LIST(enumerated_value_list_c) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
966 |
void *fill_candidate_datatypes_c::visit(enumerated_value_list_c *symbol) { |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
967 |
if (symbol->candidate_datatypes.size() != 1) ERROR; |
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
968 |
symbol_c *current_enumerated_spec_type = symbol->candidate_datatypes[0]; |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
969 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
970 |
/* We already know the datatype of the enumerated_value(s) in the list, so we set them directly instead of recursively calling the enumerated_value_c visit method! */ |
726
9b61eb4f00dc
Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents:
724
diff
changeset
|
971 |
for(int i = 0; i < symbol->n; i++) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
972 |
add_datatype_to_candidate_list(symbol->elements[i], current_enumerated_spec_type); // top->down algorithm!! |
726
9b61eb4f00dc
Change the base datatype of enumerations to an enumerated_type_declaration_c (for named types!)
Mario de Sousa <msousa@fe.up.pt>
parents:
724
diff
changeset
|
973 |
|
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
974 |
return NULL; |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
975 |
} |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
976 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
977 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
978 |
/* enumerated_type_name '#' identifier */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
979 |
// SYM_REF2(enumerated_value_c, type, value) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
980 |
/* WARNING: The enumerated_value_c is used when delcaring an enumerated datatype |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
981 |
* (e.g. TYPE enumT: (xxx1, xxx2); END_TYPE ---> xxx1 and xxx2 will be enumerated_value_c) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
982 |
* as well as in the source code of POU bodies |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
983 |
* (e.g. enumVar := xxx1 ---> xxx1 will be enumerated_value_c) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
984 |
* |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
985 |
* The following method will only be used to visit enumerated_value_c that show up inside the |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
986 |
* source code of POU bodies (or the initial values of an enumerated type). When used inside an |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
987 |
* enumerated type declaration to list the possible enum values (whether inside |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
988 |
* a TYPE ... END_TYPE, or inside a VAR .. END_VAR), the visitor method for enumerated_value_list_c |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
989 |
* will NOT recursively call the following enumerated_value_c visitor method! |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
990 |
*/ |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
991 |
void *fill_candidate_datatypes_c::visit(enumerated_value_c *symbol) { |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
992 |
symbol_c *global_enumerated_type; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
993 |
symbol_c *local_enumerated_type; |
735
0304ff59fd7f
Fix some important clang++ warnings.
Manuele Conti <conti.ma@alice.it>
parents:
733
diff
changeset
|
994 |
symbol_c *enumerated_type = NULL; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
995 |
|
724
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
996 |
if (NULL != symbol->type) { |
733
246b4ef78da6
Do datatype verification of fully qualified enumerated values (e.g. ENUMTYPE#enumconst)
Mario de Sousa <msousa@fe.up.pt>
parents:
732
diff
changeset
|
997 |
/* NOTE: This code must take into account the following situation: |
724
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
998 |
* |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
999 |
* TYPE |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1000 |
* base_enum_t: (x1, x2, x3); |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1001 |
* enum_t1 : base_enum_t := x1; |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1002 |
* enum_t2 : base_enum_t := x2; |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1003 |
* enum_t12: enum_t1 := x2; |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1004 |
* END_TYPE |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1005 |
* |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1006 |
* considering the above, ALL of the following are correct! |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1007 |
* base_enum_t#x1 |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1008 |
* enum_t1#x1 |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1009 |
* enum_t2#x1 |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1010 |
* enum_t12#x1 |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1011 |
*/ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1012 |
/* check whether the value really belongs to that datatype!! */ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1013 |
/* All local enum values are declared inside anonymous enumeration datatypes (i.e. inside a VAR ... END_VAR declaration, with |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1014 |
* the enum type having no type name), so thay cannot possibly be referenced using a datatype_t#enumvalue syntax. |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1015 |
* Because of this, we only look for the datatype identifier in the global enum value symbol table! |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1016 |
*/ |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1017 |
enumerated_type = NULL; // assume error... |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1018 |
enumerated_value_symtable_t::iterator lower = global_enumerated_value_symtable.lower_bound(symbol->value); |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1019 |
enumerated_value_symtable_t::iterator upper = global_enumerated_value_symtable.upper_bound(symbol->value); |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1020 |
for (; lower != upper; lower++) |
733
246b4ef78da6
Do datatype verification of fully qualified enumerated values (e.g. ENUMTYPE#enumconst)
Mario de Sousa <msousa@fe.up.pt>
parents:
732
diff
changeset
|
1021 |
if (get_datatype_info_c::is_type_equal(base_type(lower->second), base_type(symbol->type))) |
724
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1022 |
enumerated_type = symbol->type; |
d19877568878
Check for errors in enum datatype declarations. (This is not yet complete as it will not yet stop the compilation process if these errors are found)
Mario de Sousa <msousa@fe.up.pt>
parents:
720
diff
changeset
|
1023 |
} |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1024 |
else { |
720
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1025 |
symbol_c *global_enumerated_type = global_enumerated_value_symtable.find_value (symbol->value); |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1026 |
symbol_c * local_enumerated_type = local_enumerated_value_symtable.find_value (symbol->value); |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1027 |
int global_multiplicity = global_enumerated_value_symtable.count(symbol->value); |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1028 |
int local_multiplicity = local_enumerated_value_symtable.count(symbol->value); |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1029 |
|
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1030 |
if (( local_multiplicity == 0) && (global_multiplicity == 0)) |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1031 |
enumerated_type = NULL; // not found! |
720
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1032 |
else if ( local_multiplicity > 1) |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1033 |
enumerated_type = NULL; // Local duplicate, so it is ambiguous! |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1034 |
else if ( local_multiplicity == 1) |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1035 |
enumerated_type = local_enumerated_type; |
720
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1036 |
else if ( global_multiplicity > 1) |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1037 |
enumerated_type = NULL; // Global duplicate, so it is ambiguous! |
f637ac331a68
Use duplicate symtable instead of symtable for enum constant value table (this will later allow us to detect semantic errors in IEC 61131-3 source code)
Mario de Sousa <msousa@fe.up.pt>
parents:
719
diff
changeset
|
1038 |
else if ( global_multiplicity == 1) |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1039 |
enumerated_type = global_enumerated_type; |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1040 |
else ERROR; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1041 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1042 |
enumerated_type = base_type(enumerated_type); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1043 |
if (NULL != enumerated_type) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1044 |
add_datatype_to_candidate_list(symbol, enumerated_type); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1045 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1046 |
if (debug) std::cout << "ENUMERATE [" << symbol->candidate_datatypes.size() << "]\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1047 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1048 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1049 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1050 |
|
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1051 |
/* identifier ':' array_spec_init */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1052 |
// SYM_REF2(array_type_declaration_c, identifier, array_spec_init) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
1053 |
void *fill_candidate_datatypes_c::visit(array_type_declaration_c *symbol) {return fill_type_decl(symbol, symbol->identifier, symbol->array_spec_init);} |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1054 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1055 |
/* array_specification [ASSIGN array_initialization} */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1056 |
/* array_initialization may be NULL ! */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1057 |
// SYM_REF2(array_spec_init_c, array_specification, array_initialization) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
1058 |
void *fill_candidate_datatypes_c::visit(array_spec_init_c *symbol) {return fill_spec_init(symbol, symbol->array_specification, symbol->array_initialization);} |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1059 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1060 |
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1061 |
// SYM_REF2(array_specification_c, array_subrange_list, non_generic_type_name) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1062 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1063 |
/* helper symbol for array_specification */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1064 |
/* array_subrange_list ',' subrange */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1065 |
// SYM_LIST(array_subrange_list_c) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1066 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1067 |
/* array_initialization: '[' array_initial_elements_list ']' */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1068 |
/* helper symbol for array_initialization */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1069 |
/* array_initial_elements_list ',' array_initial_elements */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1070 |
// SYM_LIST(array_initial_elements_list_c) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1071 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1072 |
/* integer '(' [array_initial_element] ')' */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1073 |
/* array_initial_element may be NULL ! */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1074 |
// SYM_REF2(array_initial_elements_c, integer, array_initial_element) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1075 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1076 |
/* structure_type_name ':' structure_specification */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1077 |
// SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
1078 |
void *fill_candidate_datatypes_c::visit(structure_type_declaration_c *symbol) {return fill_type_decl(symbol, symbol->structure_type_name, symbol->structure_specification);} |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1079 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1080 |
/* structure_type_name ASSIGN structure_initialization */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1081 |
/* structure_initialization may be NULL ! */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1082 |
// SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization) |
806
f218434eeaf8
Fill in the symbol.datatype annotation in symbol classes used in derived data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
763
diff
changeset
|
1083 |
void *fill_candidate_datatypes_c::visit(initialized_structure_c *symbol) {return fill_spec_init(symbol, symbol->structure_type_name, symbol->structure_initialization);} |
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1084 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1085 |
/* helper symbol for structure_declaration */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1086 |
/* structure_declaration: STRUCT structure_element_declaration_list END_STRUCT */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1087 |
/* structure_element_declaration_list structure_element_declaration ';' */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1088 |
// SYM_LIST(structure_element_declaration_list_c) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1089 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1090 |
/* structure_element_name ':' *_spec_init */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1091 |
// SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1092 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1093 |
/* helper symbol for structure_initialization */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1094 |
/* structure_initialization: '(' structure_element_initialization_list ')' */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1095 |
/* structure_element_initialization_list ',' structure_element_initialization */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1096 |
// SYM_LIST(structure_element_initialization_list_c) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1097 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1098 |
/* structure_element_name ASSIGN value */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1099 |
// SYM_REF2(structure_element_initialization_c, structure_element_name, value) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1100 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1101 |
/* string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */ |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1102 |
// SYM_REF4(string_type_declaration_c, string_type_name, elementary_string_type_name, string_type_declaration_size, string_type_declaration_init/* may be == NULL! */) |
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1103 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1104 |
|
810
d9c48ad646f1
Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents:
808
diff
changeset
|
1105 |
/* function_block_type_name ASSIGN structure_initialization */ |
d9c48ad646f1
Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents:
808
diff
changeset
|
1106 |
/* structure_initialization -> may be NULL ! */ |
d9c48ad646f1
Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents:
808
diff
changeset
|
1107 |
// SYM_REF2(fb_spec_init_c, function_block_type_name, structure_initialization) |
d9c48ad646f1
Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents:
808
diff
changeset
|
1108 |
void *fill_candidate_datatypes_c::visit(fb_spec_init_c *symbol) {return fill_spec_init(symbol, symbol->function_block_type_name, symbol->structure_initialization);} |
d9c48ad646f1
Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents:
808
diff
changeset
|
1109 |
|
717
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1110 |
|
44f74fad2cc0
Start datatype checking of variable declarations (for now, only seting symbol.datatype of enumerations)
Mario de Sousa <msousa@fe.up.pt>
parents:
716
diff
changeset
|
1111 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1112 |
/*********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1113 |
/* B 1.4 - Variables */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1114 |
/*********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1115 |
void *fill_candidate_datatypes_c::visit(symbolic_variable_c *symbol) { |
479 | 1116 |
add_datatype_to_candidate_list(symbol, search_varfb_instance_type->get_basetype_decl(symbol)); /* will only add if non NULL */ |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1117 |
if (debug) std::cout << "VAR [" << symbol->candidate_datatypes.size() << "]\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1118 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1119 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1120 |
|
502
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1121 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1122 |
/********************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1123 |
/* B 1.4.1 - Directly Represented Variables */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1124 |
/********************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1125 |
void *fill_candidate_datatypes_c::visit(direct_variable_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1126 |
/* Comment added by mario: |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1127 |
* The following code is safe, actually, as the lexical parser guarantees the correct IEC61131-3 syntax was used. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1128 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1129 |
/* However, we should probably add an assertion in case we later change the lexical parser! */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1130 |
/* if (symbol->value == NULL) ERROR; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1131 |
* if (symbol->value[0] == '\0') ERROR; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1132 |
* if (symbol->value[1] == '\0') ERROR; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1133 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1134 |
switch (symbol->value[2]) { |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1135 |
case 'x': case 'X': /* bit - 1 bit */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name); break; |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1136 |
case 'b': case 'B': /* byte - 8 bits */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::byte_type_name); break; |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1137 |
case 'w': case 'W': /* word - 16 bits */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::word_type_name); break; |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1138 |
case 'd': case 'D': /* dword - 32 bits */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::dword_type_name); break; |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1139 |
case 'l': case 'L': /* lword - 64 bits */ add_datatype_to_candidate_list(symbol, &get_datatype_info_c::lword_type_name); break; |
479 | 1140 |
/* if none of the above, then the empty string was used <=> boolean */ |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1141 |
default: add_datatype_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name); break; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1142 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1143 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1144 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1145 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1146 |
/*************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1147 |
/* B 1.4.2 - Multi-element variables */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1148 |
/*************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1149 |
/* subscripted_variable '[' subscript_list ']' */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1150 |
// SYM_REF2(array_variable_c, subscripted_variable, subscript_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1151 |
void *fill_candidate_datatypes_c::visit(array_variable_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1152 |
/* get the declaration of the data type __stored__ in the array... */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1153 |
/* if we were to want the data type of the array itself, then we should call_param_name |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1154 |
* search_varfb_instance_type->get_basetype_decl(symbol->subscripted_variable) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1155 |
*/ |
827
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1156 |
add_datatype_to_candidate_list(symbol, search_varfb_instance_type->get_basetype_decl(symbol)); /* will only add if non NULL */ |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1157 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1158 |
/* recursively call the subscript list, so we can check the data types of the expressions used for the subscripts */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1159 |
symbol->subscript_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1160 |
|
827
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1161 |
/* recursively call the subscripted_variable. We need to do this since the array variable may be stored inside a structured |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1162 |
* variable (i.e. if it is an element inside a struct), in which case we want to recursively visit every element of the struct, |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1163 |
* as it may contain more arrays whose subscripts must also be visited! |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1164 |
* e.g. structvar.a1[v1+2].b1.c1[v2+3].d1 |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1165 |
* TYPE |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1166 |
* d_s: STRUCT d1: int; d2: int; |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1167 |
* d_a: ARRAY [1..3] OF d_s; |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1168 |
* c_s: STRUCT c1: d_a; c2: d_a; |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1169 |
* b_s: STRUCT b1: c_s; b2: c_s; |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1170 |
* b_a: ARRAY [1..3] OF b_s; |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1171 |
* a_s: STRUCT a1: b_a; a2: b_a; |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1172 |
* END_TYPE |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1173 |
* VAR |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1174 |
* structvar: a_s; |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1175 |
* END_VAR |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1176 |
*/ |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1177 |
symbol->subscripted_variable->accept(*this); |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1178 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1179 |
if (debug) std::cout << "ARRAY_VAR [" << symbol->candidate_datatypes.size() << "]\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1180 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1181 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1182 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1183 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1184 |
/* subscript_list ',' subscript */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1185 |
// SYM_LIST(subscript_list_c) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1186 |
/* NOTE: we inherit from iterator visitor, so we do not need to implement this method... */ |
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1187 |
// void *fill_candidate_datatypes_c::visit(subscript_list_c *symbol) |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1188 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1189 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1190 |
/* record_variable '.' field_selector */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1191 |
/* WARNING: input and/or output variables of function blocks |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1192 |
* may be accessed as fields of a structured variable! |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1193 |
* Code handling a structured_variable_c must take |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1194 |
* this into account! |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1195 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1196 |
// SYM_REF2(structured_variable_c, record_variable, field_selector) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1197 |
void *fill_candidate_datatypes_c::visit(structured_variable_c *symbol) { |
827
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1198 |
/* NOTE: We do not need to recursively determine the data types of each field_selector, as the search_varfb_instance_type |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1199 |
* will do that for us. So we determine the candidate datatypes only for the full structured_variable. |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1200 |
*/ |
479 | 1201 |
add_datatype_to_candidate_list(symbol, search_varfb_instance_type->get_basetype_decl(symbol)); /* will only add if non NULL */ |
827
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1202 |
/* However, we do need to visit each record type recursively! |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1203 |
* Remember that a structured variable may be stored inside an array (e.g. arrayvar[33].elem1) |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1204 |
* The array subscripts may contain a complex expression (e.g. arrayvar[ varx + 33].elem1) whose datatype must be correctly determined! |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1205 |
* The expression, may even contain a function call to an overloaded function! |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1206 |
* (e.g. arrayvar[ varx + TRUNC(realvar)].elem1) |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1207 |
*/ |
e3800aff352c
Fix datatype analysis of structured variables that contain arrays in their fields (e.g. var.x1[var2 + 42].y1).
mjsousa
parents:
813
diff
changeset
|
1208 |
symbol->record_variable->accept(*this); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1209 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1210 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1211 |
|
502
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1212 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1213 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1214 |
/******************************************/ |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1215 |
/* B 1.4.3 - Declaration & Initialisation */ |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1216 |
/******************************************/ |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1217 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1218 |
void *fill_candidate_datatypes_c::visit(var1_list_c *symbol) { |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1219 |
for(int i = 0; i < symbol->n; i++) { |
732
f6a46e29853b
Add datatype checking of enumeration data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
729
diff
changeset
|
1220 |
/* We don't really need to set the datatype of each variable. We just check the declaration itself! |
f6a46e29853b
Add datatype checking of enumeration data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
729
diff
changeset
|
1221 |
add_datatype_to_candidate_list(symbol->elements[i], search_varfb_instance_type->get_basetype_decl(symbol->elements[i])); // will only add if non NULL |
f6a46e29853b
Add datatype checking of enumeration data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
729
diff
changeset
|
1222 |
*/ |
f6a46e29853b
Add datatype checking of enumeration data type declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
729
diff
changeset
|
1223 |
symbol->elements[i]->accept(*this); // handle the extensible_input_parameter_c, etc... |
502
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1224 |
} |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1225 |
return NULL; |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1226 |
} |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1227 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1228 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1229 |
/* AT direct_variable */ |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1230 |
// SYM_REF1(location_c, direct_variable) |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1231 |
void *fill_candidate_datatypes_c::visit(location_c *symbol) { |
558
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1232 |
/* This is a special situation. |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1233 |
* |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1234 |
* The reason is that a located variable may be declared to be of any data type, as long as the size |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1235 |
* matches the location (lines 1 3 and 4 of table 17). For example: |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1236 |
* var1 AT %MB42.0 : BYTE; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1237 |
* var1 AT %MB42.1 : SINT; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1238 |
* var1 AT %MB42.2 : USINT; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1239 |
* var1 AT %MW64 : INT; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1240 |
* var1 AT %MD56 : DINT; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1241 |
* var1 AT %MD57 : REAL; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1242 |
* are all valid!! |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1243 |
* |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1244 |
* However, when used inside an expression, the direct variable (uses the same syntax as the location |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1245 |
* of a located variable) is limited to the following (ANY_BIT) data types: |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1246 |
* %MX --> BOOL |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1247 |
* %MB --> BYTE |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1248 |
* %MW --> WORD |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1249 |
* %MD --> DWORD |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1250 |
* %ML --> LWORD |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1251 |
* |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1252 |
* So, in order to be able to analyse expressions with direct variables |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1253 |
* e.g: var1 := 66 OR %MW34 |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1254 |
* where the direct variable may only take the ANY_BIT data types, the fill_candidate_datatypes_c |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1255 |
* considers that only the ANY_BIT data types are allowed for a direct variable. |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1256 |
* However, it appears from the examples in the standard (lines 1 3 and 4 of table 17) |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1257 |
* a location may have any data type (presumably as long as the size in bits match). |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1258 |
* For this reason, a location_c may have more allowable data types than a direct_variable_c |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1259 |
*/ |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1260 |
|
502
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1261 |
symbol->direct_variable->accept(*this); |
558
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1262 |
for (unsigned int i = 0; i < symbol->direct_variable->candidate_datatypes.size(); i++) { |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1263 |
switch (get_sizeof_datatype_c::getsize(symbol->direct_variable->candidate_datatypes[i])) { |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1264 |
case 1: /* bit - 1 bit */ |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1265 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::bool_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1266 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safebool_type_name); |
558
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1267 |
break; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1268 |
case 8: /* byte - 8 bits */ |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1269 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::byte_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1270 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safebyte_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1271 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::sint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1272 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safesint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1273 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::usint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1274 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeusint_type_name); |
558
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1275 |
break; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1276 |
case 16: /* word - 16 bits */ |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1277 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::word_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1278 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeword_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1279 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::int_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1280 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1281 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::uint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1282 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeuint_type_name); |
558
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1283 |
break; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1284 |
case 32: /* dword - 32 bits */ |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1285 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::dword_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1286 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safedword_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1287 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::dint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1288 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safedint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1289 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::udint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1290 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeudint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1291 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::real_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1292 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safereal_type_name); |
558
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1293 |
break; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1294 |
case 64: /* lword - 64 bits */ |
693
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1295 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::lword_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1296 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safelword_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1297 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::lint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1298 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safelint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1299 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::ulint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1300 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safeulint_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1301 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::lreal_type_name); |
51a2fa6441b9
Prepare to delete search_constant_type_c -> Move the static variables from search_constant_type_c to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
690
diff
changeset
|
1302 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::safelreal_type_name); |
558
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1303 |
break; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1304 |
default: /* if none of the above, then no valid datatype allowed... */ |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1305 |
break; |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1306 |
} /* switch() */ |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1307 |
} /* for */ |
9273dfc5fa7c
Located variables may have other data types besides ANY_BIT.
mjsousa <msousa@fe.up.pt>
parents:
552
diff
changeset
|
1308 |
|
502
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1309 |
return NULL; |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1310 |
} |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1311 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1312 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1313 |
/* [variable_name] location ':' located_var_spec_init */ |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1314 |
/* variable_name -> may be NULL ! */ |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1315 |
// SYM_REF3(located_var_decl_c, variable_name, location, located_var_spec_init) |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1316 |
void *fill_candidate_datatypes_c::visit(located_var_decl_c *symbol) { |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1317 |
symbol->located_var_spec_init->accept(*this); |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1318 |
symbol->location->accept(*this); |
523
773303b7f31f
Remove potential access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents:
502
diff
changeset
|
1319 |
if (NULL != symbol->variable_name) { |
773303b7f31f
Remove potential access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents:
502
diff
changeset
|
1320 |
symbol->variable_name->candidate_datatypes = symbol->location->candidate_datatypes; |
773303b7f31f
Remove potential access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents:
502
diff
changeset
|
1321 |
intersect_candidate_datatype_list(symbol->variable_name /*origin, dest.*/, symbol->located_var_spec_init /*with*/); |
773303b7f31f
Remove potential access to NULL pointer.
Mario de Sousa <msousa@fe.up.pt>
parents:
502
diff
changeset
|
1322 |
} |
502
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1323 |
return NULL; |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1324 |
} |
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1325 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1326 |
|
a6211f73690b
Start data type checking of var declarations (including direct variables!)
Mario de Sousa <msousa@fe.up.pt>
parents:
490
diff
changeset
|
1327 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1328 |
/************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1329 |
/* B 1.5 Program organization units */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1330 |
/************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1331 |
/*********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1332 |
/* B 1.5.1 Functions */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1333 |
/*********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1334 |
void *fill_candidate_datatypes_c::visit(function_declaration_c *symbol) { |
479 | 1335 |
if (debug) printf("Filling candidate data types list of function %s\n", ((token_c *)(symbol->derived_function_name))->value); |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1336 |
local_enumerated_value_symtable.reset(); |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1337 |
symbol->var_declarations_list->accept(populate_enumvalue_symtable); |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1338 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1339 |
search_varfb_instance_type = new search_varfb_instance_type_c(symbol); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1340 |
symbol->var_declarations_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1341 |
symbol->function_body->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1342 |
delete search_varfb_instance_type; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1343 |
search_varfb_instance_type = NULL; |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1344 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1345 |
local_enumerated_value_symtable.reset(); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1346 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1347 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1348 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1349 |
/***************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1350 |
/* B 1.5.2 Function blocks */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1351 |
/***************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1352 |
void *fill_candidate_datatypes_c::visit(function_block_declaration_c *symbol) { |
479 | 1353 |
if (debug) printf("Filling candidate data types list of FB %s\n", ((token_c *)(symbol->fblock_name))->value); |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1354 |
local_enumerated_value_symtable.reset(); |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1355 |
symbol->var_declarations->accept(populate_enumvalue_symtable); |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1356 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1357 |
search_varfb_instance_type = new search_varfb_instance_type_c(symbol); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1358 |
symbol->var_declarations->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1359 |
symbol->fblock_body->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1360 |
delete search_varfb_instance_type; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1361 |
search_varfb_instance_type = NULL; |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1362 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1363 |
local_enumerated_value_symtable.reset(); |
807
4d71292f8732
Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
806
diff
changeset
|
1364 |
|
4d71292f8732
Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
806
diff
changeset
|
1365 |
/* The FB declaration itself may be used as a dataype! We now do the fill algorithm considering |
4d71292f8732
Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
806
diff
changeset
|
1366 |
* function_block_declaration_c a data type declaration... |
4d71292f8732
Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
806
diff
changeset
|
1367 |
*/ |
4d71292f8732
Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
806
diff
changeset
|
1368 |
// The next line is essentially equivalent to doing--> symbol->candidate_datatypes.push_back(symbol); |
4d71292f8732
Fill symbol->datatype anotation for FB declarations.
Mario de Sousa <msousa@fe.up.pt>
parents:
806
diff
changeset
|
1369 |
add_datatype_to_candidate_list(symbol, base_type(symbol)); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1370 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1371 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1372 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1373 |
/**********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1374 |
/* B 1.5.3 - Programs */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1375 |
/**********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1376 |
void *fill_candidate_datatypes_c::visit(program_declaration_c *symbol) { |
479 | 1377 |
if (debug) printf("Filling candidate data types list in program %s\n", ((token_c *)(symbol->program_type_name))->value); |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1378 |
local_enumerated_value_symtable.reset(); |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1379 |
symbol->var_declarations->accept(populate_enumvalue_symtable); |
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1380 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1381 |
search_varfb_instance_type = new search_varfb_instance_type_c(symbol); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1382 |
symbol->var_declarations->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1383 |
symbol->function_block_body->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1384 |
delete search_varfb_instance_type; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1385 |
search_varfb_instance_type = NULL; |
716
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1386 |
|
eb9aad0c3627
Do datatype checking of enum values defined inside anonymous enumeration types (i.e. enum types defined inside a VAR ... END_VAR daclaration).
Mario de Sousa <msousa@fe.up.pt>
parents:
693
diff
changeset
|
1387 |
local_enumerated_value_symtable.reset(); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1388 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1389 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1390 |
|
802
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1391 |
/********************************************/ |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1392 |
/* B 1.6 Sequential function chart elements */ |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1393 |
/********************************************/ |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1394 |
|
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1395 |
void *fill_candidate_datatypes_c::visit(transition_condition_c *symbol) { |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1396 |
symbol_c *condition_type; |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1397 |
|
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1398 |
if (symbol->transition_condition_il != NULL) { |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1399 |
symbol->transition_condition_il->accept(*this); |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1400 |
for (unsigned int i = 0; i < symbol->transition_condition_il->candidate_datatypes.size(); i++) { |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1401 |
condition_type = symbol->transition_condition_il->candidate_datatypes[i]; |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1402 |
if (get_datatype_info_c::is_BOOL_compatible(condition_type)) |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1403 |
add_datatype_to_candidate_list(symbol, condition_type); |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1404 |
} |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1405 |
} |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1406 |
if (symbol->transition_condition_st != NULL) { |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1407 |
symbol->transition_condition_st->accept(*this); |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1408 |
for (unsigned int i = 0; i < symbol->transition_condition_st->candidate_datatypes.size(); i++) { |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1409 |
condition_type = symbol->transition_condition_st->candidate_datatypes[i]; |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1410 |
if (get_datatype_info_c::is_BOOL_compatible(condition_type)) |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1411 |
add_datatype_to_candidate_list(symbol, condition_type); |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1412 |
} |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1413 |
} |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1414 |
return NULL; |
cac262d1d6a5
Fixed bug with SFC transition datatype checking
Laurent Bessard
parents:
763
diff
changeset
|
1415 |
} |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1416 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1417 |
/********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1418 |
/* B 1.7 Configuration elements */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1419 |
/********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1420 |
void *fill_candidate_datatypes_c::visit(configuration_declaration_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1421 |
// TODO !!! |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1422 |
/* for the moment we must return NULL so semantic analysis of remaining code is not interrupted! */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1423 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1424 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1425 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1426 |
/****************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1427 |
/* B.2 - Language IL (Instruction List) */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1428 |
/****************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1429 |
/***********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1430 |
/* B 2.1 Instructions and Operands */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1431 |
/***********************************/ |
443
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1432 |
|
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1433 |
/*| instruction_list il_instruction */ |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1434 |
// SYM_LIST(instruction_list_c) |
464
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1435 |
void *fill_candidate_datatypes_c::visit(instruction_list_c *symbol) { |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1436 |
/* In order to fill the data type candidates correctly |
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1437 |
* in IL instruction lists containing JMPs to labels that come before the JMP instruction |
464
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1438 |
* itself, we need to run the fill candidate datatypes algorithm twice on the Instruction List. |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1439 |
* e.g.: ... |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1440 |
* ld 23 |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1441 |
* label1:st byte_var |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1442 |
* ld 34 |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1443 |
* JMP label1 |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1444 |
* |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1445 |
* Note that the second time we run the algorithm, most of the candidate datatypes are already filled |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1446 |
* in, so it will be able to produce tha correct candidate datatypes for the IL instruction referenced |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1447 |
* by the label, as in the 2nd pass we already know the candidate datatypes of the JMP instruction! |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1448 |
*/ |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1449 |
for(int j = 0; j < 2; j++) { |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1450 |
for(int i = 0; i < symbol->n; i++) { |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1451 |
symbol->elements[i]->accept(*this); |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1452 |
} |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1453 |
} |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1454 |
return NULL; |
319ee8b218f3
Handle JMP to labels preceding the JMP instruction itself.
Mario de Sousa <msousa@fe.up.pt>
parents:
462
diff
changeset
|
1455 |
} |
443
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1456 |
|
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1457 |
|
459
01f6664bf8c5
Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents:
457
diff
changeset
|
1458 |
|
443
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1459 |
/* | label ':' [il_incomplete_instruction] eol_list */ |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1460 |
// SYM_REF2(il_instruction_c, label, il_instruction) |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1461 |
// void *visit(instruction_list_c *symbol); |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1462 |
void *fill_candidate_datatypes_c::visit(il_instruction_c *symbol) { |
448
1bd18fc06911
Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents:
447
diff
changeset
|
1463 |
if (NULL == symbol->il_instruction) { |
450
eb1b28acec2e
Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
449
diff
changeset
|
1464 |
/* This empty/null il_instruction does not change the value of the current/default IL variable. |
eb1b28acec2e
Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
449
diff
changeset
|
1465 |
* So it inherits the candidate_datatypes from it's previous IL instructions! |
eb1b28acec2e
Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
449
diff
changeset
|
1466 |
*/ |
459
01f6664bf8c5
Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents:
457
diff
changeset
|
1467 |
intersect_prev_candidate_datatype_lists(symbol); |
448
1bd18fc06911
Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents:
447
diff
changeset
|
1468 |
} else { |
459
01f6664bf8c5
Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents:
457
diff
changeset
|
1469 |
il_instruction_c fake_prev_il_instruction = *symbol; |
01f6664bf8c5
Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents:
457
diff
changeset
|
1470 |
intersect_prev_candidate_datatype_lists(&fake_prev_il_instruction); |
01f6664bf8c5
Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents:
457
diff
changeset
|
1471 |
|
457
67d8b07bac22
Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents:
456
diff
changeset
|
1472 |
if (symbol->prev_il_instruction.size() == 0) prev_il_instruction = NULL; |
459
01f6664bf8c5
Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents:
457
diff
changeset
|
1473 |
else prev_il_instruction = &fake_prev_il_instruction; |
448
1bd18fc06911
Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents:
447
diff
changeset
|
1474 |
symbol->il_instruction->accept(*this); |
1bd18fc06911
Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents:
447
diff
changeset
|
1475 |
prev_il_instruction = NULL; |
1bd18fc06911
Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents:
447
diff
changeset
|
1476 |
|
1bd18fc06911
Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents:
447
diff
changeset
|
1477 |
/* This object has (inherits) the same candidate datatypes as the il_instruction */ |
467
4910eaa1206a
Delete no longer needed copy_candidate_datatype_list() function.
Mario de Sousa <msousa@fe.up.pt>
parents:
465
diff
changeset
|
1478 |
symbol->candidate_datatypes = symbol->il_instruction->candidate_datatypes; |
448
1bd18fc06911
Add support for semantic verification for implict FB calls in IL (e.g. PV ton_var)
Mario de Sousa <msousa@fe.up.pt>
parents:
447
diff
changeset
|
1479 |
} |
443
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1480 |
|
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1481 |
return NULL; |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1482 |
} |
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1483 |
|
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1484 |
|
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1485 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1486 |
void *fill_candidate_datatypes_c::visit(il_simple_operation_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1487 |
/* determine the data type of the operand */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1488 |
if (NULL != symbol->il_operand) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1489 |
symbol->il_operand->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1490 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1491 |
/* recursive call to fill the candidate data types list */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1492 |
il_operand = symbol->il_operand; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1493 |
symbol->il_simple_operator->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1494 |
il_operand = NULL; |
443
ff4d26b7e51d
Narrow IL code backwords, so as to correctly handle invocations to overloaded functions from IL code.
Mario de Sousa <msousa@fe.up.pt>
parents:
442
diff
changeset
|
1495 |
/* This object has (inherits) the same candidate datatypes as the il_simple_operator */ |
467
4910eaa1206a
Delete no longer needed copy_candidate_datatype_list() function.
Mario de Sousa <msousa@fe.up.pt>
parents:
465
diff
changeset
|
1496 |
symbol->candidate_datatypes = symbol->il_simple_operator->candidate_datatypes; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1497 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1498 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1499 |
|
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1500 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1501 |
/* | function_name [il_operand_list] */ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1502 |
/* NOTE: The parameters 'called_function_declaration' and 'extensible_param_count' are used to pass data between the stage 3 and stage 4. */ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1503 |
// SYM_REF2(il_function_call_c, function_name, il_operand_list, symbol_c *called_function_declaration; int extensible_param_count;) |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1504 |
void *fill_candidate_datatypes_c::visit(il_function_call_c *symbol) { |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1505 |
/* The first parameter of a non formal function call in IL will be the 'current value' (i.e. the prev_il_instruction) |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1506 |
* In order to be able to handle this without coding special cases, we will simply prepend that symbol |
451 | 1507 |
* to the il_operand_list, and remove it after calling handle_function_call(). |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1508 |
* |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1509 |
* However, if no further paramters are given, then il_operand_list will be NULL, and we will |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1510 |
* need to create a new object to hold the pointer to prev_il_instruction. |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1511 |
*/ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1512 |
if (NULL == symbol->il_operand_list) symbol->il_operand_list = new il_operand_list_c; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1513 |
if (NULL == symbol->il_operand_list) ERROR; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1514 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1515 |
symbol->il_operand_list->accept(*this); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1516 |
|
451 | 1517 |
if (NULL != prev_il_instruction) { |
1518 |
((list_c *)symbol->il_operand_list)->insert_element(prev_il_instruction, 0); |
|
1519 |
||
1520 |
generic_function_call_t fcall_param = { |
|
1521 |
/* fcall_param.function_name = */ symbol->function_name, |
|
1522 |
/* fcall_param.nonformal_operand_list = */ symbol->il_operand_list, |
|
1523 |
/* fcall_param.formal_operand_list = */ NULL, |
|
1524 |
/* enum {POU_FB, POU_function} POU_type = */ generic_function_call_t::POU_function, |
|
1525 |
/* fcall_param.candidate_functions = */ symbol->candidate_functions, |
|
1526 |
/* fcall_param.called_function_declaration = */ symbol->called_function_declaration, |
|
1527 |
/* fcall_param.extensible_param_count = */ symbol->extensible_param_count |
|
1528 |
}; |
|
1529 |
handle_function_call(symbol, fcall_param); |
|
1530 |
||
1531 |
/* Undo the changes to the abstract syntax tree we made above... */ |
|
1532 |
((list_c *)symbol->il_operand_list)->remove_element(0); |
|
1533 |
} |
|
1534 |
||
1535 |
/* Undo the changes to the abstract syntax tree we made above... */ |
|
1536 |
if (((list_c *)symbol->il_operand_list)->n == 0) { |
|
1537 |
/* if the list becomes empty, then that means that it did not exist before we made these changes, so we delete it! */ |
|
1538 |
delete symbol->il_operand_list; |
|
1539 |
symbol->il_operand_list = NULL; |
|
1540 |
} |
|
1541 |
||
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1542 |
if (debug) std::cout << "il_function_call_c [" << symbol->candidate_datatypes.size() << "] result.\n"; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1543 |
return NULL; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1544 |
} |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1545 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1546 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1547 |
/* | il_expr_operator '(' [il_operand] eol_list [simple_instr_list] ')' */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1548 |
// SYM_REF3(il_expression_c, il_expr_operator, il_operand, simple_instr_list); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1549 |
void *fill_candidate_datatypes_c::visit(il_expression_c *symbol) { |
453
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1550 |
symbol_c *prev_il_instruction_backup = prev_il_instruction; |
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1551 |
|
690
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1552 |
/* Stage2 will insert an artificial (and equivalent) LD <il_operand> to the simple_instr_list if necessary. We can therefore ignore the 'il_operand' entry! */ |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1553 |
// if (NULL != symbol->il_operand) |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1554 |
// symbol->il_operand->accept(*this); |
453
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1555 |
|
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1556 |
if(symbol->simple_instr_list != NULL) |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1557 |
symbol->simple_instr_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1558 |
|
690
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1559 |
/* Since stage2 will insert an artificial (and equivalent) LD <il_operand> to the simple_instr_list when an 'il_operand' exists, we know |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1560 |
* that if (symbol->il_operand != NULL), then the first IL instruction in the simple_instr_list will be the equivalent and artificial |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1561 |
* 'LD <il_operand>' IL instruction. |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1562 |
* Just to be cosistent, we will copy the datatype info back into the il_operand, even though this should not be necessary! |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1563 |
*/ |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1564 |
if ((NULL != symbol->il_operand) && ((NULL == symbol->simple_instr_list) || (0 == ((list_c *)symbol->simple_instr_list)->n))) ERROR; // stage2 is not behaving as we expect it to! |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1565 |
if (NULL != symbol->il_operand) |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1566 |
symbol->il_operand->candidate_datatypes = ((list_c *)symbol->simple_instr_list)->elements[0]->candidate_datatypes; |
6156ee2b4e32
Correctly generate C code for IL expressions, i.e. IL instructions inside parenthesis.
Mario de Sousa <msousa@fe.up.pt>
parents:
676
diff
changeset
|
1567 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1568 |
/* Now check the if the data type semantics of operation are correct, */ |
452
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1569 |
il_operand = symbol->simple_instr_list; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1570 |
prev_il_instruction = prev_il_instruction_backup; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1571 |
symbol->il_expr_operator->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1572 |
il_operand = NULL; |
454
099aa5d655de
Finish support for semantic verification of IL paranthesised expressions.
Mario de Sousa <msousa@fe.up.pt>
parents:
453
diff
changeset
|
1573 |
|
099aa5d655de
Finish support for semantic verification of IL paranthesised expressions.
Mario de Sousa <msousa@fe.up.pt>
parents:
453
diff
changeset
|
1574 |
/* This object has the same candidate datatypes as the il_expr_operator. */ |
467
4910eaa1206a
Delete no longer needed copy_candidate_datatype_list() function.
Mario de Sousa <msousa@fe.up.pt>
parents:
465
diff
changeset
|
1575 |
symbol->candidate_datatypes = symbol->il_expr_operator->candidate_datatypes; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1576 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1577 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1578 |
|
462
f7dada0a8952
Fix filling candidate datatypes of JMP operations
Mario de Sousa <msousa@fe.up.pt>
parents:
459
diff
changeset
|
1579 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1580 |
void *fill_candidate_datatypes_c::visit(il_jump_operation_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1581 |
/* recursive call to fill the candidate data types list */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1582 |
il_operand = NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1583 |
symbol->il_jump_operator->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1584 |
il_operand = NULL; |
462
f7dada0a8952
Fix filling candidate datatypes of JMP operations
Mario de Sousa <msousa@fe.up.pt>
parents:
459
diff
changeset
|
1585 |
/* This object has the same candidate datatypes as the il_jump_operator. */ |
467
4910eaa1206a
Delete no longer needed copy_candidate_datatype_list() function.
Mario de Sousa <msousa@fe.up.pt>
parents:
465
diff
changeset
|
1586 |
symbol->candidate_datatypes = symbol->il_jump_operator->candidate_datatypes; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1587 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1588 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1589 |
|
439
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1590 |
|
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1591 |
/* il_call_operator prev_declared_fb_name |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1592 |
* | il_call_operator prev_declared_fb_name '(' ')' |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1593 |
* | il_call_operator prev_declared_fb_name '(' eol_list ')' |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1594 |
* | il_call_operator prev_declared_fb_name '(' il_operand_list ')' |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1595 |
* | il_call_operator prev_declared_fb_name '(' eol_list il_param_list ')' |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1596 |
*/ |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1597 |
/* NOTE: The parameter 'called_fb_declaration'is used to pass data between stage 3 and stage4 */ |
439
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1598 |
// SYM_REF4(il_fb_call_c, il_call_operator, fb_name, il_operand_list, il_param_list, symbol_c *called_fb_declaration) |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1599 |
void *fill_candidate_datatypes_c::visit(il_fb_call_c *symbol) { |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1600 |
symbol_c *fb_decl = search_varfb_instance_type->get_basetype_decl(symbol->fb_name); |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1601 |
if (! get_datatype_info_c::is_function_block(fb_decl)) fb_decl = NULL; |
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1602 |
|
439
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1603 |
/* Although a call to a non-declared FB is a semantic error, this is currently caught by stage 2! */ |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1604 |
if (NULL == fb_decl) ERROR; |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1605 |
|
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1606 |
if (symbol-> il_param_list != NULL) symbol->il_param_list->accept(*this); |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1607 |
if (symbol->il_operand_list != NULL) symbol->il_operand_list->accept(*this); |
439
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1608 |
|
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1609 |
/* The print_datatypes_error_c does not rely on this called_fb_declaration pointer being != NULL to conclude that |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1610 |
* we have a datat type incompatibility error, so setting it to the correct fb_decl is actually safe, |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1611 |
* as the compiler will never reach the compilation stage! |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1612 |
*/ |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1613 |
symbol->called_fb_declaration = fb_decl; |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1614 |
|
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1615 |
/* Let the il_call_operator (CAL, CALC, or CALCN) determine the candidate datatypes of the il_fb_call_c... */ |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1616 |
/* NOTE: We ignore whether the call is 'compatible' or not when filling in the candidate datatypes list. |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1617 |
* Even if it is not compatible, we fill in the candidate datatypes list correctly so that the following |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1618 |
* IL instructions may be handled correctly and debuged. |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1619 |
* Doing this is actually safe, as the parameter_list will still contain errors that will be found by |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1620 |
* print_datatypes_error_c, so the code will never reach stage 4! |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1621 |
*/ |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1622 |
symbol->il_call_operator->accept(*this); |
467
4910eaa1206a
Delete no longer needed copy_candidate_datatype_list() function.
Mario de Sousa <msousa@fe.up.pt>
parents:
465
diff
changeset
|
1623 |
symbol->candidate_datatypes = symbol->il_call_operator->candidate_datatypes; |
450
eb1b28acec2e
Fix a few more bugs related to FB/function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
449
diff
changeset
|
1624 |
|
439
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1625 |
if (debug) std::cout << "FB [] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1626 |
return NULL; |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1627 |
} |
cf7d6862033d
Add semantic verification of FB calls in IL (not yet complete - missing printing of errors!)
Mario de Sousa <msousa@fe.up.pt>
parents:
438
diff
changeset
|
1628 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1629 |
|
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1630 |
/* | function_name '(' eol_list [il_param_list] ')' */ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1631 |
/* NOTE: The parameter 'called_function_declaration' is used to pass data between the stage 3 and stage 4. */ |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1632 |
// SYM_REF2(il_formal_funct_call_c, function_name, il_param_list, symbol_c *called_function_declaration; int extensible_param_count;) |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1633 |
void *fill_candidate_datatypes_c::visit(il_formal_funct_call_c *symbol) { |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1634 |
symbol->il_param_list->accept(*this); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1635 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1636 |
generic_function_call_t fcall_param = { |
441
e8de43eefcc5
Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
440
diff
changeset
|
1637 |
/* fcall_param.function_name = */ symbol->function_name, |
e8de43eefcc5
Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
440
diff
changeset
|
1638 |
/* fcall_param.nonformal_operand_list = */ NULL, |
e8de43eefcc5
Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
440
diff
changeset
|
1639 |
/* fcall_param.formal_operand_list = */ symbol->il_param_list, |
e8de43eefcc5
Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
440
diff
changeset
|
1640 |
/* enum {POU_FB, POU_function} POU_type = */ generic_function_call_t::POU_function, |
e8de43eefcc5
Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
440
diff
changeset
|
1641 |
/* fcall_param.candidate_functions = */ symbol->candidate_functions, |
e8de43eefcc5
Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
440
diff
changeset
|
1642 |
/* fcall_param.called_function_declaration = */ symbol->called_function_declaration, |
e8de43eefcc5
Add printing of semantic errors when calling FB from IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
440
diff
changeset
|
1643 |
/* fcall_param.extensible_param_count = */ symbol->extensible_param_count |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1644 |
}; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1645 |
handle_function_call(symbol, fcall_param); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1646 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1647 |
if (debug) std::cout << "il_formal_funct_call_c [" << symbol->candidate_datatypes.size() << "] result.\n"; |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1648 |
return NULL; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1649 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1650 |
|
452
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1651 |
|
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1652 |
// void *visit(il_operand_list_c *symbol); |
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1653 |
|
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1654 |
|
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1655 |
/* | simple_instr_list il_simple_instruction */ |
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1656 |
/* This object is referenced by il_expression_c objects */ |
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1657 |
void *fill_candidate_datatypes_c::visit(simple_instr_list_c *symbol) { |
453
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1658 |
if (symbol->n <= 0) |
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1659 |
return NULL; /* List is empty! Nothing to do. */ |
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1660 |
|
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1661 |
for(int i = 0; i < symbol->n; i++) |
452
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1662 |
symbol->elements[i]->accept(*this); |
453
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1663 |
|
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1664 |
/* This object has (inherits) the same candidate datatypes as the last il_instruction */ |
467
4910eaa1206a
Delete no longer needed copy_candidate_datatype_list() function.
Mario de Sousa <msousa@fe.up.pt>
parents:
465
diff
changeset
|
1665 |
symbol->candidate_datatypes = symbol->elements[symbol->n-1]->candidate_datatypes; |
452
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1666 |
|
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1667 |
if (debug) std::cout << "simple_instr_list_c [" << symbol->candidate_datatypes.size() << "] result.\n"; |
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1668 |
return NULL; |
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1669 |
} |
79ac274d1cc4
Start of support for IL expressions (parenthesis).
Mario de Sousa <msousa@fe.up.pt>
parents:
451
diff
changeset
|
1670 |
|
457
67d8b07bac22
Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents:
456
diff
changeset
|
1671 |
|
67d8b07bac22
Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents:
456
diff
changeset
|
1672 |
|
67d8b07bac22
Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents:
456
diff
changeset
|
1673 |
|
453
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1674 |
// SYM_REF1(il_simple_instruction_c, il_simple_instruction, symbol_c *prev_il_instruction;) |
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1675 |
void *fill_candidate_datatypes_c::visit(il_simple_instruction_c *symbol) { |
459
01f6664bf8c5
Continue adding support for semantic verification of JMP and RET.
Mario de Sousa <msousa@fe.up.pt>
parents:
457
diff
changeset
|
1676 |
if (symbol->prev_il_instruction.size() > 1) ERROR; /* There should be no labeled insructions inside an IL expression! */ |
457
67d8b07bac22
Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents:
456
diff
changeset
|
1677 |
if (symbol->prev_il_instruction.size() == 0) prev_il_instruction = NULL; |
67d8b07bac22
Change prev_il_instruction to a vector<>
Mario de Sousa <msousa@fe.up.pt>
parents:
456
diff
changeset
|
1678 |
else prev_il_instruction = symbol->prev_il_instruction[0]; |
453
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1679 |
symbol->il_simple_instruction->accept(*this); |
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1680 |
prev_il_instruction = NULL; |
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1681 |
|
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1682 |
/* This object has (inherits) the same candidate datatypes as the il_simple_instruction it points to */ |
467
4910eaa1206a
Delete no longer needed copy_candidate_datatype_list() function.
Mario de Sousa <msousa@fe.up.pt>
parents:
465
diff
changeset
|
1683 |
symbol->candidate_datatypes = symbol->il_simple_instruction->candidate_datatypes; |
453
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1684 |
return NULL; |
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1685 |
} |
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1686 |
|
4733f662362a
More changes for support of semantic verification of il_expressions
Mario de Sousa <msousa@fe.up.pt>
parents:
452
diff
changeset
|
1687 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1688 |
/* |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1689 |
void *visit(il_param_list_c *symbol); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1690 |
void *visit(il_param_assignment_c *symbol); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1691 |
void *visit(il_param_out_assignment_c *symbol); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1692 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1693 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1694 |
/*******************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1695 |
/* B 2.2 Operators */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1696 |
/*******************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1697 |
void *fill_candidate_datatypes_c::visit(LD_operator_c *symbol) { |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1698 |
if (NULL == il_operand) return NULL; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1699 |
for(unsigned int i = 0; i < il_operand->candidate_datatypes.size(); i++) { |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1700 |
add_datatype_to_candidate_list(symbol, il_operand->candidate_datatypes[i]); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1701 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1702 |
if (debug) std::cout << "LD [" << il_operand->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1703 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1704 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1705 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1706 |
void *fill_candidate_datatypes_c::visit(LDN_operator_c *symbol) { |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1707 |
if (NULL == il_operand) return NULL; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1708 |
for(unsigned int i = 0; i < il_operand->candidate_datatypes.size(); i++) { |
666
8ba9ec4bae50
Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents:
661
diff
changeset
|
1709 |
if (get_datatype_info_c::is_ANY_BIT_compatible(il_operand->candidate_datatypes[i])) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1710 |
add_datatype_to_candidate_list(symbol, il_operand->candidate_datatypes[i]); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1711 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1712 |
if (debug) std::cout << "LDN [" << il_operand->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1713 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1714 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1715 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1716 |
void *fill_candidate_datatypes_c::visit(ST_operator_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1717 |
symbol_c *prev_instruction_type, *operand_type; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1718 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1719 |
if (NULL == prev_il_instruction) return NULL; |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1720 |
if (NULL == il_operand) return NULL; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1721 |
for (unsigned int i = 0; i < prev_il_instruction->candidate_datatypes.size(); i++) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1722 |
for(unsigned int j = 0; j < il_operand->candidate_datatypes.size(); j++) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1723 |
prev_instruction_type = prev_il_instruction->candidate_datatypes[i]; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1724 |
operand_type = il_operand->candidate_datatypes[j]; |
676
ca4f17211251
Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
666
diff
changeset
|
1725 |
if (get_datatype_info_c::is_type_equal(prev_instruction_type, operand_type)) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1726 |
add_datatype_to_candidate_list(symbol, prev_instruction_type); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1727 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1728 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1729 |
if (debug) std::cout << "ST [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1730 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1731 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1732 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1733 |
void *fill_candidate_datatypes_c::visit(STN_operator_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1734 |
symbol_c *prev_instruction_type, *operand_type; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1735 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1736 |
if (NULL == prev_il_instruction) return NULL; |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1737 |
if (NULL == il_operand) return NULL; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1738 |
for (unsigned int i = 0; i < prev_il_instruction->candidate_datatypes.size(); i++) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1739 |
for(unsigned int j = 0; j < il_operand->candidate_datatypes.size(); j++) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1740 |
prev_instruction_type = prev_il_instruction->candidate_datatypes[i]; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1741 |
operand_type = il_operand->candidate_datatypes[j]; |
676
ca4f17211251
Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
666
diff
changeset
|
1742 |
if (get_datatype_info_c::is_type_equal(prev_instruction_type,operand_type) && get_datatype_info_c::is_ANY_BIT_compatible(operand_type)) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1743 |
add_datatype_to_candidate_list(symbol, prev_instruction_type); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1744 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1745 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1746 |
if (debug) std::cout << "STN [" << prev_il_instruction->candidate_datatypes.size() << "," << il_operand->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1747 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1748 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1749 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1750 |
void *fill_candidate_datatypes_c::visit(NOT_operator_c *symbol) { |
470
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1751 |
/* NOTE: the standard allows syntax in which the NOT operator is followed by an optional <il_operand> |
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1752 |
* NOT [<il_operand>] |
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1753 |
* However, it does not define the semantic of the NOT operation when the <il_operand> is specified. |
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1754 |
* We therefore consider it an error if an il_operand is specified! |
612 | 1755 |
* We do not need to generate an error message. This error will be caught somewhere else! |
470
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1756 |
*/ |
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1757 |
if (NULL == prev_il_instruction) return NULL; |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1758 |
if (NULL == il_operand) return NULL; |
470
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1759 |
for (unsigned int i = 0; i < prev_il_instruction->candidate_datatypes.size(); i++) { |
666
8ba9ec4bae50
Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents:
661
diff
changeset
|
1760 |
if (get_datatype_info_c::is_ANY_BIT_compatible(prev_il_instruction->candidate_datatypes[i])) |
470
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1761 |
add_datatype_to_candidate_list(symbol, prev_il_instruction->candidate_datatypes[i]); |
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1762 |
} |
d2cd05c5e01a
Semantic verification of NOT operator.
Mario de Sousa <msousa@fe.up.pt>
parents:
467
diff
changeset
|
1763 |
if (debug) std::cout << "NOT_operator [" << prev_il_instruction->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1764 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1765 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1766 |
|
447
aad0f3e5df33
Start of support for semantic verification of FB calls in IL using special IL instructions.
Mario de Sousa <msousa@fe.up.pt>
parents:
445
diff
changeset
|
1767 |
|
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1768 |
void *fill_candidate_datatypes_c::visit( S_operator_c *symbol) {return handle_S_and_R_operator (symbol, "S", symbol->called_fb_declaration);} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1769 |
void *fill_candidate_datatypes_c::visit( R_operator_c *symbol) {return handle_S_and_R_operator (symbol, "R", symbol->called_fb_declaration);} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1770 |
|
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1771 |
void *fill_candidate_datatypes_c::visit( S1_operator_c *symbol) {return handle_implicit_il_fb_call(symbol, "S1", symbol->called_fb_declaration);} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1772 |
void *fill_candidate_datatypes_c::visit( R1_operator_c *symbol) {return handle_implicit_il_fb_call(symbol, "R1", symbol->called_fb_declaration);} |
489
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1773 |
void *fill_candidate_datatypes_c::visit( CLK_operator_c *symbol) {return handle_implicit_il_fb_call(symbol, "CLK", symbol->called_fb_declaration);} |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1774 |
void *fill_candidate_datatypes_c::visit( CU_operator_c *symbol) {return handle_implicit_il_fb_call(symbol, "CU", symbol->called_fb_declaration);} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1775 |
void *fill_candidate_datatypes_c::visit( CD_operator_c *symbol) {return handle_implicit_il_fb_call(symbol, "CD", symbol->called_fb_declaration);} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1776 |
void *fill_candidate_datatypes_c::visit( PV_operator_c *symbol) {return handle_implicit_il_fb_call(symbol, "PV", symbol->called_fb_declaration);} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1777 |
void *fill_candidate_datatypes_c::visit( IN_operator_c *symbol) {return handle_implicit_il_fb_call(symbol, "IN", symbol->called_fb_declaration);} |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1778 |
void *fill_candidate_datatypes_c::visit( PT_operator_c *symbol) {return handle_implicit_il_fb_call(symbol, "PT", symbol->called_fb_declaration);} |
447
aad0f3e5df33
Start of support for semantic verification of FB calls in IL using special IL instructions.
Mario de Sousa <msousa@fe.up.pt>
parents:
445
diff
changeset
|
1779 |
|
483
7f839fb100c1
Cleaning up XORN, ANDN, and ORN operator code.
Mario de Sousa <msousa@fe.up.pt>
parents:
481
diff
changeset
|
1780 |
void *fill_candidate_datatypes_c::visit( AND_operator_c *symbol) {return handle_binary_operator(widen_AND_table, symbol, prev_il_instruction, il_operand);} |
489
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1781 |
void *fill_candidate_datatypes_c::visit( OR_operator_c *symbol) {return handle_binary_operator( widen_OR_table, symbol, prev_il_instruction, il_operand);} |
483
7f839fb100c1
Cleaning up XORN, ANDN, and ORN operator code.
Mario de Sousa <msousa@fe.up.pt>
parents:
481
diff
changeset
|
1782 |
void *fill_candidate_datatypes_c::visit( XOR_operator_c *symbol) {return handle_binary_operator(widen_XOR_table, symbol, prev_il_instruction, il_operand);} |
7f839fb100c1
Cleaning up XORN, ANDN, and ORN operator code.
Mario de Sousa <msousa@fe.up.pt>
parents:
481
diff
changeset
|
1783 |
void *fill_candidate_datatypes_c::visit(ANDN_operator_c *symbol) {return handle_binary_operator(widen_AND_table, symbol, prev_il_instruction, il_operand);} |
7f839fb100c1
Cleaning up XORN, ANDN, and ORN operator code.
Mario de Sousa <msousa@fe.up.pt>
parents:
481
diff
changeset
|
1784 |
void *fill_candidate_datatypes_c::visit( ORN_operator_c *symbol) {return handle_binary_operator( widen_OR_table, symbol, prev_il_instruction, il_operand);} |
7f839fb100c1
Cleaning up XORN, ANDN, and ORN operator code.
Mario de Sousa <msousa@fe.up.pt>
parents:
481
diff
changeset
|
1785 |
void *fill_candidate_datatypes_c::visit(XORN_operator_c *symbol) {return handle_binary_operator(widen_XOR_table, symbol, prev_il_instruction, il_operand);} |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1786 |
|
489
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1787 |
void *fill_candidate_datatypes_c::visit( ADD_operator_c *symbol) {return handle_binary_operator(widen_ADD_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1788 |
void *fill_candidate_datatypes_c::visit( SUB_operator_c *symbol) {return handle_binary_operator(widen_SUB_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1789 |
void *fill_candidate_datatypes_c::visit( MUL_operator_c *symbol) {return handle_binary_operator(widen_MUL_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1790 |
void *fill_candidate_datatypes_c::visit( DIV_operator_c *symbol) {return handle_binary_operator(widen_DIV_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1791 |
void *fill_candidate_datatypes_c::visit( MOD_operator_c *symbol) {return handle_binary_operator(widen_MOD_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1792 |
|
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1793 |
void *fill_candidate_datatypes_c::visit( GT_operator_c *symbol) {return handle_binary_operator(widen_CMP_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1794 |
void *fill_candidate_datatypes_c::visit( GE_operator_c *symbol) {return handle_binary_operator(widen_CMP_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1795 |
void *fill_candidate_datatypes_c::visit( EQ_operator_c *symbol) {return handle_binary_operator(widen_CMP_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1796 |
void *fill_candidate_datatypes_c::visit( LT_operator_c *symbol) {return handle_binary_operator(widen_CMP_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1797 |
void *fill_candidate_datatypes_c::visit( LE_operator_c *symbol) {return handle_binary_operator(widen_CMP_table, symbol, prev_il_instruction, il_operand);} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1798 |
void *fill_candidate_datatypes_c::visit( NE_operator_c *symbol) {return handle_binary_operator(widen_CMP_table, symbol, prev_il_instruction, il_operand);} |
484
f78750994a82
Clean code for comparison operations & operators.
Mario de Sousa <msousa@fe.up.pt>
parents:
483
diff
changeset
|
1799 |
|
f78750994a82
Clean code for comparison operations & operators.
Mario de Sousa <msousa@fe.up.pt>
parents:
483
diff
changeset
|
1800 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1801 |
|
487 | 1802 |
void *fill_candidate_datatypes_c::handle_conditional_il_flow_control_operator(symbol_c *symbol) { |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1803 |
if (NULL == prev_il_instruction) return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1804 |
for (unsigned int i = 0; i < prev_il_instruction->candidate_datatypes.size(); i++) { |
666
8ba9ec4bae50
Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents:
661
diff
changeset
|
1805 |
if (get_datatype_info_c::is_BOOL_compatible(prev_il_instruction->candidate_datatypes[i])) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1806 |
add_datatype_to_candidate_list(symbol, prev_il_instruction->candidate_datatypes[i]); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1807 |
} |
487 | 1808 |
return NULL; |
1809 |
} |
|
1810 |
||
489
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1811 |
void *fill_candidate_datatypes_c::visit( CAL_operator_c *symbol) {if (NULL != prev_il_instruction) symbol->candidate_datatypes = prev_il_instruction->candidate_datatypes; return NULL;} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1812 |
void *fill_candidate_datatypes_c::visit( RET_operator_c *symbol) {if (NULL != prev_il_instruction) symbol->candidate_datatypes = prev_il_instruction->candidate_datatypes; return NULL;} |
2c874cccbb44
Some stupid code cleanups.
Mario de Sousa <msousa@fe.up.pt>
parents:
488
diff
changeset
|
1813 |
void *fill_candidate_datatypes_c::visit( JMP_operator_c *symbol) {if (NULL != prev_il_instruction) symbol->candidate_datatypes = prev_il_instruction->candidate_datatypes; return NULL;} |
487 | 1814 |
void *fill_candidate_datatypes_c::visit( CALC_operator_c *symbol) {return handle_conditional_il_flow_control_operator(symbol);} |
1815 |
void *fill_candidate_datatypes_c::visit(CALCN_operator_c *symbol) {return handle_conditional_il_flow_control_operator(symbol);} |
|
1816 |
void *fill_candidate_datatypes_c::visit( RETC_operator_c *symbol) {return handle_conditional_il_flow_control_operator(symbol);} |
|
1817 |
void *fill_candidate_datatypes_c::visit(RETCN_operator_c *symbol) {return handle_conditional_il_flow_control_operator(symbol);} |
|
1818 |
void *fill_candidate_datatypes_c::visit( JMPC_operator_c *symbol) {return handle_conditional_il_flow_control_operator(symbol);} |
|
1819 |
void *fill_candidate_datatypes_c::visit(JMPCN_operator_c *symbol) {return handle_conditional_il_flow_control_operator(symbol);} |
|
1820 |
||
1821 |
||
1822 |
||
1823 |
||
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1824 |
/* Symbol class handled together with function call checks */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1825 |
// void *visit(il_assign_operator_c *symbol, variable_name); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1826 |
/* Symbol class handled together with function call checks */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1827 |
// void *visit(il_assign_operator_c *symbol, option, variable_name); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1828 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1829 |
/***************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1830 |
/* B.3 - Language ST (Structured Text) */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1831 |
/***************************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1832 |
/***********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1833 |
/* B 3.1 - Expressions */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1834 |
/***********************/ |
873
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1835 |
/* SYM_REF1(ref_expression_c, exp) --> an extension to the IEC 61131-3 standard - based on the IEC 61131-3 v3 standard. Returns address of the varible! */ |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1836 |
void *fill_candidate_datatypes_c::visit( ref_expression_c *symbol) { |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1837 |
symbol->exp->accept(*this); |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1838 |
/* we should really check whether the expression is merely a variable. For now, leave it for the future! */ |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1839 |
/* For now, we handle references (i.e. pointers) as ULINT datatypes! */ |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1840 |
add_datatype_to_candidate_list(symbol, &get_datatype_info_c::ulint_type_name); |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1841 |
return NULL; |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1842 |
} |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
854
diff
changeset
|
1843 |
|
652
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1844 |
void *fill_candidate_datatypes_c::visit( or_expression_c *symbol) {return handle_binary_expression (widen_OR_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1845 |
void *fill_candidate_datatypes_c::visit( xor_expression_c *symbol) {return handle_binary_expression (widen_XOR_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1846 |
void *fill_candidate_datatypes_c::visit( and_expression_c *symbol) {return handle_binary_expression (widen_AND_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1847 |
|
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1848 |
void *fill_candidate_datatypes_c::visit( equ_expression_c *symbol) {return handle_equality_comparison(widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1849 |
void *fill_candidate_datatypes_c::visit(notequ_expression_c *symbol) {return handle_equality_comparison(widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1850 |
void *fill_candidate_datatypes_c::visit( lt_expression_c *symbol) {return handle_binary_expression (widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1851 |
void *fill_candidate_datatypes_c::visit( gt_expression_c *symbol) {return handle_binary_expression (widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1852 |
void *fill_candidate_datatypes_c::visit( le_expression_c *symbol) {return handle_binary_expression (widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1853 |
void *fill_candidate_datatypes_c::visit( ge_expression_c *symbol) {return handle_binary_expression (widen_CMP_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1854 |
|
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1855 |
void *fill_candidate_datatypes_c::visit( add_expression_c *symbol) {return handle_binary_expression (widen_ADD_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1856 |
void *fill_candidate_datatypes_c::visit( sub_expression_c *symbol) {return handle_binary_expression (widen_SUB_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1857 |
void *fill_candidate_datatypes_c::visit( mul_expression_c *symbol) {return handle_binary_expression (widen_MUL_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1858 |
void *fill_candidate_datatypes_c::visit( div_expression_c *symbol) {return handle_binary_expression (widen_DIV_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1859 |
void *fill_candidate_datatypes_c::visit( mod_expression_c *symbol) {return handle_binary_expression (widen_MOD_table, symbol, symbol->l_exp, symbol->r_exp);} |
7fe1533d2260
Start adding support for data type checking of enums.
Mario de Sousa <msousa@fe.up.pt>
parents:
651
diff
changeset
|
1860 |
void *fill_candidate_datatypes_c::visit( power_expression_c *symbol) {return handle_binary_expression (widen_EXPT_table, symbol, symbol->l_exp, symbol->r_exp);} |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1861 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1862 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1863 |
void *fill_candidate_datatypes_c::visit(neg_expression_c *symbol) { |
435
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1864 |
/* NOTE: The standard defines the syntax for this 'negation' operation, but |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1865 |
* does not define the its semantics. |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1866 |
* |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1867 |
* We could be tempted to consider that the semantics of the |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1868 |
* 'negation' operation are similar/identical to the semantics of the |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1869 |
* SUB expression/operation. This would include assuming that the |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1870 |
* possible datatypes for the 'negation' operation is also |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1871 |
* the same as those for the SUB expression/operation, namely ANY_MAGNITUDE. |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1872 |
* |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1873 |
* However, this would then mean that the following ST code would be |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1874 |
* syntactically and semantically correct: |
650 | 1875 |
* VAR uint_var : UINT END_VAR; |
435
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1876 |
* uint_var := - (uint_var); |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1877 |
* |
650 | 1878 |
* Assuming uint_var is not 0, the standard states that the above code should result in a |
1879 |
* runtime error since the operation will result in an overflow. Since the above operation |
|
1880 |
* is only valid when uint_var=0, it would probably make more sense for the programmer to |
|
1881 |
* use if (uint_var=0) ..., so we will simply assume that the above statement simply |
|
1882 |
* does not make sense in any situation (whether or not uint_var is 0), and therefore |
|
1883 |
* we will not allow it. |
|
1884 |
* (Notice that doing so does not ago against the standard, as the standard does not |
|
1885 |
* explicitly define the semantics of the NEG operator, nor the data types it may accept |
|
1886 |
* as input. We are simply assuming that the NEG operator may not be applied to unsigned |
|
1887 |
* ANY_NUM data types!). |
|
435
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1888 |
* |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1889 |
* It is much easier for the compiler to detect this at compile time, |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1890 |
* and it is probably safer to the resulting code too. |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1891 |
* |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1892 |
* To detect these tyes of errors at compile time, the easisest solution |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1893 |
* is to only allow ANY_NUM datatytpes that are signed. |
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1894 |
* So, that is what we do here! |
650 | 1895 |
* |
1896 |
* NOTE: The above argument also applies to the neg_integer_c method! |
|
435
82cb6a64a763
Change negation expression (neg_expression_c) to only allow signed data types.
Mario de Sousa <msousa@fe.up.pt>
parents:
431
diff
changeset
|
1897 |
*/ |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1898 |
symbol->exp->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1899 |
for (unsigned int i = 0; i < symbol->exp->candidate_datatypes.size(); i++) { |
666
8ba9ec4bae50
Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents:
661
diff
changeset
|
1900 |
if (get_datatype_info_c::is_ANY_signed_MAGNITUDE_compatible(symbol->exp->candidate_datatypes[i])) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1901 |
add_datatype_to_candidate_list(symbol, symbol->exp->candidate_datatypes[i]); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1902 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1903 |
if (debug) std::cout << "neg [" << symbol->exp->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1904 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1905 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1906 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1907 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1908 |
void *fill_candidate_datatypes_c::visit(not_expression_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1909 |
symbol->exp->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1910 |
for (unsigned int i = 0; i < symbol->exp->candidate_datatypes.size(); i++) { |
666
8ba9ec4bae50
Add new get_datatype_info_c (preparing to remove search_expression_type_c)
Mario de Sousa <msousa@fe.up.pt>
parents:
661
diff
changeset
|
1911 |
if (get_datatype_info_c::is_ANY_BIT_compatible(symbol->exp->candidate_datatypes[i])) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1912 |
add_datatype_to_candidate_list(symbol, symbol->exp->candidate_datatypes[i]); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1913 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1914 |
if (debug) std::cout << "not [" << symbol->exp->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1915 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1916 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1917 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1918 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1919 |
void *fill_candidate_datatypes_c::visit(function_invocation_c *symbol) { |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1920 |
if (NULL != symbol->formal_param_list) symbol-> formal_param_list->accept(*this); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1921 |
else if (NULL != symbol->nonformal_param_list) symbol->nonformal_param_list->accept(*this); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1922 |
else ERROR; |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1923 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1924 |
generic_function_call_t fcall_param = { |
763
2779f4a5f305
Fix struct generic_function_call_t initialize style.
Manuele Conti <conti.ma@alice.it>
parents:
738
diff
changeset
|
1925 |
function_name: symbol->function_name, |
2779f4a5f305
Fix struct generic_function_call_t initialize style.
Manuele Conti <conti.ma@alice.it>
parents:
738
diff
changeset
|
1926 |
nonformal_operand_list: symbol->nonformal_param_list, |
2779f4a5f305
Fix struct generic_function_call_t initialize style.
Manuele Conti <conti.ma@alice.it>
parents:
738
diff
changeset
|
1927 |
formal_operand_list: symbol->formal_param_list, |
2779f4a5f305
Fix struct generic_function_call_t initialize style.
Manuele Conti <conti.ma@alice.it>
parents:
738
diff
changeset
|
1928 |
POU_type: generic_function_call_t::POU_function, |
2779f4a5f305
Fix struct generic_function_call_t initialize style.
Manuele Conti <conti.ma@alice.it>
parents:
738
diff
changeset
|
1929 |
candidate_functions: symbol->candidate_functions, |
2779f4a5f305
Fix struct generic_function_call_t initialize style.
Manuele Conti <conti.ma@alice.it>
parents:
738
diff
changeset
|
1930 |
called_function_declaration: symbol->called_function_declaration, |
2779f4a5f305
Fix struct generic_function_call_t initialize style.
Manuele Conti <conti.ma@alice.it>
parents:
738
diff
changeset
|
1931 |
extensible_param_count: symbol->extensible_param_count |
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1932 |
}; |
763
2779f4a5f305
Fix struct generic_function_call_t initialize style.
Manuele Conti <conti.ma@alice.it>
parents:
738
diff
changeset
|
1933 |
|
438
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1934 |
handle_function_call(symbol, fcall_param); |
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1935 |
|
744b125d911e
Add support for semantic verification of function calls in IL.
Mario de Sousa <msousa@fe.up.pt>
parents:
437
diff
changeset
|
1936 |
if (debug) std::cout << "function_invocation_c [" << symbol->candidate_datatypes.size() << "] result.\n"; |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1937 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1938 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1939 |
|
421
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
1940 |
|
840cb1e1e177
Add support in stage 3 for checking function invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
420
diff
changeset
|
1941 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1942 |
/********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1943 |
/* B 3.2 Statements */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1944 |
/********************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1945 |
// SYM_LIST(statement_list_c) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1946 |
/* The visitor of the base class search_visitor_c will handle calling each instruction in the list. |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1947 |
* We do not need to do anything here... |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1948 |
*/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1949 |
// void *fill_candidate_datatypes_c::visit(statement_list_c *symbol) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1950 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1951 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1952 |
/*********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1953 |
/* B 3.2.1 Assignment Statements */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1954 |
/*********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1955 |
void *fill_candidate_datatypes_c::visit(assignment_statement_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1956 |
symbol_c *left_type, *right_type; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1957 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1958 |
symbol->l_exp->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1959 |
symbol->r_exp->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1960 |
for (unsigned int i = 0; i < symbol->l_exp->candidate_datatypes.size(); i++) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1961 |
for(unsigned int j = 0; j < symbol->r_exp->candidate_datatypes.size(); j++) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1962 |
left_type = symbol->l_exp->candidate_datatypes[i]; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1963 |
right_type = symbol->r_exp->candidate_datatypes[j]; |
676
ca4f17211251
Move is_datatype_valid/equal() to get_datatype_info_c
Mario de Sousa <msousa@fe.up.pt>
parents:
666
diff
changeset
|
1964 |
if (get_datatype_info_c::is_type_equal(left_type, right_type)) |
465
b52ec62773db
Do not allow duplicate values in candidate datatype list.
Mario de Sousa <msousa@fe.up.pt>
parents:
464
diff
changeset
|
1965 |
add_datatype_to_candidate_list(symbol, left_type); |
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1966 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1967 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1968 |
if (debug) std::cout << ":= [" << symbol->l_exp->candidate_datatypes.size() << "," << symbol->r_exp->candidate_datatypes.size() << "] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1969 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1970 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1971 |
|
418
2ac41d2cba91
Add fill candidate method for fb_invocation_c symbol.
Manuele Conti <conti.ma@alice.it>
parents:
417
diff
changeset
|
1972 |
/*****************************************/ |
2ac41d2cba91
Add fill candidate method for fb_invocation_c symbol.
Manuele Conti <conti.ma@alice.it>
parents:
417
diff
changeset
|
1973 |
/* B 3.2.2 Subprogram Control Statements */ |
2ac41d2cba91
Add fill candidate method for fb_invocation_c symbol.
Manuele Conti <conti.ma@alice.it>
parents:
417
diff
changeset
|
1974 |
/*****************************************/ |
2ac41d2cba91
Add fill candidate method for fb_invocation_c symbol.
Manuele Conti <conti.ma@alice.it>
parents:
417
diff
changeset
|
1975 |
void *fill_candidate_datatypes_c::visit(fb_invocation_c *symbol) { |
834
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1976 |
symbol_c *fb_decl = search_varfb_instance_type->get_basetype_decl(symbol->fb_name); |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1977 |
if (! get_datatype_info_c::is_function_block(fb_decl )) fb_decl = NULL; |
783ef40344dd
Add support for FB call semantics of 'S' and 'R' IL operators!
mjsousa
parents:
827
diff
changeset
|
1978 |
if (NULL == fb_decl) ERROR; /* Although a call to a non-declared FB is a semantic error, this is currently caught by stage 2! */ |
455
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1979 |
|
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1980 |
if (symbol-> formal_param_list != NULL) symbol->formal_param_list->accept(*this); |
933c0dccc82f
Add support for semantic verification of CALC, CALCN, etc..
Mario de Sousa <msousa@fe.up.pt>
parents:
454
diff
changeset
|
1981 |
if (symbol->nonformal_param_list != NULL) symbol->nonformal_param_list->accept(*this); |
424
43d73e28eca8
Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents:
422
diff
changeset
|
1982 |
|
431
5792016eedd8
More detailed error messages for FB invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
429
diff
changeset
|
1983 |
/* The print_datatypes_error_c does not rely on this called_fb_declaration pointer being != NULL to conclude that |
5792016eedd8
More detailed error messages for FB invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
429
diff
changeset
|
1984 |
* we have a datat type incompatibility error, so setting it to the correct fb_decl is actually safe, |
5792016eedd8
More detailed error messages for FB invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
429
diff
changeset
|
1985 |
* as the compiler will never reach the compilation stage! |
5792016eedd8
More detailed error messages for FB invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
429
diff
changeset
|
1986 |
*/ |
5792016eedd8
More detailed error messages for FB invocations in ST.
Mario de Sousa <msousa@fe.up.pt>
parents:
429
diff
changeset
|
1987 |
symbol->called_fb_declaration = fb_decl; |
424
43d73e28eca8
Continue checking data type compatibility inside expressions used to pass paramters to invalid function/FB calls
Mario de Sousa <msousa@fe.up.pt>
parents:
422
diff
changeset
|
1988 |
|
418
2ac41d2cba91
Add fill candidate method for fb_invocation_c symbol.
Manuele Conti <conti.ma@alice.it>
parents:
417
diff
changeset
|
1989 |
if (debug) std::cout << "FB [] ==> " << symbol->candidate_datatypes.size() << " result.\n"; |
2ac41d2cba91
Add fill candidate method for fb_invocation_c symbol.
Manuele Conti <conti.ma@alice.it>
parents:
417
diff
changeset
|
1990 |
return NULL; |
2ac41d2cba91
Add fill candidate method for fb_invocation_c symbol.
Manuele Conti <conti.ma@alice.it>
parents:
417
diff
changeset
|
1991 |
} |
2ac41d2cba91
Add fill candidate method for fb_invocation_c symbol.
Manuele Conti <conti.ma@alice.it>
parents:
417
diff
changeset
|
1992 |
|
417
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1993 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1994 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1995 |
/********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1996 |
/* B 3.2.3 Selection Statements */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1997 |
/********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1998 |
void *fill_candidate_datatypes_c::visit(if_statement_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
1999 |
symbol->expression->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2000 |
if (NULL != symbol->statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2001 |
symbol->statement_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2002 |
if (NULL != symbol->elseif_statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2003 |
symbol->elseif_statement_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2004 |
if (NULL != symbol->else_statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2005 |
symbol->else_statement_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2006 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2007 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2008 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2009 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2010 |
void *fill_candidate_datatypes_c::visit(elseif_statement_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2011 |
symbol->expression->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2012 |
if (NULL != symbol->statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2013 |
symbol->statement_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2014 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2015 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2016 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2017 |
/* CASE expression OF case_element_list ELSE statement_list END_CASE */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2018 |
// SYM_REF3(case_statement_c, expression, case_element_list, statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2019 |
void *fill_candidate_datatypes_c::visit(case_statement_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2020 |
symbol->expression->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2021 |
if (NULL != symbol->case_element_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2022 |
symbol->case_element_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2023 |
if (NULL != symbol->statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2024 |
symbol->statement_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2025 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2026 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2027 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2028 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2029 |
/* helper symbol for case_statement */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2030 |
// SYM_LIST(case_element_list_c) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2031 |
/* NOTE: visitor method for case_element_list_c is not required since we inherit from iterator_visitor_c */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2032 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2033 |
/* case_list ':' statement_list */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2034 |
// SYM_REF2(case_element_c, case_list, statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2035 |
/* NOTE: visitor method for case_element_c is not required since we inherit from iterator_visitor_c */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2036 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2037 |
// SYM_LIST(case_list_c) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2038 |
/* NOTE: visitor method for case_list_c is not required since we inherit from iterator_visitor_c */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2039 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2040 |
/********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2041 |
/* B 3.2.4 Iteration Statements */ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2042 |
/********************************/ |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2043 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2044 |
void *fill_candidate_datatypes_c::visit(for_statement_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2045 |
symbol->control_variable->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2046 |
symbol->beg_expression->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2047 |
symbol->end_expression->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2048 |
if (NULL != symbol->by_expression) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2049 |
symbol->by_expression->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2050 |
if (NULL != symbol->statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2051 |
symbol->statement_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2052 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2053 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2054 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2055 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2056 |
void *fill_candidate_datatypes_c::visit(while_statement_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2057 |
symbol->expression->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2058 |
if (NULL != symbol->statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2059 |
symbol->statement_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2060 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2061 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2062 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2063 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2064 |
void *fill_candidate_datatypes_c::visit(repeat_statement_c *symbol) { |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2065 |
symbol->expression->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2066 |
if (NULL != symbol->statement_list) |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2067 |
symbol->statement_list->accept(*this); |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2068 |
return NULL; |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2069 |
} |
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2070 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2071 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2072 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2073 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2074 |
|
d48f53715f77
Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents:
diff
changeset
|
2075 |