author | mjsousa |
Sat, 05 Jul 2014 13:57:39 +0100 | |
changeset 901 | 6a3964be6a29 |
parent 896 | c1cf7259160d |
child 902 | 38dca2e264b6 |
permissions | -rw-r--r-- |
70 | 1 |
/* |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2 |
* matiec - a compiler for the programming languages defined in IEC 61131-3 |
70 | 3 |
* |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
4 |
* Copyright (C) 2003-2011 Mario de Sousa (msousa@fe.up.pt) |
279
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
272
diff
changeset
|
5 |
* Copyright (C) 2007-2011 Laurent Bessard and Edouard Tisserant |
70 | 6 |
* |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
7 |
* This program is free software: you can redistribute it and/or modify |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
8 |
* it under the terms of the GNU General Public License as published by |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
9 |
* the Free Software Foundation, either version 3 of the License, or |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
10 |
* (at your option) any later version. |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
11 |
* |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
12 |
* This program is distributed in the hope that it will be useful, |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
13 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
15 |
* GNU General Public License for more details. |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
16 |
* |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
18 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
19 |
* |
70 | 20 |
* |
21 |
* This code is made available on the understanding that it will not be |
|
22 |
* used in safety-critical situations without a full and competent review. |
|
23 |
*/ |
|
24 |
||
25 |
#include <string> |
|
26 |
#include <iostream> |
|
27 |
#include <sstream> |
|
28 |
#include <typeinfo> |
|
111 | 29 |
#include <list> |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
30 |
#include <map> |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
31 |
#include <sstream> |
139
668a54686827
added missing includes on some platform (gentoo/gcc-4.3.1)
etisserant
parents:
138
diff
changeset
|
32 |
#include <strings.h> |
70 | 33 |
|
592
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
34 |
|
70 | 35 |
#include "../../util/symtable.hh" |
36 |
#include "../../util/dsymtable.hh" |
|
37 |
#include "../../absyntax/visitor.hh" |
|
181
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
178
diff
changeset
|
38 |
#include "../../absyntax_utils/absyntax_utils.hh" |
596
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
594
diff
changeset
|
39 |
#include "../../main.hh" // required for ERROR() and ERROR_MSG() macros. |
70 | 40 |
|
41 |
#include "../stage4.hh" |
|
42 |
||
43 |
//#define DEBUG |
|
44 |
#ifdef DEBUG |
|
45 |
#define TRACE(classname) printf("\n____%s____\n",classname); |
|
46 |
#else |
|
47 |
#define TRACE(classname) |
|
48 |
#endif |
|
49 |
||
50 |
||
522
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
51 |
|
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
52 |
#define STAGE4_ERROR(symbol1, symbol2, ...) {stage4err("while generating C code", symbol1, symbol2, __VA_ARGS__); exit(EXIT_FAILURE);} |
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
53 |
|
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
54 |
|
592
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
55 |
/* Macros to access the constant value of each expression (if it exists) from the annotation introduced to the symbol_c object by constant_folding_c in stage3! */ |
612 | 56 |
#define VALID_CVALUE(dtype, symbol) (symbol_c::cs_const_value == (symbol)->const_value._##dtype.status) |
57 |
#define GET_CVALUE(dtype, symbol) ((symbol)->const_value._##dtype.value) |
|
592
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
58 |
|
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
59 |
|
522
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
60 |
|
70 | 61 |
/***********************************************************************/ |
62 |
||
63 |
/* Unlike Programs and Configurations which get mapped onto C++ classes, |
|
64 |
* Function Blocks are mapped onto a C structure containing the variables, and |
|
65 |
* a C function containing the code in the FB's body. This is to allow direct allocation |
|
66 |
* of a FB variable (which is really an instance of the C data structure) to |
|
67 |
* a member of a union variable (note that classes with constructors cannot |
|
68 |
* be mebers of a union), which is done in IL when loading a FB onto IL's |
|
69 |
* default variable. |
|
70 |
* |
|
71 |
* So as not to clash the names of the C data structure and the C function, |
|
72 |
* the C structure is given a name identical to that of the FB name, whereas |
|
73 |
* the name of the function is the FB name with a constant string appended. |
|
74 |
* The value of that constant string which is appended is defined in the following |
|
75 |
* constant. |
|
76 |
* In order not to clash with any variable in the IL and ST source codem the |
|
77 |
* following constant should contain a double underscore, which is not allowed |
|
78 |
* in IL and ST. |
|
79 |
* |
|
80 |
* e.g.: FUNTION_BLOCK TEST |
|
81 |
* is mapped onto a TEST data structure, and a TEST_body__ function. |
|
82 |
*/ |
|
83 |
||
84 |
#define FB_FUNCTION_SUFFIX "_body__" |
|
85 |
||
86 |
/* Idem as body, but for initializer FB function */ |
|
87 |
#define FB_INIT_SUFFIX "_init__" |
|
88 |
||
89 |
/* Idem as body, but for run CONFIG and RESOURCE function */ |
|
90 |
#define FB_RUN_SUFFIX "_run__" |
|
91 |
||
92 |
/* The FB body function is passed as the only parameter a pointer to the FB data |
|
93 |
* structure instance. The name of this parameter is given by the following constant. |
|
94 |
* In order not to clash with any variable in the IL and ST source codem the |
|
95 |
* following constant should contain a double underscore, which is not allowed |
|
96 |
* in IL and ST. |
|
97 |
* |
|
98 |
* e.g.: the body of FUNTION_BLOCK TEST |
|
99 |
* is mapped onto the C function |
|
100 |
* TEST_body__(TEST *data__) |
|
101 |
*/ |
|
102 |
||
103 |
#define FB_FUNCTION_PARAM "data__" |
|
104 |
||
105 |
||
106 |
#define SFC_STEP_ACTION_PREFIX "__SFC_" |
|
107 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
108 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
109 |
/* Variable declaration symbol for accessor macros */ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
110 |
#define DECLARE_VAR "__DECLARE_VAR" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
111 |
#define DECLARE_GLOBAL "__DECLARE_GLOBAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
112 |
#define DECLARE_GLOBAL_FB "__DECLARE_GLOBAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
113 |
#define DECLARE_GLOBAL_LOCATION "__DECLARE_GLOBAL_LOCATION" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
114 |
#define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
115 |
#define DECLARE_EXTERNAL "__DECLARE_EXTERNAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
116 |
#define DECLARE_EXTERNAL_FB "__DECLARE_EXTERNAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
117 |
#define DECLARE_LOCATED "__DECLARE_LOCATED" |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
118 |
#define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
119 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
120 |
/* Variable declaration symbol for accessor macros */ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
121 |
#define INIT_VAR "__INIT_VAR" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
122 |
#define INIT_GLOBAL "__INIT_GLOBAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
123 |
#define INIT_GLOBAL_FB "__INIT_GLOBAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
124 |
#define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
125 |
#define INIT_EXTERNAL "__INIT_EXTERNAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
126 |
#define INIT_EXTERNAL_FB "__INIT_EXTERNAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
127 |
#define INIT_LOCATED "__INIT_LOCATED" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
128 |
#define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
129 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
130 |
/* Variable getter symbol for accessor macros */ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
131 |
#define GET_VAR "__GET_VAR" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
132 |
#define GET_EXTERNAL "__GET_EXTERNAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
133 |
#define GET_EXTERNAL_FB "__GET_EXTERNAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
134 |
#define GET_LOCATED "__GET_LOCATED" |
873
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
135 |
|
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
136 |
#define GET_VAR_REF "__GET_VAR_REF" |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
137 |
#define GET_EXTERNAL_REF "__GET_EXTERNAL_REF" |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
138 |
#define GET_EXTERNAL_FB_REF "__GET_EXTERNAL_FB_REF" |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
139 |
#define GET_LOCATED_REF "__GET_LOCATED_REF" |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
140 |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
141 |
#define GET_VAR_BY_REF "__GET_VAR_BY_REF" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
142 |
#define GET_EXTERNAL_BY_REF "__GET_EXTERNAL_BY_REF" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
143 |
#define GET_EXTERNAL_FB_BY_REF "__GET_EXTERNAL_FB_BY_REF" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
144 |
#define GET_LOCATED_BY_REF "__GET_LOCATED_BY_REF" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
145 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
146 |
/* Variable setter symbol for accessor macros */ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
147 |
#define SET_VAR "__SET_VAR" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
148 |
#define SET_EXTERNAL "__SET_EXTERNAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
149 |
#define SET_EXTERNAL_FB "__SET_EXTERNAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
150 |
#define SET_LOCATED "__SET_LOCATED" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
151 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
152 |
/* Variable initial value symbol for accessor macros */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
153 |
#define INITIAL_VALUE "__INITIAL_VALUE" |
70 | 154 |
|
155 |
/* Generate a name for a temporary variable. |
|
156 |
* Each new name generated is appended a different number, |
|
157 |
* starting off from 0. |
|
158 |
* After calling reset(), the names will start off again from 0. |
|
159 |
*/ |
|
160 |
#define VAR_LEADER "__" |
|
161 |
#define TEMP_VAR VAR_LEADER "TMP_" |
|
162 |
#define SOURCE_VAR VAR_LEADER "SRC_" |
|
163 |
||
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
164 |
/* please see the comment before the RET_operator_c visitor for details... */ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
165 |
#define END_LABEL VAR_LEADER "end" |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
166 |
|
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
167 |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
168 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
169 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
170 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
171 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
172 |
|
878 | 173 |
/* Parse command line options passed from main.c !! */ |
174 |
#include <stdlib.h> // for getsybopt() |
|
175 |
||
176 |
static int generate_line_directives__ = 0; |
|
177 |
||
178 |
int stage4_parse_options(char *options) { |
|
179 |
enum { LINE_OPT = 0 /*, SOME_OTHER_OPT, YET_ANOTHER_OPT */}; |
|
180 |
char *const token[] = { /*[LINE_OPT]=*/(char *)"l" /*, SOME_OTHER_OPT, ... */, NULL }; |
|
181 |
/* unfortunately, the above commented out syntax for array initialization is valid in C, but not in C++ */ |
|
182 |
||
183 |
char *subopts = options; |
|
184 |
char *value; |
|
185 |
int opt; |
|
186 |
||
187 |
while (*subopts != '\0') { |
|
188 |
switch (getsubopt(&subopts, token, &value)) { |
|
189 |
case LINE_OPT: generate_line_directives__ = 1; break; |
|
190 |
default : fprintf(stderr, "Unrecognized option: -O %s\n", value); return -1; break; |
|
191 |
} |
|
192 |
} |
|
193 |
return 0; |
|
194 |
} |
|
195 |
||
196 |
||
197 |
void stage4_print_options(void) { |
|
198 |
printf(" (options must be separated by commas. Example: 'l,w,x')\n"); |
|
199 |
printf(" l : insert '#line' directives in generated C code.\n"); |
|
200 |
} |
|
201 |
||
202 |
||
203 |
/***********************************************************************/ |
|
204 |
/***********************************************************************/ |
|
205 |
/***********************************************************************/ |
|
206 |
/***********************************************************************/ |
|
207 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
208 |
#include "generate_c_base.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
209 |
#include "generate_c_typedecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
210 |
#include "generate_c_sfcdecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
211 |
#include "generate_c_vardecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
212 |
#include "generate_c_configbody.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
213 |
#include "generate_location_list.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
214 |
#include "generate_var_list.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
215 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
216 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
217 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
218 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
219 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
220 |
|
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
221 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
222 |
#include "generate_c.hh" |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
223 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
224 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
225 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
226 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
227 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
228 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
229 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
230 |
/* A helper class that prints out the identifiers for function calls to overloaded functions */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
231 |
/* Given a function declaration of the function being called, it |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
232 |
* will simply print out the returned data type, |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
233 |
* followed by the data types of all input, output, and in_out parameters. |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
234 |
* for e.g.; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
235 |
* SIN( REAL) : REAL -> prints out -> REAL__REAL |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
236 |
* LEN( STRING) : INT -> prints out -> INT__STRING |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
237 |
* MUL(TIME, INT) : TIME -> prints out -> TIME__TIME__INT |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
238 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
239 |
class print_function_parameter_data_types_c: public generate_c_base_c { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
240 |
private: |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
241 |
symbol_c *current_type; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
242 |
bool_type_name_c tmp_bool; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
243 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
244 |
void print_list(symbol_c *var_list, symbol_c *data_type) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
245 |
if (data_type != NULL) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
246 |
/* print out the data type once for every variable! */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
247 |
list_c *list = dynamic_cast<list_c *>(var_list); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
248 |
if (list == NULL) ERROR; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
249 |
for (int i=0; i < list->n; i++) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
250 |
s4o.print("__"); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
251 |
data_type->accept(*this); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
252 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
253 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
254 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
255 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
256 |
public: |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
257 |
print_function_parameter_data_types_c(stage4out_c *s4o_ptr): |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
258 |
generate_c_base_c(s4o_ptr) |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
259 |
{current_type = NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
260 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
261 |
/**************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
262 |
/* B.1.5 - Program organization units */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
263 |
/**************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
264 |
/***********************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
265 |
/* B 1.5.1 - Functions */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
266 |
/***********************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
267 |
/* FUNCTION derived_function_name ':' elementary_type_name io_OR_function_var_declarations_list function_body END_FUNCTION */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
268 |
/* | FUNCTION derived_function_name ':' derived_type_name io_OR_function_var_declarations_list function_body END_FUNCTION */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
269 |
void *visit(function_declaration_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
270 |
symbol->type_name->accept(*this); /* return type */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
271 |
symbol->var_declarations_list->accept(*this); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
272 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
273 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
274 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
275 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
276 |
//void *visit(var_declarations_list_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
277 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
278 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
279 |
//void *visit(input_declarations_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
280 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
281 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
282 |
//void *visit(input_declaration_list_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
283 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
284 |
void *visit(edge_declaration_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
285 |
current_type = &tmp_bool; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
286 |
symbol->var1_list->accept(*this); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
287 |
current_type = NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
288 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
289 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
290 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
291 |
/* We do NOT print out EN and ENO parameters! */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
292 |
void *visit(en_param_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
293 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
294 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
295 |
//void *visit(output_declarations_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
296 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
297 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
298 |
//void *visit(var_init_decl_list_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
299 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
300 |
void *visit(simple_spec_init_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
301 |
/* return the data type */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
302 |
return symbol->simple_specification; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
303 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
304 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
305 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
306 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
307 |
/* NOTE: although this class may also sometimes point to a previously_declared_subrange_type_name |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
308 |
* we don't need this for now, so it is easier to just skip it allocation |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
309 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
310 |
void *visit(subrange_spec_init_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
311 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
312 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
313 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
314 |
/* NOTE: although this class may also sometimes point to a previously_declared_enumerated_type_name |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
315 |
* we don't need this for now, so it is easier to just skip it allocation |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
316 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
317 |
void *visit(enumerated_spec_init_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
318 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
319 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
320 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
321 |
/* NOTE: although this class may also sometimes point to a previously_declared_array_type_name |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
322 |
* we don't need this for now, so it is easier to just skip it allocation |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
323 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
324 |
void *visit(array_var_init_decl_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
325 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
326 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
327 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
328 |
/* NOTE: although this class may also sometimes point to a previously_declared_structured_type_name |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
329 |
* we don't need this for now, so it is easier to just skip it allocation |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
330 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
331 |
void *visit(structured_var_init_decl_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
332 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
333 |
/* We do NOT print out EN and ENO parameters! */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
334 |
void *visit(eno_param_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
335 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
336 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
337 |
//void *visit(input_output_declarations_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
338 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
339 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
340 |
//void *visit(var_declaration_list_c *symbol) {iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
341 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
342 |
void *visit(fb_name_decl_c *symbol) { |
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:
793
diff
changeset
|
343 |
print_list(symbol->fb_name_list, spec_init_sperator_c::get_spec(symbol->fb_spec_init)); |
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
344 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
345 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
346 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
347 |
void *visit(var1_init_decl_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
348 |
print_list(symbol->var1_list, (symbol_c *)symbol->spec_init->accept(*this)); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
349 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
350 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
351 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
352 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
353 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
354 |
void *visit(array_var_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
355 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
356 |
void *visit(structured_var_declaration_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
357 |
current_type = symbol->structure_type_name; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
358 |
symbol->var1_list->accept(*this); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
359 |
current_type = NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
360 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
361 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
362 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
363 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
364 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
365 |
/* Note that this class is used for fixed length strings... |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
366 |
* STRING [ 42 ] |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
367 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
368 |
void *visit(single_byte_string_var_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
369 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
370 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
371 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
372 |
/* Note that this class is used for fixed length strings... |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
373 |
* WSTRING [ 42 ] |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
374 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
375 |
void *visit(double_byte_string_var_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
376 |
}; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
377 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
378 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
379 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
380 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
381 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
382 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
383 |
|
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
384 |
/* A helper class that analyses if the datatype of a variable is 'complex'. */ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
385 |
/* 'complex' means that it is either a strcuture or an array! */ |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
386 |
class analyse_variable_c: public search_visitor_c { |
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
387 |
private: |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
388 |
static analyse_variable_c *singleton_; |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
389 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
390 |
public: |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
391 |
analyse_variable_c(void) {}; |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
392 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
393 |
static bool is_complex_type(symbol_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
394 |
if (NULL == symbol) ERROR; |
872
3d682f87c870
Remove assertion being failed by IL labels (IL labels do not yet have specific datatypes).
mjsousa
parents:
864
diff
changeset
|
395 |
if (!get_datatype_info_c::is_type_valid (symbol->datatype)) return false; |
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
396 |
return ( get_datatype_info_c::is_structure(symbol->datatype) |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
397 |
|| get_datatype_info_c::is_array (symbol->datatype) |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
398 |
); |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
399 |
} |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
400 |
|
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
401 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
402 |
private: |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
403 |
symbol_c *last_fb, *first_non_fb_identifier; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
404 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
405 |
public: |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
406 |
/* returns the first element (from left to right) in a structured variable that is not a FB, i.e. is either a structure or an array! */ |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
407 |
/* eg: |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
408 |
* fb1.fb2.fb3.real returns ?????? |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
409 |
* fb1.fb2.struct1.real returns struct1 |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
410 |
* struct1.real returns struct1 |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
411 |
*/ |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
412 |
static symbol_c *find_first_nonfb(symbol_c *symbol) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
413 |
if (NULL == singleton_) singleton_ = new analyse_variable_c(); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
414 |
if (NULL == singleton_) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
415 |
if (NULL == symbol) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
416 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
417 |
singleton_->last_fb = NULL; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
418 |
singleton_->first_non_fb_identifier = NULL; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
419 |
return (symbol_c *)symbol->accept(*singleton_); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
420 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
421 |
|
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
422 |
/* returns true if a strcutured variable (e.g. fb1.fb2.strcut1.real) contains a structure or array */ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
423 |
/* eg: |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
424 |
* fb1.fb2.fb3.real returns FALSE |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
425 |
* fb1.fb2.struct1.real returns TRUE |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
426 |
* struct1.real returns TRUE |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
427 |
*/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
428 |
static bool contains_complex_type(symbol_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
429 |
if (NULL == symbol) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
430 |
if (!get_datatype_info_c::is_type_valid(symbol->datatype)) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
431 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
432 |
symbol_c *first_non_fb = (symbol_c *)find_first_nonfb(symbol); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
433 |
return is_complex_type(first_non_fb->datatype); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
434 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
435 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
436 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
437 |
/* returns the datatype of the variable returned by find_first_nonfb() */ |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
438 |
/* eg: |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
439 |
* fb1.fb2.fb3.real returns ?????? |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
440 |
* fb1.fb2.struct1.real returns datatype of struct1 |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
441 |
* struct1.real returns datatype of struct1 |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
442 |
*/ |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
443 |
static search_var_instance_decl_c::vt_t first_nonfb_vardecltype(symbol_c *symbol, symbol_c *scope) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
444 |
if (NULL == symbol) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
445 |
if (!get_datatype_info_c::is_type_valid(symbol->datatype)) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
446 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
447 |
symbol_c *first_non_fb = (symbol_c *)find_first_nonfb(symbol); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
448 |
if (NULL != singleton_->last_fb) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
449 |
scope = singleton_->last_fb->datatype; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
450 |
symbol = singleton_->first_non_fb_identifier; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
451 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
452 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
453 |
search_var_instance_decl_c search_var_instance_decl(scope); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
454 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
455 |
return search_var_instance_decl.get_vartype(symbol); |
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
456 |
} |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
457 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
458 |
|
853
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
459 |
/*********************/ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
460 |
/* B 1.4 - Variables */ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
461 |
/*********************/ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
462 |
void *visit(symbolic_variable_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
463 |
if (!get_datatype_info_c::is_type_valid (symbol->datatype)) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
464 |
if (!get_datatype_info_c::is_function_block(symbol->datatype)) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
465 |
first_non_fb_identifier = symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
466 |
return (void *)symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
467 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
468 |
last_fb = symbol; |
853
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
469 |
return NULL; |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
470 |
} |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
471 |
|
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
472 |
/*************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
473 |
/* B.1.4.2 Multi-element Variables */ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
474 |
/*************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
475 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
476 |
// SYM_REF2(structured_variable_c, record_variable, field_selector) |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
477 |
void *visit(structured_variable_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
478 |
symbol_c *res = (symbol_c *)symbol->record_variable->accept(*this); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
479 |
if (NULL != res) return res; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
480 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
481 |
if (!get_datatype_info_c::is_type_valid (symbol->datatype)) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
482 |
if (!get_datatype_info_c::is_function_block(symbol->datatype)) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
483 |
first_non_fb_identifier = symbol->field_selector; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
484 |
return (void *)symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
485 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
486 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
487 |
last_fb = symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
488 |
return NULL; |
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
489 |
} |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
490 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
491 |
/* subscripted_variable '[' subscript_list ']' */ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
492 |
//SYM_REF2(array_variable_c, subscripted_variable, subscript_list) |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
493 |
void *visit(array_variable_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
494 |
void *res = symbol->subscripted_variable->accept(*this); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
495 |
if (NULL != res) return res; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
496 |
return (void *)symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
497 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
498 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
499 |
|
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
500 |
}; |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
501 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
502 |
analyse_variable_c *analyse_variable_c::singleton_ = NULL; |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
503 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
504 |
/***********************************************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
505 |
/***********************************************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
506 |
/***********************************************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
507 |
/***********************************************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
508 |
|
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
509 |
|
70 | 510 |
#include "generate_c_st.cc" |
511 |
#include "generate_c_il.cc" |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
512 |
#include "generate_c_inlinefcall.cc" |
70 | 513 |
|
514 |
/***********************************************************************/ |
|
515 |
/***********************************************************************/ |
|
516 |
/***********************************************************************/ |
|
517 |
/***********************************************************************/ |
|
518 |
||
519 |
#define MILLISECOND 1000000 |
|
520 |
#define SECOND 1000 * MILLISECOND |
|
521 |
||
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
522 |
unsigned long long calculate_time(symbol_c *symbol) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
523 |
if (NULL == symbol) return 0; |
70 | 524 |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
525 |
interval_c *interval = dynamic_cast<interval_c *>(symbol); |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
526 |
duration_c *duration = dynamic_cast<duration_c *>(symbol); |
70 | 527 |
|
632
76c3d707ffa1
Adding error message when task interval value is not supported
Laurent Bessard
parents:
631
diff
changeset
|
528 |
if ((NULL == interval) && (NULL == duration)) |
631
1a4f5ce62962
Adding error message when task interval value is not supported
Laurent Bessard
parents:
625
diff
changeset
|
529 |
{STAGE4_ERROR(symbol, symbol, "This type of interval value is not currently supported"); ERROR;} |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
530 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
531 |
if (NULL != duration) { |
70 | 532 |
/* SYM_REF2(duration_c, neg, interval) */ |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
533 |
if (duration->neg != NULL) |
631
1a4f5ce62962
Adding error message when task interval value is not supported
Laurent Bessard
parents:
625
diff
changeset
|
534 |
{STAGE4_ERROR(duration, duration, "Negative TIME literals for interval are not currently supported"); ERROR;} |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
535 |
return calculate_time(duration->interval); |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
536 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
537 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
538 |
if (NULL != interval) { |
547
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
522
diff
changeset
|
539 |
/* SYM_REF5(interval_c, days, hours, minutes, seconds, milliseconds) */ |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
540 |
unsigned long long int time_ull = 0; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
541 |
long double time_ld = 0; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
542 |
/* |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
543 |
const unsigned long long int MILLISECOND = 1000000; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
544 |
const unsigned long long int SECOND = 1000 * MILLISECOND |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
545 |
*/ |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
546 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
547 |
if (NULL != interval->milliseconds) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
548 |
if (VALID_CVALUE( int64, interval->milliseconds) && GET_CVALUE( int64, interval->milliseconds) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
549 |
if (VALID_CVALUE( int64, interval->milliseconds)) time_ull += GET_CVALUE( int64, interval->milliseconds) * MILLISECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
550 |
else if (VALID_CVALUE(uint64, interval->milliseconds)) time_ull += GET_CVALUE(uint64, interval->milliseconds) * MILLISECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
551 |
else if (VALID_CVALUE(real64, interval->milliseconds)) time_ld += GET_CVALUE(real64, interval->milliseconds) * MILLISECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
552 |
else ERROR; // if (NULL != interval->milliseconds) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
553 |
} |
547
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
522
diff
changeset
|
554 |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
555 |
if (NULL != interval->seconds ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
556 |
if (VALID_CVALUE( int64, interval->seconds ) && GET_CVALUE( int64, interval->seconds ) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
557 |
if (VALID_CVALUE( int64, interval->seconds )) time_ull += GET_CVALUE( int64, interval->seconds ) * SECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
558 |
else if (VALID_CVALUE(uint64, interval->seconds )) time_ull += GET_CVALUE(uint64, interval->seconds ) * SECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
559 |
else if (VALID_CVALUE(real64, interval->seconds )) time_ld += GET_CVALUE(real64, interval->seconds ) * SECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
560 |
else ERROR; // if (NULL != interval->seconds) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
561 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
562 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
563 |
if (NULL != interval->minutes ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
564 |
if (VALID_CVALUE( int64, interval->minutes ) && GET_CVALUE( int64, interval->minutes ) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
565 |
if (VALID_CVALUE( int64, interval->minutes )) time_ull += GET_CVALUE( int64, interval->minutes ) * SECOND * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
566 |
else if (VALID_CVALUE(uint64, interval->minutes )) time_ull += GET_CVALUE(uint64, interval->minutes ) * SECOND * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
567 |
else if (VALID_CVALUE(real64, interval->minutes )) time_ld += GET_CVALUE(real64, interval->minutes ) * SECOND * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
568 |
else ERROR; // if (NULL != interval->minutes) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
569 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
570 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
571 |
if (NULL != interval->hours ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
572 |
if (VALID_CVALUE( int64, interval->hours ) && GET_CVALUE( int64, interval->hours ) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
573 |
if (VALID_CVALUE( int64, interval->hours )) time_ull += GET_CVALUE( int64, interval->hours ) * SECOND * 60 * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
574 |
else if (VALID_CVALUE(uint64, interval->hours )) time_ull += GET_CVALUE(uint64, interval->hours ) * SECOND * 60 * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
575 |
else if (VALID_CVALUE(real64, interval->hours )) time_ld += GET_CVALUE(real64, interval->hours ) * SECOND * 60 * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
576 |
else ERROR; // if (NULL != interval->hours) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
577 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
578 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
579 |
if (NULL != interval->days ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
580 |
if (VALID_CVALUE( int64, interval->days ) && GET_CVALUE( int64, interval->days ) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
581 |
if (VALID_CVALUE( int64, interval->days )) time_ull += GET_CVALUE( int64, interval->days ) * SECOND * 60 * 60 * 24; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
582 |
else if (VALID_CVALUE(uint64, interval->days )) time_ull += GET_CVALUE(uint64, interval->days ) * SECOND * 60 * 60 * 24; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
583 |
else if (VALID_CVALUE(real64, interval->days )) time_ld += GET_CVALUE(real64, interval->days ) * SECOND * 60 * 60 * 24; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
584 |
else ERROR; // if (NULL != interval->days) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
585 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
586 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
587 |
time_ull += time_ld; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
588 |
return time_ull; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
589 |
}; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
590 |
ERROR; // should never reach this point! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
591 |
return 0; // humour the compiler! |
661
f537c3315f83
Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents:
624
diff
changeset
|
592 |
} |
70 | 593 |
|
594 |
/***********************************************************************/ |
|
595 |
/***********************************************************************/ |
|
596 |
/***********************************************************************/ |
|
597 |
/***********************************************************************/ |
|
598 |
||
599 |
class calculate_common_ticktime_c: public iterator_visitor_c { |
|
600 |
private: |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
601 |
unsigned long long common_ticktime; |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
602 |
unsigned long long least_common_ticktime; |
70 | 603 |
|
604 |
public: |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
605 |
calculate_common_ticktime_c(void){ |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
606 |
common_ticktime = 0; |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
607 |
least_common_ticktime = 0; |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
608 |
} |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
609 |
|
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
610 |
unsigned long long euclide(unsigned long long a, unsigned long long b) { |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
611 |
unsigned long long c = a % b; |
70 | 612 |
if (c == 0) |
613 |
return b; |
|
614 |
else |
|
615 |
return euclide(b, c); |
|
616 |
} |
|
617 |
||
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
618 |
void update_ticktime(unsigned long long time) { |
70 | 619 |
if (common_ticktime == 0) |
620 |
common_ticktime = time; |
|
621 |
else if (time > common_ticktime) |
|
622 |
common_ticktime = euclide(time, common_ticktime); |
|
623 |
else |
|
624 |
common_ticktime = euclide(common_ticktime, time); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
625 |
if (least_common_ticktime == 0) |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
626 |
least_common_ticktime = time; |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
627 |
else |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
628 |
least_common_ticktime = (least_common_ticktime * time) / common_ticktime; |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
629 |
} |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
630 |
|
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
631 |
unsigned long long get_common_ticktime(void) { |
70 | 632 |
return common_ticktime; |
633 |
} |
|
634 |
||
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
635 |
unsigned long get_greatest_tick_count(void) { |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
636 |
unsigned long long least_common_tick = least_common_ticktime / common_ticktime; |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
637 |
if (least_common_tick >> 32) |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
638 |
ERROR; |
237 | 639 |
return (unsigned long)(~(((unsigned long)-1) % (unsigned long)least_common_tick) + 1); |
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
640 |
} |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
641 |
|
70 | 642 |
/* TASK task_name task_initialization */ |
643 |
//SYM_REF2(task_configuration_c, task_name, task_initialization) |
|
644 |
void *visit(task_initialization_c *symbol) { |
|
816
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
645 |
if (symbol->interval_data_source != NULL) { |
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
646 |
unsigned long long time = calculate_time(symbol->interval_data_source); |
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
647 |
if (time < 0) ERROR; |
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
648 |
else update_ticktime(time); |
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
649 |
} |
70 | 650 |
return NULL; |
651 |
} |
|
652 |
}; |
|
653 |
||
654 |
/***********************************************************************/ |
|
655 |
/***********************************************************************/ |
|
656 |
/***********************************************************************/ |
|
657 |
/***********************************************************************/ |
|
658 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
659 |
/* A helper class that knows how to generate code for the SFC, IL and ST languages... */ |
70 | 660 |
class generate_c_SFC_IL_ST_c: public null_visitor_c { |
661 |
private: |
|
662 |
stage4out_c *s4o_ptr; |
|
663 |
symbol_c *scope; |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
664 |
symbol_c *fbname; |
70 | 665 |
const char *variable_prefix; |
666 |
||
667 |
public: |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
668 |
generate_c_SFC_IL_ST_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL); |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
669 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
670 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
671 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
672 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
673 |
void *visit(enable_code_generation_pragma_c * symbol) {s4o_ptr->enable_output(); return NULL;} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
674 |
void *visit(disable_code_generation_pragma_c * symbol) {s4o_ptr->disable_output(); return NULL;} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
675 |
|
70 | 676 |
/*********************************************/ |
677 |
/* B.1.6 Sequential function chart elements */ |
|
678 |
/*********************************************/ |
|
679 |
/*| sequential_function_chart sfc_network*/ |
|
680 |
void *visit(sequential_function_chart_c * symbol); |
|
681 |
||
682 |
/****************************************/ |
|
683 |
/* B.2 - Language IL (Instruction List) */ |
|
684 |
/****************************************/ |
|
685 |
||
686 |
/***********************************/ |
|
687 |
/* B 2.1 Instructions and Operands */ |
|
688 |
/***********************************/ |
|
689 |
/*| instruction_list il_instruction */ |
|
690 |
void *visit(instruction_list_c *symbol); |
|
691 |
||
692 |
/* Remainder implemented in generate_c_il_c... */ |
|
693 |
||
694 |
/***************************************/ |
|
695 |
/* B.3 - Language ST (Structured Text) */ |
|
696 |
/***************************************/ |
|
697 |
/***********************/ |
|
698 |
/* B 3.1 - Expressions */ |
|
699 |
/***********************/ |
|
700 |
/* Implemented in generate_c_st_c */ |
|
701 |
||
702 |
/********************/ |
|
703 |
/* B 3.2 Statements */ |
|
704 |
/********************/ |
|
705 |
void *visit(statement_list_c *symbol); |
|
706 |
||
707 |
/* Remainder implemented in generate_c_st_c... */ |
|
708 |
}; |
|
709 |
||
710 |
#include "generate_c_sfc.cc" |
|
711 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
712 |
generate_c_SFC_IL_ST_c::generate_c_SFC_IL_ST_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix) { |
70 | 713 |
if (NULL == scope) ERROR; |
714 |
this->s4o_ptr = s4o_ptr; |
|
715 |
this->scope = scope; |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
716 |
this->fbname = name; |
70 | 717 |
this->variable_prefix = variable_prefix; |
718 |
} |
|
719 |
||
720 |
void *generate_c_SFC_IL_ST_c::visit(sequential_function_chart_c * symbol) { |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
721 |
generate_c_sfc_c generate_c_sfc(s4o_ptr, fbname, scope, variable_prefix); |
70 | 722 |
generate_c_sfc.generate(symbol); |
723 |
return NULL; |
|
724 |
} |
|
725 |
||
726 |
void *generate_c_SFC_IL_ST_c::visit(instruction_list_c *symbol) { |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
727 |
generate_c_il_c generate_c_il(s4o_ptr, fbname, scope, variable_prefix); |
70 | 728 |
generate_c_il.generate(symbol); |
729 |
return NULL; |
|
730 |
} |
|
731 |
||
732 |
void *generate_c_SFC_IL_ST_c::visit(statement_list_c *symbol) { |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
733 |
generate_c_st_c generate_c_st(s4o_ptr, fbname, scope, variable_prefix); |
70 | 734 |
generate_c_st.generate(symbol); |
735 |
return NULL; |
|
736 |
} |
|
737 |
||
738 |
||
739 |
||
740 |
||
741 |
/***********************************************************************/ |
|
742 |
/***********************************************************************/ |
|
743 |
/***********************************************************************/ |
|
744 |
/***********************************************************************/ |
|
745 |
/***********************************************************************/ |
|
746 |
||
747 |
||
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
748 |
class generate_c_datatypes_c: public generate_c_typedecl_c { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
749 |
public: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
750 |
typedef enum { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
751 |
none_im, |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
752 |
arrayname_im, |
661
f537c3315f83
Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents:
624
diff
changeset
|
753 |
arraydeclaration_im |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
754 |
} inlinearray_mode_t; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
755 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
756 |
private: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
757 |
std::map<std::string, int> inline_array_defined; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
758 |
std::string current_array_name; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
759 |
inlinearray_mode_t current_mode; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
760 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
761 |
public: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
762 |
generate_c_datatypes_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr) |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
763 |
: generate_c_typedecl_c(s4o_incl_ptr) { |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
764 |
current_mode = none_im; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
765 |
}; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
766 |
virtual ~generate_c_datatypes_c(void) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
767 |
while (!inline_array_defined.empty()) { |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
768 |
inline_array_defined.erase(inline_array_defined.begin()); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
769 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
770 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
771 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
772 |
/*************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
773 |
/* B.1 - Common elements */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
774 |
/*************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
775 |
/*******************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
776 |
/* B 1.1 - Letters, digits and identifiers */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
777 |
/*******************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
778 |
void *visit(identifier_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
779 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
780 |
case arrayname_im: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
781 |
current_array_name += symbol->value; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
782 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
783 |
case arraydeclaration_im: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
784 |
s4o_incl.print(symbol->value); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
785 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
786 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
787 |
return generate_c_base_c::visit(symbol); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
788 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
789 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
790 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
791 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
792 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
793 |
/**********************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
794 |
/* B.1.3 - Data types */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
795 |
/**********************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
796 |
/***********************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
797 |
/* B 1.3.1 - Elementary Data Types */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
798 |
/***********************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
799 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
800 |
#define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
801 |
void *visit(datatype_symbol *symbol) {\ |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
802 |
switch (current_mode) {\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
803 |
case arrayname_im:\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
804 |
current_array_name += datatype_name;\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
805 |
break;\ |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
806 |
case arraydeclaration_im:\ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
807 |
s4o_incl.print(datatype_name);\ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
808 |
break;\ |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
809 |
default:\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
810 |
return generate_c_base_c::visit(symbol);\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
811 |
break;\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
812 |
}\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
813 |
return NULL;\ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
814 |
} |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
815 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
816 |
HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
817 |
HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
818 |
HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
819 |
HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
820 |
HANDLE_ELEMENTARY_DATA_TYPE(dint_type_name_c, "DINT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
821 |
HANDLE_ELEMENTARY_DATA_TYPE(lint_type_name_c, "LINT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
822 |
HANDLE_ELEMENTARY_DATA_TYPE(usint_type_name_c, "USINT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
823 |
HANDLE_ELEMENTARY_DATA_TYPE(uint_type_name_c, "UINT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
824 |
HANDLE_ELEMENTARY_DATA_TYPE(udint_type_name_c, "UDINT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
825 |
HANDLE_ELEMENTARY_DATA_TYPE(ulint_type_name_c, "ULINT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
826 |
HANDLE_ELEMENTARY_DATA_TYPE(real_type_name_c, "REAL") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
827 |
HANDLE_ELEMENTARY_DATA_TYPE(lreal_type_name_c, "LREAL") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
828 |
HANDLE_ELEMENTARY_DATA_TYPE(date_type_name_c, "DATE") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
829 |
HANDLE_ELEMENTARY_DATA_TYPE(tod_type_name_c, "TOD") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
830 |
HANDLE_ELEMENTARY_DATA_TYPE(dt_type_name_c, "DT") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
831 |
HANDLE_ELEMENTARY_DATA_TYPE(byte_type_name_c, "BYTE") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
832 |
HANDLE_ELEMENTARY_DATA_TYPE(word_type_name_c, "WORD") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
833 |
HANDLE_ELEMENTARY_DATA_TYPE(dword_type_name_c, "DWORD") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
834 |
HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
835 |
HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
836 |
HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING") |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
837 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
838 |
HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME") |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
839 |
HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
840 |
HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
841 |
HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
842 |
HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
843 |
HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
844 |
HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
845 |
HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
846 |
HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
847 |
HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
848 |
HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
849 |
HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
850 |
HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
851 |
HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
852 |
HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
853 |
HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
854 |
HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
855 |
HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
856 |
HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
857 |
HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING") |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
858 |
HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING") |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
859 |
|
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
860 |
/***********************************/ |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
861 |
/* B 1.3.2 - Generic Data Types */ |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
862 |
/***********************************/ |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
863 |
|
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
864 |
/* structure_type_name ':' structure_specification */ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
865 |
//SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification) |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
866 |
void *visit(structure_type_declaration_c *symbol) { |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
867 |
current_mode = arraydeclaration_im; |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
868 |
symbol->structure_specification->accept(*this); |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
869 |
current_mode = arrayname_im; |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
870 |
generate_c_typedecl_c::visit(symbol); |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
871 |
current_mode = none_im; |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
872 |
return NULL; |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
873 |
} |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
874 |
|
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
875 |
/* helper symbol for structure_declaration */ |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
876 |
/* structure_declaration: STRUCT structure_element_declaration_list END_STRUCT */ |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
877 |
/* structure_element_declaration_list structure_element_declaration ';' */ |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
878 |
//SYM_LIST(structure_element_declaration_list_c) |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
879 |
void *visit(structure_element_declaration_list_c *symbol) { |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
880 |
switch (current_mode) { |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
881 |
case arraydeclaration_im: |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
882 |
iterator_visitor_c::visit(symbol); |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
883 |
break; |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
884 |
default: |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
885 |
generate_c_typedecl_c::visit(symbol); |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
886 |
break; |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
887 |
} |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
888 |
return NULL; |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
889 |
} |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
890 |
|
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
891 |
/* structure_element_name ':' spec_init */ |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
892 |
//SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init) |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
893 |
void *visit(structure_element_declaration_c *symbol) { |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
894 |
switch (current_mode) { |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
895 |
case arraydeclaration_im: |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
896 |
{ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
897 |
array_spec_init_c *spec_init = dynamic_cast<array_spec_init_c*>(symbol->spec_init); |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
898 |
if (spec_init != NULL) { |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
899 |
symbol->spec_init->accept(*this); |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
900 |
} |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
901 |
} |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
902 |
break; |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
903 |
default: |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
904 |
generate_c_typedecl_c::visit(symbol); |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
905 |
break; |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
906 |
} |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
907 |
return NULL; |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
908 |
} |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
909 |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
910 |
/******************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
911 |
/* B 1.4.3 - Declaration & Initialization */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
912 |
/******************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
913 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
914 |
void *visit(input_declarations_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
915 |
symbol->input_declaration_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
916 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
917 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
918 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
919 |
void *visit(edge_declaration_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
920 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
921 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
922 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
923 |
void *visit(en_param_declaration_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
924 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
925 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
926 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
927 |
void *visit(eno_param_declaration_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
928 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
929 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
930 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
931 |
void *visit(var1_init_decl_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
932 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
933 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
934 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
935 |
/* var1_list ':' array_spec_init */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
936 |
// SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
937 |
void *visit(array_var_init_decl_c *symbol) { |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
938 |
current_mode = arraydeclaration_im; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
939 |
symbol->array_spec_init->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
940 |
current_mode = none_im; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
941 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
942 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
943 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
944 |
/* array_specification [ASSIGN array_initialization] */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
945 |
/* array_initialization may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
946 |
void *visit(array_spec_init_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
947 |
switch (current_mode) { |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
948 |
case arraydeclaration_im: |
856
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
949 |
{ |
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
950 |
array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
951 |
if (specification != NULL) |
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
952 |
symbol->array_specification->accept(*this); |
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
953 |
} |
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
954 |
break; |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
955 |
case arrayname_im: |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
956 |
{ |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
957 |
array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
958 |
if (specification != NULL) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
959 |
symbol->array_specification->accept(*this); |
856
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
960 |
identifier_c *name = dynamic_cast<identifier_c*>(symbol->array_specification); |
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
961 |
if (name != NULL) |
d80971552535
Fix bug - correctly declare struct members whose type is a directly defined array (e.g.: STRUCT x: ARRAY of XXX; END_STRUCT)
mjsousa
parents:
854
diff
changeset
|
962 |
s4o_incl.print(name->value); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
963 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
964 |
break; |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
965 |
default: |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
966 |
return generate_c_typedecl_c::visit(symbol); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
967 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
968 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
969 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
970 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
971 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
972 |
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
973 |
void *visit(array_specification_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
974 |
switch (current_mode) { |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
975 |
case arraydeclaration_im: |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
976 |
{ |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
977 |
current_mode = arrayname_im; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
978 |
std::map<std::string,int>::iterator definition; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
979 |
current_array_name = "__"; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
980 |
symbol->non_generic_type_name->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
981 |
symbol->array_subrange_list->accept(*this); |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
982 |
current_mode = arraydeclaration_im; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
983 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
984 |
definition = inline_array_defined.find(current_array_name); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
985 |
if (definition == inline_array_defined.end()) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
986 |
s4o_incl.print("__DECLARE_ARRAY_TYPE("); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
987 |
s4o_incl.print(current_array_name); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
988 |
s4o_incl.print(","); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
989 |
symbol->non_generic_type_name->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
990 |
s4o_incl.print(","); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
991 |
symbol->array_subrange_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
992 |
s4o_incl.print(")\n\n"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
993 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
994 |
inline_array_defined[current_array_name] = 0; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
995 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
996 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
997 |
break; |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
998 |
case arrayname_im: |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
999 |
{ |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1000 |
std::map<std::string,int>::iterator definition; |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1001 |
current_array_name = "__"; |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1002 |
symbol->non_generic_type_name->accept(*this); |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1003 |
symbol->array_subrange_list->accept(*this); |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1004 |
s4o_incl.print(current_array_name); |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
1005 |
} |
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
1006 |
break; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1007 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1008 |
return generate_c_typedecl_c::visit(symbol); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1009 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1010 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1011 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1012 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1013 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1014 |
/* signed_integer DOTDOT signed_integer */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1015 |
//SYM_REF2(subrange_c, lower_limit, upper_limit) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1016 |
void *visit(subrange_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1017 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1018 |
case arrayname_im: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1019 |
current_array_name += "_"; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1020 |
{ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1021 |
std::stringstream ss; |
592
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
1022 |
ss << symbol->dimension; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1023 |
current_array_name += ss.str(); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1024 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1025 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1026 |
case arraydeclaration_im: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1027 |
s4o_incl.print("["); |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
1028 |
s4o_incl.print(symbol->dimension); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1029 |
s4o_incl.print("]"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1030 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1031 |
generate_c_typedecl_c::visit(symbol); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1032 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1033 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1034 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1035 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1036 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1037 |
/* var1_list ':' initialized_structure */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1038 |
// SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1039 |
void *visit(structured_var_init_decl_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1040 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1041 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1042 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1043 |
/* fb_name_list ':' function_block_type_name ASSIGN structure_initialization */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1044 |
/* structure_initialization -> may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1045 |
void *visit(fb_name_decl_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1046 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1047 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1048 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1049 |
/* VAR_OUTPUT [RETAIN | NON_RETAIN] var_init_decl_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1050 |
/* option -> may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1051 |
void *visit(output_declarations_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1052 |
symbol->var_init_decl_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1053 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1054 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1055 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1056 |
/* VAR_IN_OUT var_declaration_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1057 |
void *visit(input_output_declarations_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1058 |
symbol->var_declaration_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1059 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1060 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1061 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1062 |
/* var1_list ':' array_specification */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1063 |
//SYM_REF2(array_var_declaration_c, var1_list, array_specification) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1064 |
void *visit(array_var_declaration_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1065 |
array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification); |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1066 |
if (specification != NULL) { |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
1067 |
current_mode = arraydeclaration_im; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1068 |
symbol->array_specification->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1069 |
current_mode = none_im; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1070 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1071 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1072 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1073 |
|
624
c2546c6e0cfa
Moving function to correct location (formating only).
Mario de Sousa <msousa@fe.up.pt>
parents:
623
diff
changeset
|
1074 |
/* var1_list ':' structure_type_name */ |
c2546c6e0cfa
Moving function to correct location (formating only).
Mario de Sousa <msousa@fe.up.pt>
parents:
623
diff
changeset
|
1075 |
//SYM_REF2(structured_var_declaration_c, var1_list, structure_type_name) |
c2546c6e0cfa
Moving function to correct location (formating only).
Mario de Sousa <msousa@fe.up.pt>
parents:
623
diff
changeset
|
1076 |
void *visit(structured_var_declaration_c *symbol) { |
c2546c6e0cfa
Moving function to correct location (formating only).
Mario de Sousa <msousa@fe.up.pt>
parents:
623
diff
changeset
|
1077 |
return NULL; |
c2546c6e0cfa
Moving function to correct location (formating only).
Mario de Sousa <msousa@fe.up.pt>
parents:
623
diff
changeset
|
1078 |
} |
c2546c6e0cfa
Moving function to correct location (formating only).
Mario de Sousa <msousa@fe.up.pt>
parents:
623
diff
changeset
|
1079 |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1080 |
/* VAR [CONSTANT] var_init_decl_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1081 |
/* option -> may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1082 |
/* helper symbol for input_declarations */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1083 |
void *visit(var_declarations_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1084 |
symbol->var_init_decl_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1085 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1086 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1087 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1088 |
/* VAR RETAIN var_init_decl_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1089 |
void *visit(retentive_var_declarations_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1090 |
symbol->var_init_decl_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1091 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1092 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1093 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1094 |
/* VAR [CONSTANT|RETAIN|NON_RETAIN] located_var_decl_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1095 |
/* option -> may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1096 |
//SYM_REF2(located_var_declarations_c, option, located_var_decl_list) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1097 |
void *visit(located_var_declarations_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1098 |
symbol->located_var_decl_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1099 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1100 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1101 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1102 |
/* [variable_name] location ':' located_var_spec_init */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1103 |
/* variable_name -> may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1104 |
//SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1105 |
void *visit(located_var_decl_c *symbol) { |
381
2fd934b91ffd
Fix bug in code generation of directly declared array variables that generate wrong code when using located variables in a program POU
laurent
parents:
377
diff
changeset
|
1106 |
array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init); |
2fd934b91ffd
Fix bug in code generation of directly declared array variables that generate wrong code when using located variables in a program POU
laurent
parents:
377
diff
changeset
|
1107 |
if (array_spec_init != NULL) { |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1108 |
current_mode = arraydeclaration_im; |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1109 |
symbol->located_var_spec_init->accept(*this); |
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
1110 |
current_mode = none_im; |
381
2fd934b91ffd
Fix bug in code generation of directly declared array variables that generate wrong code when using located variables in a program POU
laurent
parents:
377
diff
changeset
|
1111 |
} |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1112 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1113 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1114 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1115 |
/*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1116 |
/* option -> may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1117 |
//SYM_REF2(external_var_declarations_c, option, external_declaration_list) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1118 |
void *visit(external_var_declarations_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1119 |
symbol->external_declaration_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1120 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1121 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1122 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1123 |
/* global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1124 |
//SYM_REF2(external_declaration_c, global_var_name, specification) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1125 |
void *visit(external_declaration_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1126 |
array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1127 |
if (array_specification != NULL) { |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
1128 |
current_mode = arraydeclaration_im; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1129 |
symbol->specification->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1130 |
current_mode = none_im; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1131 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1132 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1133 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1134 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1135 |
/*| VAR_GLOBAL [CONSTANT|RETAIN] global_var_decl_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1136 |
/* option -> may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1137 |
// SYM_REF2(global_var_declarations_c, option, global_var_decl_list) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1138 |
void *visit(global_var_declarations_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1139 |
symbol->global_var_decl_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1140 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1141 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1142 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1143 |
/*| global_var_spec ':' [located_var_spec_init|function_block_type_name] */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1144 |
/* type_specification ->may be NULL ! */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1145 |
// SYM_REF2(global_var_decl_c, global_var_spec, type_specification) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1146 |
void *visit(global_var_decl_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1147 |
array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1148 |
if (array_spec_init != NULL) { |
635
a20a70021d37
Adding support for direct array declaration in structure element declaration
Laurent Bessard
parents:
632
diff
changeset
|
1149 |
current_mode = arraydeclaration_im; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1150 |
symbol->type_specification->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1151 |
current_mode = none_im; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1152 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1153 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1154 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1155 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1156 |
void *visit(function_var_decls_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1157 |
symbol->decl_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1158 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1159 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1160 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1161 |
/*****************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1162 |
/* B 1.5.2 - Function Blocks */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1163 |
/*****************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1164 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1165 |
/* VAR_TEMP temp_var_decl_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1166 |
void *visit(temp_var_decls_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1167 |
symbol->var_decl_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1168 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1169 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1170 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1171 |
/* VAR NON_RETAIN var_init_decl_list END_VAR */ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1172 |
void *visit(non_retentive_var_decls_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1173 |
symbol->var_decl_list->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1174 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1175 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1176 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1177 |
}; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1178 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1179 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1180 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1181 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1182 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1183 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1184 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1185 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1186 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1187 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1188 |
|
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1189 |
class generate_c_pous_c: public generate_c_base_c { |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1190 |
private: |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1191 |
stage4out_c &s4o_incl; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1192 |
|
70 | 1193 |
public: |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1194 |
generate_c_pous_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr) |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1195 |
: generate_c_base_c(s4o_ptr), s4o_incl(*s4o_incl_ptr) { |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1196 |
}; |
70 | 1197 |
virtual ~generate_c_pous_c(void) {} |
1198 |
||
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1199 |
private: |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1200 |
void print_end_of_block_label(void) { |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1201 |
/* Print and __end label for return statements! |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1202 |
* If label is not used by at least one goto, compiler will generate a warning. |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1203 |
* To work around this we introduce the useless goto. |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1204 |
*/ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1205 |
s4o.print("\n"); |
634
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
632
diff
changeset
|
1206 |
/* to humour the compiler, we insert a goto */ |
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1207 |
s4o.print(s4o.indent_spaces); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1208 |
s4o.print("goto "); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1209 |
s4o.print(END_LABEL); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1210 |
s4o.print(";\n"); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1211 |
s4o.indent_left(); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1212 |
|
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1213 |
/* write the label marking the end of the code block */ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1214 |
/* please see the comment before the RET_operator_c visitor for details... */ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1215 |
/* also needed for return_statement_c */ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1216 |
s4o.print("\n"); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1217 |
s4o.print(s4o.indent_spaces); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1218 |
s4o.print(END_LABEL); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1219 |
s4o.print(":\n"); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1220 |
s4o.indent_right(); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1221 |
} |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1222 |
|
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1223 |
|
70 | 1224 |
|
1225 |
public: |
|
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1226 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1227 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1228 |
/********************/ |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1229 |
void *visit(enable_code_generation_pragma_c * symbol) {s4o.enable_output(); return NULL;} |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1230 |
void *visit(disable_code_generation_pragma_c * symbol) {s4o.disable_output(); return NULL;} |
70 | 1231 |
|
1232 |
/*************************/ |
|
1233 |
/* B.1 - Common elements */ |
|
1234 |
/*************************/ |
|
1235 |
/*******************************************/ |
|
1236 |
/* B 1.1 - Letters, digits and identifiers */ |
|
1237 |
/*******************************************/ |
|
1238 |
/* done in base class(es) */ |
|
1239 |
||
1240 |
/*********************/ |
|
1241 |
/* B 1.2 - Constants */ |
|
1242 |
/*********************/ |
|
1243 |
/* originally empty... */ |
|
1244 |
||
1245 |
/******************************/ |
|
1246 |
/* B 1.2.1 - Numeric Literals */ |
|
1247 |
/******************************/ |
|
1248 |
/* done in base class(es) */ |
|
1249 |
||
1250 |
/*******************************/ |
|
1251 |
/* B.1.2.2 Character Strings */ |
|
1252 |
/*******************************/ |
|
1253 |
/* done in base class(es) */ |
|
1254 |
||
1255 |
/***************************/ |
|
1256 |
/* B 1.2.3 - Time Literals */ |
|
1257 |
/***************************/ |
|
1258 |
/************************/ |
|
1259 |
/* B 1.2.3.1 - Duration */ |
|
1260 |
/************************/ |
|
1261 |
/* done in base class(es) */ |
|
1262 |
||
1263 |
/************************************/ |
|
1264 |
/* B 1.2.3.2 - Time of day and Date */ |
|
1265 |
/************************************/ |
|
1266 |
/* done in base class(es) */ |
|
1267 |
||
1268 |
/**********************/ |
|
1269 |
/* B.1.3 - Data types */ |
|
1270 |
/**********************/ |
|
1271 |
/***********************************/ |
|
1272 |
/* B 1.3.1 - Elementary Data Types */ |
|
1273 |
/***********************************/ |
|
1274 |
/* done in base class(es) */ |
|
1275 |
||
1276 |
/********************************/ |
|
1277 |
/* B.1.3.2 - Generic data types */ |
|
1278 |
/********************************/ |
|
1279 |
/* originally empty... */ |
|
1280 |
||
1281 |
/********************************/ |
|
1282 |
/* B 1.3.3 - Derived data types */ |
|
1283 |
/********************************/ |
|
1284 |
/* done in base class(es) */ |
|
1285 |
||
1286 |
/*********************/ |
|
1287 |
/* B 1.4 - Variables */ |
|
1288 |
/*********************/ |
|
1289 |
/* done in base class(es) */ |
|
1290 |
||
1291 |
/********************************************/ |
|
1292 |
/* B.1.4.1 Directly Represented Variables */ |
|
1293 |
/********************************************/ |
|
1294 |
/* done in base class(es) */ |
|
1295 |
||
1296 |
/*************************************/ |
|
1297 |
/* B.1.4.2 Multi-element Variables */ |
|
1298 |
/*************************************/ |
|
1299 |
/* done in base class(es) */ |
|
1300 |
||
1301 |
/******************************************/ |
|
1302 |
/* B 1.4.3 - Declaration & Initialisation */ |
|
1303 |
/******************************************/ |
|
1304 |
/* done in base class(es) */ |
|
1305 |
||
1306 |
/**************************************/ |
|
1307 |
/* B.1.5 - Program organization units */ |
|
1308 |
/**************************************/ |
|
1309 |
/***********************/ |
|
1310 |
/* B 1.5.1 - Functions */ |
|
1311 |
/***********************/ |
|
1312 |
||
1313 |
public: |
|
1314 |
/* FUNCTION derived_function_name ':' elementary_type_name io_OR_function_var_declarations_list function_body END_FUNCTION */ |
|
1315 |
/* | FUNCTION derived_function_name ':' derived_type_name io_OR_function_var_declarations_list function_body END_FUNCTION */ |
|
1316 |
void *visit(function_declaration_c *symbol) { |
|
1317 |
generate_c_vardecl_c *vardecl; |
|
1318 |
TRACE("function_declaration_c"); |
|
1319 |
||
1320 |
/* (A) Function declaration... */ |
|
1321 |
/* (A.1) Function return type */ |
|
1322 |
s4o.print("// FUNCTION\n"); |
|
1323 |
symbol->type_name->accept(*this); /* return type */ |
|
1324 |
s4o.print(" "); |
|
1325 |
/* (A.2) Function name */ |
|
1326 |
symbol->derived_function_name->accept(*this); |
|
1327 |
s4o.print("("); |
|
1328 |
||
1329 |
/* (A.3) Function parameters */ |
|
1330 |
s4o.indent_right(); |
|
1331 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1332 |
generate_c_vardecl_c::finterface_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1333 |
generate_c_vardecl_c::input_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1334 |
generate_c_vardecl_c::output_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1335 |
generate_c_vardecl_c::inoutput_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1336 |
generate_c_vardecl_c::en_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1337 |
generate_c_vardecl_c::eno_vt); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1338 |
vardecl->print(symbol->var_declarations_list); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1339 |
delete vardecl; |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1340 |
|
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1341 |
s4o.indent_left(); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1342 |
|
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1343 |
s4o.print(")\n" + s4o.indent_spaces + "{\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1344 |
|
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1345 |
/* (B) Function local variable declaration */ |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1346 |
/* (B.1) Variables declared in ST source code */ |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1347 |
s4o.indent_right(); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1348 |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1349 |
vardecl = new generate_c_vardecl_c(&s4o, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1350 |
generate_c_vardecl_c::localinit_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1351 |
generate_c_vardecl_c::output_vt | |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1352 |
generate_c_vardecl_c::inoutput_vt | |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1353 |
generate_c_vardecl_c::private_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1354 |
generate_c_vardecl_c::eno_vt); |
70 | 1355 |
vardecl->print(symbol->var_declarations_list); |
1356 |
delete vardecl; |
|
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1357 |
|
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1358 |
/* (B.2) Temporary variable for function's return value */ |
70 | 1359 |
/* It will have the same name as the function itself! */ |
1360 |
s4o.print(s4o.indent_spaces); |
|
1361 |
symbol->type_name->accept(*this); /* return type */ |
|
1362 |
s4o.print(" "); |
|
1363 |
symbol->derived_function_name->accept(*this); |
|
1364 |
s4o.print(" = "); |
|
1365 |
{ |
|
1366 |
/* get the default value of this variable's type */ |
|
762 | 1367 |
symbol_c *default_value = type_initial_value_c::get(symbol->type_name); |
70 | 1368 |
if (default_value == NULL) ERROR; |
318
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1369 |
initialization_analyzer_c initialization_analyzer(default_value); |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1370 |
switch (initialization_analyzer.get_initialization_type()) { |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1371 |
case initialization_analyzer_c::struct_it: |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1372 |
{ |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1373 |
generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1374 |
structure_initialization->init_structure_default(symbol->type_name); |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1375 |
structure_initialization->init_structure_values(default_value); |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1376 |
delete structure_initialization; |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1377 |
} |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1378 |
break; |
318
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1379 |
case initialization_analyzer_c::array_it: |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1380 |
{ |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1381 |
generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1382 |
array_initialization->init_array_size(symbol->type_name); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1383 |
array_initialization->init_array_values(default_value); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1384 |
delete array_initialization; |
318
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1385 |
} |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1386 |
break; |
318
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1387 |
default: |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1388 |
default_value->accept(*this); |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1389 |
break; |
746a357b8747
Fix bug when generating initial value for function return type when it is a complex type
laurent
parents:
283
diff
changeset
|
1390 |
} |
70 | 1391 |
} |
1392 |
s4o.print(";\n\n"); |
|
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1393 |
|
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1394 |
s4o.print(s4o.indent_spaces + "// Control execution\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1395 |
s4o.print(s4o.indent_spaces + "if (!EN) {\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1396 |
s4o.indent_right(); |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1397 |
s4o.print(s4o.indent_spaces + "if (__ENO != NULL) {\n"); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1398 |
s4o.indent_right(); |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1399 |
s4o.print(s4o.indent_spaces + "*__ENO = __BOOL_LITERAL(FALSE);\n"); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1400 |
s4o.indent_left(); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1401 |
s4o.print(s4o.indent_spaces + "}\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1402 |
s4o.print(s4o.indent_spaces + "return "); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1403 |
symbol->derived_function_name->accept(*this); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1404 |
s4o.print(";\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1405 |
s4o.indent_left(); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1406 |
s4o.print(s4o.indent_spaces + "}\n"); |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1407 |
|
70 | 1408 |
/* (C) Function body */ |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1409 |
generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->derived_function_name, symbol); |
70 | 1410 |
symbol->function_body->accept(generate_c_code); |
145 | 1411 |
|
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1412 |
print_end_of_block_label(); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1413 |
|
145 | 1414 |
vardecl = new generate_c_vardecl_c(&s4o, |
1415 |
generate_c_vardecl_c::foutputassign_vf, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1416 |
generate_c_vardecl_c::output_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1417 |
generate_c_vardecl_c::inoutput_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1418 |
generate_c_vardecl_c::eno_vt); |
145 | 1419 |
vardecl->print(symbol->var_declarations_list); |
1420 |
delete vardecl; |
|
1421 |
||
70 | 1422 |
s4o.print(s4o.indent_spaces + "return "); |
1423 |
symbol->derived_function_name->accept(*this); |
|
1424 |
s4o.print(";\n"); |
|
1425 |
s4o.indent_left(); |
|
1426 |
s4o.print(s4o.indent_spaces + "}\n\n\n"); |
|
1427 |
||
1428 |
return NULL; |
|
1429 |
} |
|
1430 |
||
1431 |
||
1432 |
/* The remaining var_declarations_list_c, function_var_decls_c |
|
1433 |
* and var2_init_decl_list_c are handled in the generate_c_vardecl_c class |
|
1434 |
*/ |
|
1435 |
||
1436 |
||
1437 |
/*****************************/ |
|
1438 |
/* B 1.5.2 - Function Blocks */ |
|
1439 |
/*****************************/ |
|
1440 |
public: |
|
1441 |
/* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ |
|
1442 |
//SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused) |
|
1443 |
void *visit(function_block_declaration_c *symbol) { |
|
1444 |
generate_c_vardecl_c *vardecl; |
|
1445 |
generate_c_sfcdecl_c *sfcdecl; |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1446 |
generate_c_typedecl_c *typedecl; |
234
e4d31cd0e6d8
Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents:
231
diff
changeset
|
1447 |
generate_c_inlinefcall_c *inlinedecl; |
70 | 1448 |
TRACE("function_block_declaration_c"); |
1449 |
||
1450 |
/* (A) Function Block data structure declaration... */ |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1451 |
typedecl = new generate_c_typedecl_c(&s4o_incl); |
70 | 1452 |
/* (A.1) Data structure declaration */ |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1453 |
s4o_incl.print("// FUNCTION_BLOCK "); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1454 |
symbol->fblock_name->accept(*typedecl); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1455 |
s4o_incl.print("\n// Data part\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1456 |
s4o_incl.print("typedef struct {\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1457 |
s4o_incl.indent_right(); |
70 | 1458 |
/* (A.2) Public variables: i.e. the function parameters... */ |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1459 |
s4o_incl.print(s4o_incl.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1460 |
vardecl = new generate_c_vardecl_c(&s4o_incl, |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1461 |
generate_c_vardecl_c::local_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1462 |
generate_c_vardecl_c::input_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1463 |
generate_c_vardecl_c::output_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1464 |
generate_c_vardecl_c::inoutput_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1465 |
generate_c_vardecl_c::en_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1466 |
generate_c_vardecl_c::eno_vt); |
70 | 1467 |
vardecl->print(symbol->var_declarations); |
1468 |
delete vardecl; |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1469 |
s4o_incl.print("\n"); |
70 | 1470 |
/* (A.3) Private internal variables */ |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1471 |
s4o_incl.print(s4o_incl.indent_spaces + "// FB private variables - TEMP, private and located variables\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1472 |
vardecl = new generate_c_vardecl_c(&s4o_incl, |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1473 |
generate_c_vardecl_c::local_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1474 |
generate_c_vardecl_c::temp_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1475 |
generate_c_vardecl_c::private_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1476 |
generate_c_vardecl_c::located_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1477 |
generate_c_vardecl_c::external_vt); |
70 | 1478 |
vardecl->print(symbol->var_declarations); |
1479 |
delete vardecl; |
|
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1480 |
|
70 | 1481 |
/* (A.4) Generate private internal variables for SFC */ |
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1482 |
sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, symbol); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1483 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::sfcdecl_sd); |
70 | 1484 |
delete sfcdecl; |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1485 |
s4o_incl.print("\n"); |
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1486 |
|
70 | 1487 |
/* (A.5) Function Block data structure type name. */ |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1488 |
s4o_incl.indent_left(); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1489 |
s4o_incl.print("} "); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1490 |
symbol->fblock_name->accept(*typedecl); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1491 |
s4o_incl.print(";\n\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1492 |
delete typedecl; |
70 | 1493 |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1494 |
/* (A.6) Function Block inline function declaration for function invocation */ |
234
e4d31cd0e6d8
Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents:
231
diff
changeset
|
1495 |
inlinedecl = new generate_c_inlinefcall_c(&s4o, symbol->fblock_name, symbol, FB_FUNCTION_PARAM"->"); |
337
9a2262fb7994
Fix bug with inline function call in POU programmed in IL
laurent
parents:
330
diff
changeset
|
1496 |
symbol->fblock_body->accept(*inlinedecl); |
234
e4d31cd0e6d8
Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents:
231
diff
changeset
|
1497 |
delete inlinedecl; |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1498 |
|
70 | 1499 |
/* (B) Constructor */ |
1500 |
/* (B.1) Constructor name... */ |
|
1501 |
s4o.print(s4o.indent_spaces + "void "); |
|
1502 |
symbol->fblock_name->accept(*this); |
|
1503 |
s4o.print(FB_INIT_SUFFIX); |
|
1504 |
s4o.print("("); |
|
1505 |
||
1506 |
/* first and only parameter is a pointer to the data */ |
|
1507 |
symbol->fblock_name->accept(*this); |
|
1508 |
s4o.print(" *"); |
|
1509 |
s4o.print(FB_FUNCTION_PARAM); |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
1510 |
s4o.print(", BOOL retain) {\n"); |
70 | 1511 |
s4o.indent_right(); |
1512 |
||
1513 |
/* (B.2) Member initializations... */ |
|
1514 |
s4o.print(s4o.indent_spaces); |
|
1515 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1516 |
generate_c_vardecl_c::constructorinit_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1517 |
generate_c_vardecl_c::input_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1518 |
generate_c_vardecl_c::output_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1519 |
generate_c_vardecl_c::inoutput_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1520 |
generate_c_vardecl_c::private_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1521 |
generate_c_vardecl_c::located_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1522 |
generate_c_vardecl_c::external_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1523 |
generate_c_vardecl_c::en_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1524 |
generate_c_vardecl_c::eno_vt); |
70 | 1525 |
vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
1526 |
delete vardecl; |
|
1527 |
s4o.print("\n"); |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1528 |
|
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1529 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1530 |
|
70 | 1531 |
/* (B.3) Generate private internal variables for SFC */ |
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1532 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::sfcinit_sd); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1533 |
|
70 | 1534 |
s4o.indent_left(); |
1535 |
s4o.print(s4o.indent_spaces + "}\n\n"); |
|
1536 |
||
1537 |
||
1538 |
/* (C) Function with FB body */ |
|
1539 |
/* (C.1) Step definitions */ |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1540 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::stepdef_sd); |
70 | 1541 |
|
1542 |
/* (C.2) Action definitions */ |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1543 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::actiondef_sd); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1544 |
|
70 | 1545 |
/* (C.3) Function declaration */ |
1546 |
s4o.print("// Code part\n"); |
|
1547 |
/* function interface */ |
|
1548 |
s4o.print("void "); |
|
1549 |
symbol->fblock_name->accept(*this); |
|
1550 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
1551 |
s4o.print("("); |
|
1552 |
/* first and only parameter is a pointer to the data */ |
|
1553 |
symbol->fblock_name->accept(*this); |
|
1554 |
s4o.print(" *"); |
|
1555 |
s4o.print(FB_FUNCTION_PARAM); |
|
1556 |
s4o.print(") {\n"); |
|
1557 |
s4o.indent_right(); |
|
1558 |
||
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1559 |
s4o.print(s4o.indent_spaces + "// Control execution\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1560 |
s4o.print(s4o.indent_spaces + "if (!"); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1561 |
s4o.print(GET_VAR); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1562 |
s4o.print("("); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1563 |
s4o.print(FB_FUNCTION_PARAM); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1564 |
s4o.print("->EN)) {\n"); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1565 |
s4o.indent_right(); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1566 |
s4o.print(s4o.indent_spaces); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1567 |
s4o.print(SET_VAR); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1568 |
s4o.print("("); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1569 |
s4o.print(FB_FUNCTION_PARAM); |
885
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
878
diff
changeset
|
1570 |
s4o.print("->,ENO,,__BOOL_LITERAL(FALSE));\n"); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1571 |
s4o.print(s4o.indent_spaces + "return;\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1572 |
s4o.indent_left(); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1573 |
s4o.print(s4o.indent_spaces + "}\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1574 |
s4o.print(s4o.indent_spaces + "else {\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1575 |
s4o.indent_right(); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1576 |
s4o.print(s4o.indent_spaces); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1577 |
s4o.print(SET_VAR); |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1578 |
s4o.print("("); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1579 |
s4o.print(FB_FUNCTION_PARAM); |
885
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
878
diff
changeset
|
1580 |
s4o.print("->,ENO,,__BOOL_LITERAL(TRUE));\n"); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1581 |
s4o.indent_left(); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1582 |
s4o.print(s4o.indent_spaces + "}\n"); |
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1583 |
|
70 | 1584 |
/* (C.4) Initialize TEMP variables */ |
1585 |
/* function body */ |
|
1586 |
s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
|
1587 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1588 |
generate_c_vardecl_c::init_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1589 |
generate_c_vardecl_c::temp_vt); |
70 | 1590 |
vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
1591 |
delete vardecl; |
|
1592 |
s4o.print("\n"); |
|
1593 |
||
1594 |
/* (C.5) Function code */ |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1595 |
generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->fblock_name, symbol, FB_FUNCTION_PARAM"->"); |
70 | 1596 |
symbol->fblock_body->accept(generate_c_code); |
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1597 |
print_end_of_block_label(); |
330
d2facfcf485a
Fix warning on nop statement at the end of function_block and program generated code
laurent
parents:
318
diff
changeset
|
1598 |
s4o.print(s4o.indent_spaces + "return;\n"); |
70 | 1599 |
s4o.indent_left(); |
1600 |
s4o.print(s4o.indent_spaces + "} // "); |
|
1601 |
symbol->fblock_name->accept(*this); |
|
1602 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
1603 |
s4o.print(s4o.indent_spaces + "() \n\n"); |
|
1604 |
||
1605 |
/* (C.6) Step undefinitions */ |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1606 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::stepundef_sd); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1607 |
|
70 | 1608 |
/* (C.7) Action undefinitions */ |
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1609 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::actionundef_sd); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1610 |
|
70 | 1611 |
delete sfcdecl; |
1612 |
||
1613 |
s4o.indent_left(); |
|
1614 |
s4o.print("\n\n\n\n"); |
|
1615 |
||
1616 |
return NULL; |
|
1617 |
} |
|
1618 |
||
1619 |
||
1620 |
/* The remaining temp_var_decls_c, temp_var_decls_list_c |
|
1621 |
* and non_retentive_var_decls_c are handled in the generate_c_vardecl_c class |
|
1622 |
*/ |
|
1623 |
||
1624 |
||
1625 |
/**********************/ |
|
1626 |
/* B 1.5.3 - Programs */ |
|
1627 |
/**********************/ |
|
1628 |
||
1629 |
||
1630 |
||
1631 |
public: |
|
1632 |
/* PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */ |
|
1633 |
//SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused) |
|
1634 |
void *visit(program_declaration_c *symbol) { |
|
1635 |
generate_c_vardecl_c *vardecl; |
|
1636 |
generate_c_sfcdecl_c *sfcdecl; |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1637 |
generate_c_typedecl_c *typedecl; |
234
e4d31cd0e6d8
Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents:
231
diff
changeset
|
1638 |
generate_c_inlinefcall_c *inlinedecl; |
70 | 1639 |
TRACE("program_declaration_c"); |
1640 |
||
1641 |
/* (A) Program data structure declaration... */ |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1642 |
typedecl = new generate_c_typedecl_c(&s4o_incl); |
70 | 1643 |
/* (A.1) Data structure declaration */ |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1644 |
s4o_incl.print("// PROGRAM "); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1645 |
symbol->program_type_name->accept(*typedecl); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1646 |
s4o_incl.print("\n// Data part\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1647 |
s4o_incl.print("typedef struct {\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1648 |
s4o_incl.indent_right(); |
70 | 1649 |
|
1650 |
/* (A.2) Public variables: i.e. the program parameters... */ |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1651 |
s4o_incl.print(s4o_incl.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1652 |
vardecl = new generate_c_vardecl_c(&s4o_incl, |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1653 |
generate_c_vardecl_c::local_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1654 |
generate_c_vardecl_c::input_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1655 |
generate_c_vardecl_c::output_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1656 |
generate_c_vardecl_c::inoutput_vt); |
70 | 1657 |
vardecl->print(symbol->var_declarations); |
1658 |
delete vardecl; |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1659 |
s4o_incl.print("\n"); |
70 | 1660 |
/* (A.3) Private internal variables */ |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1661 |
s4o_incl.print(s4o_incl.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1662 |
vardecl = new generate_c_vardecl_c(&s4o_incl, |
70 | 1663 |
generate_c_vardecl_c::local_vf, |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1664 |
generate_c_vardecl_c::temp_vt | |
70 | 1665 |
generate_c_vardecl_c::private_vt | |
1666 |
generate_c_vardecl_c::located_vt | |
|
1667 |
generate_c_vardecl_c::external_vt); |
|
1668 |
vardecl->print(symbol->var_declarations); |
|
1669 |
delete vardecl; |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1670 |
|
70 | 1671 |
/* (A.4) Generate private internal variables for SFC */ |
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1672 |
sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, symbol); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1673 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::sfcdecl_sd); |
70 | 1674 |
delete sfcdecl; |
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1675 |
s4o_incl.print("\n"); |
70 | 1676 |
|
1677 |
/* (A.5) Program data structure type name. */ |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1678 |
s4o_incl.indent_left(); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1679 |
s4o_incl.print("} "); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1680 |
symbol->program_type_name->accept(*typedecl); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1681 |
s4o_incl.print(";\n\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
1682 |
delete typedecl; |
70 | 1683 |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1684 |
/* (A.6) Function Block inline function declaration for function invocation */ |
234
e4d31cd0e6d8
Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents:
231
diff
changeset
|
1685 |
inlinedecl = new generate_c_inlinefcall_c(&s4o, symbol->program_type_name, symbol, FB_FUNCTION_PARAM"->"); |
337
9a2262fb7994
Fix bug with inline function call in POU programmed in IL
laurent
parents:
330
diff
changeset
|
1686 |
symbol->function_block_body->accept(*inlinedecl); |
234
e4d31cd0e6d8
Using function_call_iterator in generate_c_inlinefcall instead of creating a new visitor
laurent
parents:
231
diff
changeset
|
1687 |
delete inlinedecl; |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1688 |
|
70 | 1689 |
/* (B) Constructor */ |
1690 |
/* (B.1) Constructor name... */ |
|
1691 |
s4o.print(s4o.indent_spaces + "void "); |
|
1692 |
symbol->program_type_name->accept(*this); |
|
1693 |
s4o.print(FB_INIT_SUFFIX); |
|
1694 |
s4o.print("("); |
|
1695 |
||
1696 |
/* first and only parameter is a pointer to the data */ |
|
1697 |
symbol->program_type_name->accept(*this); |
|
1698 |
s4o.print(" *"); |
|
1699 |
s4o.print(FB_FUNCTION_PARAM); |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
1700 |
s4o.print(", BOOL retain) {\n"); |
70 | 1701 |
s4o.indent_right(); |
1702 |
||
1703 |
/* (B.2) Member initializations... */ |
|
1704 |
s4o.print(s4o.indent_spaces); |
|
1705 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1706 |
generate_c_vardecl_c::constructorinit_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1707 |
generate_c_vardecl_c::input_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1708 |
generate_c_vardecl_c::output_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1709 |
generate_c_vardecl_c::inoutput_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1710 |
generate_c_vardecl_c::private_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1711 |
generate_c_vardecl_c::located_vt | |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1712 |
generate_c_vardecl_c::external_vt); |
70 | 1713 |
vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
1714 |
delete vardecl; |
|
1715 |
s4o.print("\n"); |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1716 |
|
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1717 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1718 |
|
70 | 1719 |
/* (B.3) Generate private internal variables for SFC */ |
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1720 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::sfcinit_sd); |
70 | 1721 |
|
1722 |
s4o.indent_left(); |
|
1723 |
s4o.print(s4o.indent_spaces + "}\n\n"); |
|
1724 |
||
1725 |
/* (C) Function with PROGRAM body */ |
|
1726 |
/* (C.1) Step definitions */ |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1727 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::stepdef_sd); |
70 | 1728 |
|
1729 |
/* (C.2) Action definitions */ |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1730 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::actiondef_sd); |
70 | 1731 |
|
1732 |
/* (C.3) Function declaration */ |
|
1733 |
s4o.print("// Code part\n"); |
|
1734 |
/* function interface */ |
|
1735 |
s4o.print("void "); |
|
1736 |
symbol->program_type_name->accept(*this); |
|
1737 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
1738 |
s4o.print("("); |
|
1739 |
/* first and only parameter is a pointer to the data */ |
|
1740 |
symbol->program_type_name->accept(*this); |
|
1741 |
s4o.print(" *"); |
|
1742 |
s4o.print(FB_FUNCTION_PARAM); |
|
1743 |
s4o.print(") {\n"); |
|
1744 |
s4o.indent_right(); |
|
1745 |
||
1746 |
/* (C.4) Initialize TEMP variables */ |
|
1747 |
/* function body */ |
|
1748 |
s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
|
1749 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1750 |
generate_c_vardecl_c::init_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1751 |
generate_c_vardecl_c::temp_vt); |
70 | 1752 |
vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
1753 |
delete vardecl; |
|
1754 |
s4o.print("\n"); |
|
1755 |
||
1756 |
/* (C.5) Function code */ |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1757 |
generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->program_type_name, symbol, FB_FUNCTION_PARAM"->"); |
70 | 1758 |
symbol->function_block_body->accept(generate_c_code); |
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
1759 |
print_end_of_block_label(); |
330
d2facfcf485a
Fix warning on nop statement at the end of function_block and program generated code
laurent
parents:
318
diff
changeset
|
1760 |
s4o.print(s4o.indent_spaces + "return;\n"); |
70 | 1761 |
s4o.indent_left(); |
1762 |
s4o.print(s4o.indent_spaces + "} // "); |
|
1763 |
symbol->program_type_name->accept(*this); |
|
1764 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
1765 |
s4o.print(s4o.indent_spaces + "() \n\n"); |
|
1766 |
||
1767 |
/* (C.6) Step undefinitions */ |
|
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1768 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::stepundef_sd); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1769 |
|
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1770 |
/* (C.7) Action undefinitions */ |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1771 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::actionundef_sd); |
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1772 |
|
70 | 1773 |
delete sfcdecl; |
244
3a478229db8b
Adding support for generating code for variable in step action association instead of action
laurent
parents:
241
diff
changeset
|
1774 |
|
70 | 1775 |
s4o.indent_left(); |
1776 |
s4o.print("\n\n\n\n"); |
|
1777 |
||
1778 |
return NULL; |
|
1779 |
} |
|
1780 |
||
1781 |
}; /* generate_c_pous_c */ |
|
1782 |
||
1783 |
/***********************************************************************/ |
|
1784 |
/***********************************************************************/ |
|
1785 |
/***********************************************************************/ |
|
1786 |
/***********************************************************************/ |
|
1787 |
/***********************************************************************/ |
|
1788 |
/***********************************************************************/ |
|
1789 |
/***********************************************************************/ |
|
1790 |
/***********************************************************************/ |
|
1791 |
||
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1792 |
class generate_c_config_c: public generate_c_base_c { |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1793 |
private: |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1794 |
stage4out_c &s4o_incl; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1795 |
|
70 | 1796 |
public: |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1797 |
generate_c_config_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr) |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1798 |
: generate_c_base_c(s4o_ptr), s4o_incl(*s4o_incl_ptr) { |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1799 |
}; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1800 |
|
70 | 1801 |
virtual ~generate_c_config_c(void) {} |
1802 |
||
1803 |
typedef enum { |
|
1804 |
initprotos_dt, |
|
1805 |
initdeclare_dt, |
|
1806 |
runprotos_dt, |
|
1807 |
rundeclare_dt |
|
1808 |
} declaretype_t; |
|
1809 |
||
1810 |
declaretype_t wanted_declaretype; |
|
1811 |
||
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1812 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1813 |
public: |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1814 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1815 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1816 |
/********************/ |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1817 |
void *visit(enable_code_generation_pragma_c * symbol) { |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1818 |
s4o.enable_output(); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1819 |
s4o_incl.enable_output(); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1820 |
return NULL; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1821 |
} |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1822 |
|
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1823 |
void *visit(disable_code_generation_pragma_c * symbol) { |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1824 |
s4o.disable_output(); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1825 |
s4o_incl.disable_output(); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1826 |
return NULL; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1827 |
} |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1828 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1829 |
|
70 | 1830 |
/********************************/ |
1831 |
/* B 1.7 Configuration elements */ |
|
1832 |
/********************************/ |
|
1833 |
/* |
|
1834 |
CONFIGURATION configuration_name |
|
1835 |
optional_global_var_declarations |
|
1836 |
(resource_declaration_list | single_resource_declaration) |
|
1837 |
optional_access_declarations |
|
1838 |
optional_instance_specific_initializations |
|
1839 |
END_CONFIGURATION |
|
1840 |
*/ |
|
1841 |
/* |
|
1842 |
SYM_REF6(configuration_declaration_c, configuration_name, global_var_declarations, resource_declarations, access_declarations, instance_specific_initializations, unused) |
|
1843 |
*/ |
|
1844 |
void *visit(configuration_declaration_c *symbol) { |
|
1845 |
generate_c_vardecl_c *vardecl; |
|
1846 |
||
1847 |
/* Insert the header... */ |
|
1848 |
s4o.print("/*******************************************/\n"); |
|
1849 |
s4o.print("/* FILE GENERATED BY iec2c */\n"); |
|
1850 |
s4o.print("/* Editing this file is not recommended... */\n"); |
|
1851 |
s4o.print("/*******************************************/\n\n"); |
|
1852 |
s4o.print("#include \"iec_std_lib.h\"\n\n"); |
|
257 | 1853 |
s4o.print("#include \"accessor.h\"\n\n"); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1854 |
s4o.print("#include \"POUS.h\"\n\n"); |
250
5d2927300e2c
Adding missing support for accessors and retain in configuration files (Bug and fix reported by Manuele Conti)
laurent
parents:
248
diff
changeset
|
1855 |
|
70 | 1856 |
/* (A) configuration declaration... */ |
1857 |
/* (A.1) configuration name in comment */ |
|
1858 |
s4o.print("// CONFIGURATION "); |
|
1859 |
symbol->configuration_name->accept(*this); |
|
1860 |
s4o.print("\n"); |
|
1861 |
||
1862 |
/* (A.2) Global variables */ |
|
1863 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1864 |
generate_c_vardecl_c::local_vf, |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
1865 |
generate_c_vardecl_c::global_vt, |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
1866 |
symbol->configuration_name); |
70 | 1867 |
vardecl->print(symbol); |
1868 |
delete vardecl; |
|
1869 |
s4o.print("\n"); |
|
1870 |
||
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1871 |
/* (A.3) Declare global prototypes in include file */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1872 |
vardecl = new generate_c_vardecl_c(&s4o_incl, |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1873 |
generate_c_vardecl_c::globalprototype_vf, |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1874 |
generate_c_vardecl_c::global_vt, |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1875 |
symbol->configuration_name); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1876 |
vardecl->print(symbol); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1877 |
delete vardecl; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1878 |
s4o_incl.print("\n"); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1879 |
|
70 | 1880 |
/* (B) Initialisation Function */ |
1881 |
/* (B.1) Ressources initialisation protos... */ |
|
1882 |
wanted_declaretype = initprotos_dt; |
|
1883 |
symbol->resource_declarations->accept(*this); |
|
1884 |
s4o.print("\n"); |
|
1885 |
||
1886 |
/* (B.2) Initialisation function name... */ |
|
1887 |
s4o.print(s4o.indent_spaces + "void config"); |
|
1888 |
s4o.print(FB_INIT_SUFFIX); |
|
1889 |
s4o.print("(void) {\n"); |
|
1890 |
s4o.indent_right(); |
|
250
5d2927300e2c
Adding missing support for accessors and retain in configuration files (Bug and fix reported by Manuele Conti)
laurent
parents:
248
diff
changeset
|
1891 |
s4o.print(s4o.indent_spaces); |
255
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1892 |
s4o.print("BOOL retain;\n"); |
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1893 |
s4o.print(s4o.indent_spaces); |
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1894 |
s4o.print("retain = 0;\n"); |
70 | 1895 |
|
1896 |
/* (B.3) Global variables initializations... */ |
|
1897 |
s4o.print(s4o.indent_spaces); |
|
1898 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1899 |
generate_c_vardecl_c::constructorinit_vf, |
537
199bdfe36166
Fix code generation about __INIT_GLOBAL_LOCATED.
Conti Manuele <manuele.conti@alice.it>
parents:
522
diff
changeset
|
1900 |
generate_c_vardecl_c::global_vt, |
199bdfe36166
Fix code generation about __INIT_GLOBAL_LOCATED.
Conti Manuele <manuele.conti@alice.it>
parents:
522
diff
changeset
|
1901 |
symbol->configuration_name); |
70 | 1902 |
vardecl->print(symbol); |
1903 |
delete vardecl; |
|
1904 |
s4o.print("\n"); |
|
1905 |
||
1906 |
/* (B.3) Resources initializations... */ |
|
1907 |
wanted_declaretype = initdeclare_dt; |
|
1908 |
symbol->resource_declarations->accept(*this); |
|
1909 |
||
1910 |
s4o.indent_left(); |
|
1911 |
s4o.print(s4o.indent_spaces + "}\n\n"); |
|
1912 |
||
1913 |
||
1914 |
/* (C) Run Function*/ |
|
1915 |
/* (C.1) Resources run functions protos... */ |
|
1916 |
wanted_declaretype = runprotos_dt; |
|
1917 |
symbol->resource_declarations->accept(*this); |
|
1918 |
s4o.print("\n"); |
|
1919 |
||
1920 |
/* (C.2) Run function name... */ |
|
1921 |
s4o.print(s4o.indent_spaces + "void config"); |
|
1922 |
s4o.print(FB_RUN_SUFFIX); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
1923 |
s4o.print("(unsigned long tick) {\n"); |
70 | 1924 |
s4o.indent_right(); |
1925 |
||
1926 |
/* (C.3) Resources initializations... */ |
|
1927 |
wanted_declaretype = rundeclare_dt; |
|
1928 |
symbol->resource_declarations->accept(*this); |
|
1929 |
||
1930 |
/* (C.3) Close Public Function body */ |
|
1931 |
s4o.indent_left(); |
|
1932 |
s4o.print(s4o.indent_spaces + "}\n"); |
|
1933 |
||
1934 |
return NULL; |
|
1935 |
} |
|
1936 |
||
1937 |
void *visit(resource_declaration_c *symbol) { |
|
1938 |
if (wanted_declaretype == initprotos_dt || wanted_declaretype == runprotos_dt) { |
|
1939 |
s4o.print(s4o.indent_spaces + "void "); |
|
1940 |
symbol->resource_name->accept(*this); |
|
1941 |
if (wanted_declaretype == initprotos_dt) { |
|
1942 |
s4o.print(FB_INIT_SUFFIX); |
|
1943 |
s4o.print("(void);\n"); |
|
1944 |
} |
|
1945 |
else { |
|
1946 |
s4o.print(FB_RUN_SUFFIX); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
1947 |
s4o.print("(unsigned long tick);\n"); |
70 | 1948 |
} |
1949 |
} |
|
1950 |
if (wanted_declaretype == initdeclare_dt || wanted_declaretype == rundeclare_dt) { |
|
1951 |
s4o.print(s4o.indent_spaces); |
|
1952 |
symbol->resource_name->accept(*this); |
|
1953 |
if (wanted_declaretype == initdeclare_dt) { |
|
1954 |
s4o.print(FB_INIT_SUFFIX); |
|
1955 |
s4o.print("();\n"); |
|
1956 |
} |
|
1957 |
else { |
|
1958 |
s4o.print(FB_RUN_SUFFIX); |
|
1959 |
s4o.print("(tick);\n"); |
|
1960 |
} |
|
1961 |
} |
|
1962 |
return NULL; |
|
1963 |
} |
|
1964 |
||
1965 |
void *visit(single_resource_declaration_c *symbol) { |
|
1966 |
if (wanted_declaretype == initprotos_dt || wanted_declaretype == runprotos_dt) { |
|
1967 |
s4o.print(s4o.indent_spaces + "void RESOURCE"); |
|
1968 |
if (wanted_declaretype == initprotos_dt) { |
|
1969 |
s4o.print(FB_INIT_SUFFIX); |
|
1970 |
s4o.print("(void);\n"); |
|
1971 |
} |
|
1972 |
else { |
|
1973 |
s4o.print(FB_RUN_SUFFIX); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
1974 |
s4o.print("(unsigned long tick);\n"); |
70 | 1975 |
} |
1976 |
} |
|
1977 |
if (wanted_declaretype == initdeclare_dt || wanted_declaretype == rundeclare_dt) { |
|
1978 |
s4o.print(s4o.indent_spaces + "RESOURCE"); |
|
1979 |
if (wanted_declaretype == initdeclare_dt) { |
|
1980 |
s4o.print(FB_INIT_SUFFIX); |
|
1981 |
s4o.print("();\n"); |
|
1982 |
} |
|
1983 |
else { |
|
1984 |
s4o.print(FB_RUN_SUFFIX); |
|
1985 |
s4o.print("(tick);\n"); |
|
1986 |
} |
|
1987 |
} |
|
1988 |
return NULL; |
|
1989 |
} |
|
1990 |
||
1991 |
}; |
|
1992 |
||
1993 |
/***********************************************************************/ |
|
1994 |
/***********************************************************************/ |
|
1995 |
/***********************************************************************/ |
|
1996 |
/***********************************************************************/ |
|
1997 |
/***********************************************************************/ |
|
1998 |
/***********************************************************************/ |
|
1999 |
/***********************************************************************/ |
|
2000 |
/***********************************************************************/ |
|
2001 |
||
2002 |
||
2003 |
class generate_c_resources_c: public generate_c_typedecl_c { |
|
2004 |
||
2005 |
search_var_instance_decl_c *search_config_instance; |
|
2006 |
search_var_instance_decl_c *search_resource_instance; |
|
2007 |
||
2008 |
private: |
|
2009 |
/* The name of the resource curretnly being processed... */ |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2010 |
symbol_c *current_configuration; |
70 | 2011 |
symbol_c *current_resource_name; |
184 | 2012 |
symbol_c *current_task_name; |
70 | 2013 |
symbol_c *current_global_vars; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2014 |
bool configuration_name; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2015 |
stage4out_c *s4o_ptr; |
70 | 2016 |
|
2017 |
public: |
|
2018 |
generate_c_resources_c(stage4out_c *s4o_ptr, symbol_c *config_scope, symbol_c *resource_scope, unsigned long time) |
|
2019 |
: generate_c_typedecl_c(s4o_ptr) { |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2020 |
current_configuration = config_scope; |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2021 |
search_config_instance = new search_var_instance_decl_c(config_scope); |
70 | 2022 |
search_resource_instance = new search_var_instance_decl_c(resource_scope); |
2023 |
common_ticktime = time; |
|
2024 |
current_resource_name = NULL; |
|
184 | 2025 |
current_task_name = NULL; |
70 | 2026 |
current_global_vars = NULL; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2027 |
configuration_name = false; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2028 |
generate_c_resources_c::s4o_ptr = s4o_ptr; |
70 | 2029 |
}; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2030 |
|
70 | 2031 |
virtual ~generate_c_resources_c(void) { |
2032 |
delete search_config_instance; |
|
2033 |
delete search_resource_instance; |
|
2034 |
} |
|
2035 |
||
2036 |
typedef enum { |
|
2037 |
declare_dt, |
|
2038 |
init_dt, |
|
2039 |
run_dt |
|
2040 |
} declaretype_t; |
|
2041 |
||
2042 |
declaretype_t wanted_declaretype; |
|
2043 |
||
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
2044 |
unsigned long long common_ticktime; |
70 | 2045 |
|
2046 |
const char *current_program_name; |
|
2047 |
||
2048 |
typedef enum { |
|
2049 |
assign_at, |
|
2050 |
send_at |
|
2051 |
} assigntype_t; |
|
2052 |
||
2053 |
assigntype_t wanted_assigntype; |
|
2054 |
||
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2055 |
/* the qualifier of variables that need to be processed... */ |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2056 |
static const unsigned int none_vq = 0x0000; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2057 |
static const unsigned int constant_vq = 0x0001; // CONSTANT |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2058 |
static const unsigned int retain_vq = 0x0002; // RETAIN |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2059 |
static const unsigned int non_retain_vq = 0x0004; // NON_RETAIN |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2060 |
|
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2061 |
/* variable used to store the qualifier of program currently being processed... */ |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2062 |
unsigned int current_varqualifier; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2063 |
|
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2064 |
void *print_retain(void) { |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2065 |
s4o.print(","); |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2066 |
switch (current_varqualifier) { |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2067 |
case retain_vq: |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2068 |
s4o.print("1"); |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2069 |
break; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2070 |
case non_retain_vq: |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2071 |
s4o.print("0"); |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2072 |
break; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2073 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2074 |
s4o.print("retain"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2075 |
break; |
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2076 |
} |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2077 |
return NULL; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2078 |
} |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2079 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2080 |
/*************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2081 |
/* B.1 - Common elements */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2082 |
/*************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2083 |
/*******************************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2084 |
/* B 1.1 - Letters, digits and identifiers */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2085 |
/*******************************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2086 |
|
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2087 |
void *visit(identifier_c *symbol) { |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2088 |
if (configuration_name) |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2089 |
s4o.print(symbol->value); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2090 |
else |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2091 |
generate_c_base_c::visit(symbol); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2092 |
return NULL; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2093 |
} |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2094 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2095 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2096 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2097 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2098 |
void *visit(enable_code_generation_pragma_c * symbol) {s4o_ptr->enable_output(); return NULL;} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2099 |
void *visit(disable_code_generation_pragma_c * symbol) {s4o_ptr->disable_output(); return NULL;} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2100 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2101 |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2102 |
/******************************************/ |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2103 |
/* B 1.4.3 - Declaration & Initialisation */ |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2104 |
/******************************************/ |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2105 |
|
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2106 |
void *visit(constant_option_c *symbol) { |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2107 |
current_varqualifier = constant_vq; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2108 |
return NULL; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2109 |
} |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2110 |
|
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2111 |
void *visit(retain_option_c *symbol) { |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2112 |
current_varqualifier = retain_vq; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2113 |
return NULL; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2114 |
} |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2115 |
|
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2116 |
void *visit(non_retain_option_c *symbol) { |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2117 |
current_varqualifier = non_retain_vq; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2118 |
return NULL; |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2119 |
} |
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2120 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2121 |
/********************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2122 |
/* B 1.7 Configuration elements */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2123 |
/********************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2124 |
|
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2125 |
void *visit(configuration_declaration_c *symbol) { |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2126 |
return symbol->configuration_name->accept(*this); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2127 |
} |
70 | 2128 |
|
2129 |
/* |
|
2130 |
RESOURCE resource_name ON resource_type_name |
|
2131 |
optional_global_var_declarations |
|
2132 |
single_resource_declaration |
|
2133 |
END_RESOURCE |
|
2134 |
*/ |
|
2135 |
// SYM_REF4(resource_declaration_c, resource_name, resource_type_name, global_var_declarations, resource_declaration) |
|
2136 |
void *visit(resource_declaration_c *symbol) { |
|
2137 |
current_resource_name = symbol->resource_name; |
|
2138 |
current_global_vars = symbol->global_var_declarations; |
|
2139 |
||
2140 |
symbol->resource_declaration->accept(*this); |
|
2141 |
||
2142 |
current_resource_name = NULL; |
|
2143 |
current_global_vars = NULL; |
|
2144 |
return NULL; |
|
2145 |
} |
|
2146 |
||
2147 |
/* task_configuration_list program_configuration_list */ |
|
2148 |
// SYM_REF2(single_resource_declaration_c, task_configuration_list, program_configuration_list) |
|
2149 |
void *visit(single_resource_declaration_c *symbol) { |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2150 |
bool single_resource = current_resource_name == NULL; |
70 | 2151 |
if (single_resource) |
2152 |
current_resource_name = new identifier_c("RESOURCE"); |
|
2153 |
generate_c_vardecl_c *vardecl; |
|
2154 |
||
2155 |
/* Insert the header... */ |
|
2156 |
s4o.print("/*******************************************/\n"); |
|
2157 |
s4o.print("/* FILE GENERATED BY iec2c */\n"); |
|
2158 |
s4o.print("/* Editing this file is not recommended... */\n"); |
|
2159 |
s4o.print("/*******************************************/\n\n"); |
|
2160 |
s4o.print("#include \"iec_std_lib.h\"\n\n"); |
|
2161 |
||
2162 |
/* (A) resource declaration... */ |
|
2163 |
/* (A.1) resource name in comment */ |
|
2164 |
s4o.print("// RESOURCE "); |
|
2165 |
current_resource_name->accept(*this); |
|
120
74640e3c7f53
Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents:
112
diff
changeset
|
2166 |
s4o.print("\n\n"); |
74640e3c7f53
Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents:
112
diff
changeset
|
2167 |
|
237 | 2168 |
s4o.print("extern unsigned long long common_ticktime__;\n\n"); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
2169 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2170 |
s4o.print("#include \"accessor.h\"\n"); |
397
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2171 |
s4o.print("#include \"POUS.h\"\n\n"); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2172 |
s4o.print("#include \""); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2173 |
configuration_name = true; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2174 |
current_configuration->accept(*this); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2175 |
configuration_name = false; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2176 |
s4o.print(".h\"\n"); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
2177 |
|
70 | 2178 |
/* (A.2) Global variables... */ |
2179 |
if (current_global_vars != NULL) { |
|
2180 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2181 |
generate_c_vardecl_c::local_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2182 |
generate_c_vardecl_c::global_vt, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2183 |
current_resource_name); |
70 | 2184 |
vardecl->print(current_global_vars); |
2185 |
delete vardecl; |
|
120
74640e3c7f53
Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents:
112
diff
changeset
|
2186 |
s4o.print("\n"); |
70 | 2187 |
} |
2188 |
||
2189 |
/* (A.3) POUs inclusion */ |
|
2190 |
s4o.print("#include \"POUS.c\"\n\n"); |
|
2191 |
||
184 | 2192 |
wanted_declaretype = declare_dt; |
2193 |
||
70 | 2194 |
/* (A.4) Resource programs declaration... */ |
184 | 2195 |
symbol->task_configuration_list->accept(*this); |
2196 |
||
2197 |
/* (A.5) Resource programs declaration... */ |
|
70 | 2198 |
symbol->program_configuration_list->accept(*this); |
184 | 2199 |
|
70 | 2200 |
s4o.print("\n"); |
2201 |
||
2202 |
/* (B) resource initialisation function... */ |
|
2203 |
/* (B.1) initialisation function name... */ |
|
2204 |
s4o.print("void "); |
|
2205 |
current_resource_name->accept(*this); |
|
2206 |
s4o.print(FB_INIT_SUFFIX); |
|
2207 |
s4o.print("(void) {\n"); |
|
2208 |
s4o.indent_right(); |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2209 |
s4o.print(s4o.indent_spaces); |
255
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
2210 |
s4o.print("BOOL retain;\n"); |
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
2211 |
s4o.print(s4o.indent_spaces); |
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
2212 |
s4o.print("retain = 0;\n"); |
70 | 2213 |
|
2214 |
/* (B.2) Global variables initialisations... */ |
|
2215 |
if (current_global_vars != NULL) { |
|
2216 |
s4o.print(s4o.indent_spaces); |
|
2217 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2218 |
generate_c_vardecl_c::constructorinit_vf, |
241
0ba6d614573e
Bug with code generation of global located variables in resource fixed thanks to Mario
laurent
parents:
237
diff
changeset
|
2219 |
generate_c_vardecl_c::global_vt, |
0ba6d614573e
Bug with code generation of global located variables in resource fixed thanks to Mario
laurent
parents:
237
diff
changeset
|
2220 |
current_resource_name); |
70 | 2221 |
vardecl->print(current_global_vars); |
2222 |
delete vardecl; |
|
2223 |
} |
|
2224 |
s4o.print("\n"); |
|
2225 |
||
2226 |
wanted_declaretype = init_dt; |
|
184 | 2227 |
|
2228 |
/* (B.3) Tasks initialisations... */ |
|
2229 |
symbol->task_configuration_list->accept(*this); |
|
2230 |
||
2231 |
/* (B.4) Resource programs initialisations... */ |
|
70 | 2232 |
symbol->program_configuration_list->accept(*this); |
2233 |
||
2234 |
s4o.indent_left(); |
|
2235 |
s4o.print("}\n\n"); |
|
2236 |
||
2237 |
/* (C) Resource run function... */ |
|
2238 |
/* (C.1) Run function name... */ |
|
2239 |
s4o.print("void "); |
|
2240 |
current_resource_name->accept(*this); |
|
2241 |
s4o.print(FB_RUN_SUFFIX); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
2242 |
s4o.print("(unsigned long tick) {\n"); |
70 | 2243 |
s4o.indent_right(); |
2244 |
||
184 | 2245 |
wanted_declaretype = run_dt; |
2246 |
||
70 | 2247 |
/* (C.2) Task management... */ |
2248 |
symbol->task_configuration_list->accept(*this); |
|
2249 |
||
2250 |
/* (C.3) Program run declaration... */ |
|
2251 |
symbol->program_configuration_list->accept(*this); |
|
2252 |
||
2253 |
s4o.indent_left(); |
|
2254 |
s4o.print("}\n\n"); |
|
2255 |
||
2256 |
if (single_resource) { |
|
2257 |
delete current_resource_name; |
|
2258 |
current_resource_name = NULL; |
|
2259 |
} |
|
2260 |
return NULL; |
|
2261 |
} |
|
2262 |
||
2263 |
/* PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */ |
|
2264 |
//SYM_REF6(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements, unused) |
|
2265 |
void *visit(program_configuration_c *symbol) { |
|
184 | 2266 |
switch (wanted_declaretype) { |
2267 |
case declare_dt: |
|
70 | 2268 |
s4o.print(s4o.indent_spaces); |
184 | 2269 |
symbol->program_type_name->accept(*this); |
2270 |
s4o.print(" "); |
|
2271 |
current_resource_name->accept(*this); |
|
2272 |
s4o.print("__"); |
|
2273 |
symbol->program_name->accept(*this); |
|
2274 |
s4o.print(";\n#define "); |
|
2275 |
symbol->program_name->accept(*this); |
|
2276 |
s4o.print(" "); |
|
2277 |
current_resource_name->accept(*this); |
|
2278 |
s4o.print("__"); |
|
2279 |
symbol->program_name->accept(*this); |
|
2280 |
s4o.print("\n"); |
|
2281 |
break; |
|
2282 |
case init_dt: |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2283 |
if (symbol->retain_option != NULL) |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2284 |
symbol->retain_option->accept(*this); |
184 | 2285 |
s4o.print(s4o.indent_spaces); |
2286 |
symbol->program_type_name->accept(*this); |
|
2287 |
s4o.print(FB_INIT_SUFFIX); |
|
2288 |
s4o.print("(&"); |
|
2289 |
symbol->program_name->accept(*this); |
|
221
c6aed7e5f070
Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents:
217
diff
changeset
|
2290 |
print_retain(); |
184 | 2291 |
s4o.print(");\n"); |
2292 |
break; |
|
2293 |
case run_dt: |
|
2294 |
current_program_name = ((identifier_c*)(symbol->program_name))->value; |
|
2295 |
if (symbol->task_name != NULL) { |
|
2296 |
s4o.print(s4o.indent_spaces); |
|
2297 |
s4o.print("if ("); |
|
2298 |
symbol->task_name->accept(*this); |
|
2299 |
s4o.print(") {\n"); |
|
2300 |
s4o.indent_right(); |
|
2301 |
} |
|
70 | 2302 |
|
184 | 2303 |
wanted_assigntype = assign_at; |
2304 |
if (symbol->prog_conf_elements != NULL) |
|
2305 |
symbol->prog_conf_elements->accept(*this); |
|
2306 |
||
2307 |
s4o.print(s4o.indent_spaces); |
|
2308 |
symbol->program_type_name->accept(*this); |
|
2309 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
2310 |
s4o.print("(&"); |
|
2311 |
symbol->program_name->accept(*this); |
|
2312 |
s4o.print(");\n"); |
|
2313 |
||
2314 |
wanted_assigntype = send_at; |
|
2315 |
if (symbol->prog_conf_elements != NULL) |
|
2316 |
symbol->prog_conf_elements->accept(*this); |
|
2317 |
||
2318 |
if (symbol->task_name != NULL) { |
|
2319 |
s4o.indent_left(); |
|
2320 |
s4o.print(s4o.indent_spaces + "}\n"); |
|
2321 |
} |
|
2322 |
break; |
|
2323 |
default: |
|
2324 |
break; |
|
70 | 2325 |
} |
2326 |
return NULL; |
|
2327 |
} |
|
2328 |
||
2329 |
/* TASK task_name task_initialization */ |
|
2330 |
//SYM_REF2(task_configuration_c, task_name, task_initialization) |
|
2331 |
void *visit(task_configuration_c *symbol) { |
|
184 | 2332 |
current_task_name = symbol->task_name; |
2333 |
switch (wanted_declaretype) { |
|
2334 |
case declare_dt: |
|
2335 |
s4o.print(s4o.indent_spaces + "BOOL "); |
|
2336 |
current_task_name->accept(*this); |
|
2337 |
s4o.print(";\n"); |
|
2338 |
symbol->task_initialization->accept(*this); |
|
2339 |
break; |
|
2340 |
case init_dt: |
|
2341 |
s4o.print(s4o.indent_spaces); |
|
2342 |
current_task_name->accept(*this); |
|
2343 |
s4o.print(" = __BOOL_LITERAL(FALSE);\n"); |
|
2344 |
symbol->task_initialization->accept(*this); |
|
2345 |
break; |
|
2346 |
case run_dt: |
|
2347 |
symbol->task_initialization->accept(*this); |
|
2348 |
break; |
|
2349 |
default: |
|
2350 |
break; |
|
2351 |
} |
|
2352 |
current_task_name = NULL; |
|
70 | 2353 |
return NULL; |
2354 |
} |
|
2355 |
||
2356 |
/* '(' [SINGLE ASSIGN data_source ','] [INTERVAL ASSIGN data_source ','] PRIORITY ASSIGN integer ')' */ |
|
2357 |
//SYM_REF4(task_initialization_c, single_data_source, interval_data_source, priority_data_source, unused) |
|
2358 |
void *visit(task_initialization_c *symbol) { |
|
184 | 2359 |
switch (wanted_declaretype) { |
2360 |
case declare_dt: |
|
2361 |
if (symbol->single_data_source != NULL) { |
|
2362 |
s4o.print(s4o.indent_spaces + "R_TRIG "); |
|
2363 |
current_task_name->accept(*this); |
|
2364 |
s4o.print("_R_TRIG;\n"); |
|
2365 |
} |
|
2366 |
break; |
|
2367 |
case init_dt: |
|
2368 |
if (symbol->single_data_source != NULL) { |
|
2369 |
s4o.print(s4o.indent_spaces + "R_TRIG"); |
|
2370 |
s4o.print(FB_INIT_SUFFIX); |
|
2371 |
s4o.print("(&"); |
|
2372 |
current_task_name->accept(*this); |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2373 |
s4o.print("_R_TRIG, retain);\n"); |
184 | 2374 |
} |
2375 |
break; |
|
2376 |
case run_dt: |
|
2377 |
if (symbol->single_data_source != NULL) { |
|
2378 |
symbol_c *config_var_decl = NULL; |
|
2379 |
symbol_c *res_var_decl = NULL; |
|
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2380 |
s4o.print(s4o.indent_spaces + "{"); |
184 | 2381 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->single_data_source))->global_var_name; |
2382 |
res_var_decl = search_resource_instance->get_decl(current_var_reference); |
|
2383 |
if (res_var_decl == NULL) { |
|
2384 |
config_var_decl = search_config_instance->get_decl(current_var_reference); |
|
2385 |
if (config_var_decl == NULL) |
|
2386 |
ERROR; |
|
2387 |
config_var_decl->accept(*this); |
|
2388 |
} |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2389 |
else { |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2390 |
res_var_decl->accept(*this); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2391 |
} |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2392 |
s4o.print("* "); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2393 |
symbol->single_data_source->accept(*this); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2394 |
s4o.print(" = __GET_GLOBAL_"); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2395 |
symbol->single_data_source->accept(*this); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2396 |
s4o.print("();"); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2397 |
s4o.print(SET_VAR); |
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2398 |
s4o.print("("); |
184 | 2399 |
current_task_name->accept(*this); |
885
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
878
diff
changeset
|
2400 |
s4o.print("_R_TRIG.,CLK,, *"); |
184 | 2401 |
symbol->single_data_source->accept(*this); |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2402 |
s4o.print(");}\n"); |
184 | 2403 |
s4o.print(s4o.indent_spaces + "R_TRIG"); |
2404 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
2405 |
s4o.print("(&"); |
|
2406 |
current_task_name->accept(*this); |
|
2407 |
s4o.print("_R_TRIG);\n"); |
|
2408 |
s4o.print(s4o.indent_spaces); |
|
2409 |
current_task_name->accept(*this); |
|
2410 |
s4o.print(" = "); |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2411 |
s4o.print(GET_VAR); |
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2412 |
s4o.print("("); |
184 | 2413 |
current_task_name->accept(*this); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2414 |
s4o.print("_R_TRIG.Q)"); |
184 | 2415 |
} |
2416 |
else { |
|
2417 |
s4o.print(s4o.indent_spaces); |
|
2418 |
current_task_name->accept(*this); |
|
2419 |
s4o.print(" = "); |
|
2420 |
if (symbol->interval_data_source != NULL) { |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
2421 |
unsigned long long int time = calculate_time(symbol->interval_data_source); |
184 | 2422 |
if (time != 0) { |
2423 |
s4o.print("!(tick % "); |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
2424 |
s4o.print(time / common_ticktime); |
184 | 2425 |
s4o.print(")"); |
2426 |
} |
|
2427 |
else |
|
2428 |
s4o.print("1"); |
|
2429 |
} |
|
2430 |
else |
|
2431 |
s4o.print("1"); |
|
2432 |
} |
|
2433 |
s4o.print(";\n"); |
|
2434 |
break; |
|
2435 |
default: |
|
2436 |
break; |
|
70 | 2437 |
} |
2438 |
return NULL; |
|
2439 |
} |
|
2440 |
||
2441 |
/* any_symbolic_variable ASSIGN prog_data_source */ |
|
2442 |
//SYM_REF2(prog_cnxn_assign_c, symbolic_variable, prog_data_source) |
|
2443 |
void *visit(prog_cnxn_assign_c *symbol) { |
|
2444 |
if (wanted_assigntype == assign_at) { |
|
2445 |
symbol_c *var_decl; |
|
2446 |
unsigned int vartype = 0; |
|
2447 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->prog_data_source))->global_var_name; |
|
2448 |
var_decl = search_resource_instance->get_decl(current_var_reference); |
|
2449 |
if (var_decl == NULL) { |
|
2450 |
var_decl = search_config_instance->get_decl(current_var_reference); |
|
2451 |
if (var_decl == NULL) |
|
2452 |
ERROR; |
|
2453 |
else |
|
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:
397
diff
changeset
|
2454 |
vartype = search_config_instance->get_vartype(current_var_reference); |
70 | 2455 |
} |
2456 |
else |
|
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:
397
diff
changeset
|
2457 |
vartype = search_resource_instance->get_vartype(current_var_reference); |
70 | 2458 |
|
2459 |
s4o.print(s4o.indent_spaces + "{extern "); |
|
2460 |
var_decl->accept(*this); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2461 |
s4o.print(" *"); |
70 | 2462 |
symbol->prog_data_source->accept(*this); |
2463 |
s4o.print("; "); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2464 |
s4o.printupper(current_program_name); |
70 | 2465 |
s4o.print("."); |
2466 |
symbol->symbolic_variable->accept(*this); |
|
2467 |
s4o.print(" = "); |
|
506
2b4e69c7ff8b
Fix typo in comparison expression.
Mario de Sousa <msousa@fe.up.pt>
parents:
498
diff
changeset
|
2468 |
if (vartype == search_var_instance_decl_c::global_vt) |
70 | 2469 |
s4o.print("*"); |
2470 |
symbol->prog_data_source->accept(*this); |
|
2471 |
s4o.print(";}\n"); |
|
2472 |
} |
|
2473 |
return NULL; |
|
2474 |
} |
|
2475 |
||
2476 |
/* any_symbolic_variable SENDTO data_sink */ |
|
2477 |
//SYM_REF2(prog_cnxn_sendto_c, symbolic_variable, data_sink) |
|
2478 |
void *visit(prog_cnxn_sendto_c *symbol) { |
|
2479 |
if (wanted_assigntype == send_at) { |
|
2480 |
symbol_c *var_decl; |
|
2481 |
unsigned int vartype = 0; |
|
2482 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->data_sink))->global_var_name; |
|
2483 |
var_decl = search_resource_instance->get_decl(current_var_reference); |
|
2484 |
if (var_decl == NULL) { |
|
2485 |
var_decl = search_config_instance->get_decl(current_var_reference); |
|
2486 |
if (var_decl == NULL) |
|
2487 |
ERROR; |
|
2488 |
else |
|
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:
397
diff
changeset
|
2489 |
vartype = search_config_instance->get_vartype(current_var_reference); |
70 | 2490 |
} |
2491 |
else |
|
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:
397
diff
changeset
|
2492 |
vartype = search_resource_instance->get_vartype(current_var_reference); |
70 | 2493 |
|
2494 |
s4o.print(s4o.indent_spaces + "{extern "); |
|
2495 |
var_decl->accept(*this); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2496 |
s4o.print(" *"); |
70 | 2497 |
symbol->data_sink->accept(*this); |
2498 |
s4o.print("; "); |
|
506
2b4e69c7ff8b
Fix typo in comparison expression.
Mario de Sousa <msousa@fe.up.pt>
parents:
498
diff
changeset
|
2499 |
if (vartype == search_var_instance_decl_c::global_vt) |
70 | 2500 |
s4o.print("*"); |
2501 |
symbol->data_sink->accept(*this); |
|
2502 |
s4o.print(" = "); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2503 |
s4o.printupper(current_program_name); |
70 | 2504 |
s4o.print("."); |
2505 |
symbol->symbolic_variable->accept(*this); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2506 |
s4o.print(";};\n"); |
70 | 2507 |
} |
2508 |
return NULL; |
|
2509 |
} |
|
2510 |
||
2511 |
}; |
|
2512 |
||
2513 |
/***********************************************************************/ |
|
2514 |
/***********************************************************************/ |
|
2515 |
/***********************************************************************/ |
|
2516 |
/***********************************************************************/ |
|
2517 |
/***********************************************************************/ |
|
2518 |
/***********************************************************************/ |
|
2519 |
/***********************************************************************/ |
|
2520 |
/***********************************************************************/ |
|
2521 |
||
2522 |
class generate_c_c: public iterator_visitor_c { |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2523 |
public: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2524 |
typedef enum { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2525 |
none_gm, |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2526 |
datatypes_gm, |
661
f537c3315f83
Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents:
624
diff
changeset
|
2527 |
pous_gm |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2528 |
} generate_mode_t; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2529 |
|
70 | 2530 |
protected: |
2531 |
stage4out_c &s4o; |
|
2532 |
stage4out_c pous_s4o; |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2533 |
stage4out_c pous_incl_s4o; |
70 | 2534 |
stage4out_c located_variables_s4o; |
111 | 2535 |
stage4out_c variables_s4o; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2536 |
generate_c_datatypes_c generate_c_datatypes; |
70 | 2537 |
generate_c_pous_c generate_c_pous; |
111 | 2538 |
|
70 | 2539 |
symbol_c *current_configuration; |
2540 |
||
2541 |
const char *current_name; |
|
2542 |
const char *current_builddir; |
|
2543 |
||
237 | 2544 |
unsigned long long common_ticktime; |
70 | 2545 |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2546 |
generate_mode_t current_mode; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2547 |
|
70 | 2548 |
public: |
2549 |
generate_c_c(stage4out_c *s4o_ptr, const char *builddir): |
|
2550 |
s4o(*s4o_ptr), |
|
2551 |
pous_s4o(builddir, "POUS", "c"), |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2552 |
pous_incl_s4o(builddir, "POUS", "h"), |
70 | 2553 |
located_variables_s4o(builddir, "LOCATED_VARIABLES","h"), |
112 | 2554 |
variables_s4o(builddir, "VARIABLES","csv"), |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2555 |
generate_c_datatypes(&pous_s4o, &pous_incl_s4o), |
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2556 |
generate_c_pous(&pous_s4o, &pous_incl_s4o) { |
70 | 2557 |
current_builddir = builddir; |
2558 |
current_configuration = NULL; |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2559 |
current_mode = none_gm; |
70 | 2560 |
} |
2561 |
||
2562 |
~generate_c_c(void) {} |
|
2563 |
||
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2564 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2565 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2566 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2567 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2568 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2569 |
void *visit(enable_code_generation_pragma_c * symbol) { |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2570 |
s4o .enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2571 |
pous_s4o .enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2572 |
pous_incl_s4o .enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2573 |
located_variables_s4o.enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2574 |
variables_s4o .enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2575 |
return NULL; |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2576 |
} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2577 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2578 |
void *visit(disable_code_generation_pragma_c * symbol) { |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2579 |
s4o .disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2580 |
pous_s4o .disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2581 |
pous_incl_s4o .disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2582 |
located_variables_s4o.disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2583 |
variables_s4o .disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2584 |
return NULL; |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2585 |
} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2586 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2587 |
|
70 | 2588 |
/***************************/ |
2589 |
/* B 0 - Programming Model */ |
|
2590 |
/***************************/ |
|
2591 |
void *visit(library_c *symbol) { |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
2592 |
pous_incl_s4o.print("#ifndef __POUS_H\n#define __POUS_H\n\n#include \"accessor.h\"\n\n"); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2593 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2594 |
current_mode = datatypes_gm; |
70 | 2595 |
for(int i = 0; i < symbol->n; i++) { |
2596 |
symbol->elements[i]->accept(*this); |
|
2597 |
} |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2598 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2599 |
current_mode = pous_gm; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2600 |
for(int i = 0; i < symbol->n; i++) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2601 |
symbol->elements[i]->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2602 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2603 |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2604 |
pous_incl_s4o.print("#endif //__POUS_H\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2605 |
|
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2606 |
generate_var_list_c generate_var_list(&variables_s4o, symbol); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2607 |
generate_var_list.generate_programs(symbol); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2608 |
generate_var_list.generate_variables(symbol); |
397
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2609 |
variables_s4o.print("\n// Ticktime\n"); |
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2610 |
variables_s4o.print_long_long_integer(common_ticktime, false); |
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2611 |
variables_s4o.print("\n"); |
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2612 |
|
98 | 2613 |
generate_location_list_c generate_location_list(&located_variables_s4o); |
2614 |
symbol->accept(generate_location_list); |
|
70 | 2615 |
return NULL; |
2616 |
} |
|
2617 |
||
2618 |
/*************************/ |
|
2619 |
/* B.1 - Common elements */ |
|
2620 |
/*************************/ |
|
2621 |
/*******************************************/ |
|
2622 |
/* B 1.1 - Letters, digits and identifiers */ |
|
2623 |
/*******************************************/ |
|
2624 |
void *visit(identifier_c *symbol) { |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2625 |
current_name = symbol->value; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2626 |
return NULL; |
70 | 2627 |
} |
2628 |
||
98 | 2629 |
/********************************/ |
2630 |
/* B 1.3.3 - Derived data types */ |
|
2631 |
/********************************/ |
|
2632 |
/* TYPE type_declaration_list END_TYPE */ |
|
2633 |
void *visit(data_type_declaration_c *symbol) { |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2634 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2635 |
case datatypes_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2636 |
symbol->accept(generate_c_datatypes); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2637 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2638 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2639 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2640 |
} |
98 | 2641 |
return NULL; |
2642 |
} |
|
2643 |
||
70 | 2644 |
/**************************************/ |
2645 |
/* B.1.5 - Program organization units */ |
|
2646 |
/**************************************/ |
|
2647 |
/***********************/ |
|
2648 |
/* B 1.5.1 - Functions */ |
|
2649 |
/***********************/ |
|
2650 |
void *visit(function_declaration_c *symbol) { |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2651 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2652 |
case datatypes_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2653 |
symbol->var_declarations_list->accept(generate_c_datatypes); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2654 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2655 |
case pous_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2656 |
symbol->accept(generate_c_pous); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2657 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2658 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2659 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2660 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2661 |
return NULL; |
70 | 2662 |
} |
2663 |
||
2664 |
/*****************************/ |
|
2665 |
/* B 1.5.2 - Function Blocks */ |
|
2666 |
/*****************************/ |
|
2667 |
void *visit(function_block_declaration_c *symbol) { |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2668 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2669 |
case datatypes_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2670 |
symbol->var_declarations->accept(generate_c_datatypes); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2671 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2672 |
case pous_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2673 |
symbol->accept(generate_c_pous); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2674 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2675 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2676 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2677 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2678 |
return NULL; |
70 | 2679 |
} |
2680 |
||
2681 |
/**********************/ |
|
2682 |
/* B 1.5.3 - Programs */ |
|
2683 |
/**********************/ |
|
2684 |
void *visit(program_declaration_c *symbol) { |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2685 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2686 |
case datatypes_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2687 |
symbol->var_declarations->accept(generate_c_datatypes); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2688 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2689 |
case pous_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2690 |
symbol->accept(generate_c_pous); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2691 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2692 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2693 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2694 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2695 |
return NULL; |
70 | 2696 |
} |
2697 |
||
2698 |
||
2699 |
/********************************/ |
|
2700 |
/* B 1.7 Configuration elements */ |
|
2701 |
/********************************/ |
|
2702 |
void *visit(configuration_declaration_c *symbol) { |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2703 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2704 |
case datatypes_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2705 |
if (symbol->global_var_declarations != NULL) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2706 |
symbol->global_var_declarations->accept(generate_c_datatypes); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2707 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2708 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2709 |
case pous_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2710 |
static int configuration_count = 0; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2711 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2712 |
if (configuration_count++) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2713 |
/* the first configuration is the one we will use!! */ |
522
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
2714 |
STAGE4_ERROR(symbol, symbol, "A previous CONFIGURATION has already been declared (C code generation currently only allows a single configuration)."); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2715 |
ERROR; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2716 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2717 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2718 |
current_configuration = symbol; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2719 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2720 |
{ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2721 |
calculate_common_ticktime_c calculate_common_ticktime; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2722 |
symbol->accept(calculate_common_ticktime); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2723 |
common_ticktime = calculate_common_ticktime.get_common_ticktime(); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2724 |
if (common_ticktime == 0) { |
522
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
2725 |
STAGE4_ERROR(symbol, symbol, "You must define at least one periodic task (to set cycle period)!"); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2726 |
ERROR; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2727 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2728 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2729 |
symbol->configuration_name->accept(*this); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2730 |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2731 |
stage4out_c config_s4o(current_builddir, current_name, "c"); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2732 |
stage4out_c config_incl_s4o(current_builddir, current_name, "h"); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
2733 |
generate_c_config_c generate_c_config(&config_s4o, &config_incl_s4o); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2734 |
symbol->accept(generate_c_config); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2735 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2736 |
config_s4o.print("unsigned long long common_ticktime__ = "); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2737 |
config_s4o.print_long_long_integer(common_ticktime); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2738 |
config_s4o.print("; /*ns*/\n"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2739 |
config_s4o.print("unsigned long greatest_tick_count__ = "); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2740 |
config_s4o.print_long_integer(calculate_common_ticktime.get_greatest_tick_count()); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2741 |
config_s4o.print("; /*tick*/\n"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2742 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2743 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2744 |
symbol->resource_declarations->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2745 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2746 |
current_configuration = NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2747 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2748 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2749 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2750 |
break; |
70 | 2751 |
} |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2752 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2753 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2754 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2755 |
void *visit(resource_declaration_c *symbol) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2756 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2757 |
case datatypes_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2758 |
if (symbol->global_var_declarations != NULL) |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2759 |
symbol->global_var_declarations->accept(generate_c_datatypes); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2760 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2761 |
case pous_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2762 |
symbol->resource_name->accept(*this); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2763 |
{ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2764 |
stage4out_c resources_s4o(current_builddir, current_name, "c"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2765 |
generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2766 |
symbol->accept(generate_c_resources); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2767 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2768 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2769 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2770 |
break; |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2771 |
} |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2772 |
return NULL; |
70 | 2773 |
} |
2774 |
||
2775 |
void *visit(single_resource_declaration_c *symbol) { |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2776 |
switch (current_mode) { |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2777 |
case pous_gm: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2778 |
{ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2779 |
stage4out_c resources_s4o(current_builddir, "RESOURCE", "c"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2780 |
generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2781 |
symbol->accept(generate_c_resources); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2782 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2783 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2784 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2785 |
break; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2786 |
} |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2787 |
return NULL; |
70 | 2788 |
} |
2789 |
||
2790 |
}; |
|
2791 |
||
2792 |
/***********************************************************************/ |
|
2793 |
/***********************************************************************/ |
|
2794 |
/***********************************************************************/ |
|
2795 |
/***********************************************************************/ |
|
2796 |
/***********************************************************************/ |
|
2797 |
/***********************************************************************/ |
|
2798 |
/***********************************************************************/ |
|
2799 |
/***********************************************************************/ |
|
2800 |
||
2801 |
||
2802 |
||
2803 |
||
2804 |
visitor_c *new_code_generator(stage4out_c *s4o, const char *builddir) {return new generate_c_c(s4o, builddir);} |
|
2805 |
void delete_code_generator(visitor_c *code_generator) {delete code_generator;} |
|
2806 |
||
2807 |