77 protected: |
77 protected: |
78 /********************************/ |
78 /********************************/ |
79 /* B 1.3.3 - Derived data types */ |
79 /* B 1.3.3 - Derived data types */ |
80 /********************************/ |
80 /********************************/ |
81 /* simple_type_name ':' simple_spec_init */ |
81 /* simple_type_name ':' simple_spec_init */ |
82 void *visit(simple_type_declaration_c *symbol) {return symbol->simple_type_name;} |
82 void *visit(simple_type_declaration_c *symbol) {return symbol->simple_type_name;} |
83 /* subrange_type_name ':' subrange_spec_init */ |
83 /* subrange_type_name ':' subrange_spec_init */ |
84 void *visit(subrange_type_declaration_c *symbol) {return symbol->subrange_type_name;} |
84 void *visit(subrange_type_declaration_c *symbol) {return symbol->subrange_type_name;} |
85 /* enumerated_type_name ':' enumerated_spec_init */ |
85 /* enumerated_type_name ':' enumerated_spec_init */ |
86 void *visit(enumerated_type_declaration_c *symbol) {return symbol->enumerated_type_name;} |
86 void *visit(enumerated_type_declaration_c *symbol) {return symbol->enumerated_type_name;} |
87 /* identifier ':' array_spec_init */ |
87 /* identifier ':' array_spec_init */ |
88 void *visit(array_type_declaration_c *symbol) {return symbol->identifier;} |
88 void *visit(array_type_declaration_c *symbol) {return symbol->identifier;} |
89 /* structure_type_name ':' structure_specification */ |
89 /* structure_type_name ':' structure_specification */ |
90 void *visit(structure_type_declaration_c *symbol) {return symbol->structure_type_name;} |
90 void *visit(structure_type_declaration_c *symbol) {return symbol->structure_type_name;} |
91 /* string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */ |
91 /* string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */ |
92 void *visit(string_type_declaration_c *symbol) {return symbol->string_type_name;} |
92 void *visit(string_type_declaration_c *symbol) {return symbol->string_type_name;} |
|
93 /* ref_type_decl: identifier ':' ref_spec_init */ |
|
94 void *visit(ref_type_decl_c *symbol) {return symbol->ref_type_name;} |
93 |
95 |
94 /*****************************/ |
96 /*****************************/ |
95 /* B 1.5.2 - Function Blocks */ |
97 /* B 1.5.2 - Function Blocks */ |
96 /*****************************/ |
98 /*****************************/ |
97 /* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ |
99 /* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ |
98 void *visit(function_block_declaration_c *symbol) {return symbol->fblock_name;} |
100 void *visit(function_block_declaration_c *symbol) {return symbol->fblock_name;} |
99 }; // get_datatype_id_c |
101 }; // get_datatype_id_c |
100 |
102 |
101 get_datatype_id_c *get_datatype_id_c::singleton = NULL; |
103 get_datatype_id_c *get_datatype_id_c::singleton = NULL; |
102 |
104 |
103 |
105 |
187 |
189 |
188 /********************************/ |
190 /********************************/ |
189 /* B 1.3.3 - Derived data types */ |
191 /* B 1.3.3 - Derived data types */ |
190 /********************************/ |
192 /********************************/ |
191 /* simple_type_name ':' simple_spec_init */ |
193 /* simple_type_name ':' simple_spec_init */ |
192 void *visit(simple_type_declaration_c *symbol) {return symbol->simple_type_name->accept(*this);} |
194 void *visit(simple_type_declaration_c *symbol) {return symbol->simple_type_name->accept(*this);} |
193 /* subrange_type_name ':' subrange_spec_init */ |
195 /* subrange_type_name ':' subrange_spec_init */ |
194 void *visit(subrange_type_declaration_c *symbol) {return symbol->subrange_type_name->accept(*this);} |
196 void *visit(subrange_type_declaration_c *symbol) {return symbol->subrange_type_name->accept(*this);} |
195 /* enumerated_type_name ':' enumerated_spec_init */ |
197 /* enumerated_type_name ':' enumerated_spec_init */ |
196 void *visit(enumerated_type_declaration_c *symbol) {return symbol->enumerated_type_name->accept(*this);} |
198 void *visit(enumerated_type_declaration_c *symbol) {return symbol->enumerated_type_name->accept(*this);} |
197 /* identifier ':' array_spec_init */ |
199 /* identifier ':' array_spec_init */ |
198 void *visit(array_type_declaration_c *symbol) {return symbol->identifier->accept(*this);} |
200 void *visit(array_type_declaration_c *symbol) {return symbol->identifier->accept(*this);} |
199 /* structure_type_name ':' structure_specification */ |
201 /* structure_type_name ':' structure_specification */ |
200 void *visit(structure_type_declaration_c *symbol) {return symbol->structure_type_name->accept(*this);} |
202 void *visit(structure_type_declaration_c *symbol) {return symbol->structure_type_name->accept(*this);} |
201 /* string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */ |
203 /* string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */ |
202 void *visit(string_type_declaration_c *symbol) {return symbol->string_type_name->accept(*this);} |
204 void *visit(string_type_declaration_c *symbol) {return symbol->string_type_name->accept(*this);} |
|
205 /* ref_type_decl: identifier ':' ref_spec_init */ |
|
206 void *visit(ref_type_decl_c *symbol) {return symbol->ref_type_name->accept(*this);} |
203 |
207 |
204 /*****************************/ |
208 /*****************************/ |
205 /* B 1.5.2 - Function Blocks */ |
209 /* B 1.5.2 - Function Blocks */ |
206 /*****************************/ |
210 /*****************************/ |
207 /* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ |
211 /* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ |
208 void *visit(function_block_declaration_c *symbol) {return symbol->fblock_name->accept(*this);} |
212 void *visit(function_block_declaration_c *symbol) {return symbol->fblock_name->accept(*this);} |
209 }; |
213 }; |
210 |
214 |
211 get_datatype_id_str_c *get_datatype_id_str_c::singleton = NULL; |
215 get_datatype_id_str_c *get_datatype_id_str_c::singleton = NULL; |
212 |
216 |
213 |
217 |
237 bool get_datatype_info_c::is_type_equal(symbol_c *first_type, symbol_c *second_type) { |
241 bool get_datatype_info_c::is_type_equal(symbol_c *first_type, symbol_c *second_type) { |
238 if ((NULL == first_type) || (NULL == second_type)) {return false;} |
242 if ((NULL == first_type) || (NULL == second_type)) {return false;} |
239 if (typeid(* first_type) == typeid(invalid_type_name_c)) {return false;} |
243 if (typeid(* first_type) == typeid(invalid_type_name_c)) {return false;} |
240 if (typeid(*second_type) == typeid(invalid_type_name_c)) {return false;} |
244 if (typeid(*second_type) == typeid(invalid_type_name_c)) {return false;} |
241 |
245 |
242 if ((get_datatype_info_c::is_ANY_ELEMENTARY(first_type)) && |
246 /* ANY_ELEMENTARY */ |
|
247 if ((is_ANY_ELEMENTARY(first_type)) && |
243 (typeid(*first_type) == typeid(*second_type))) {return true;} |
248 (typeid(*first_type) == typeid(*second_type))) {return true;} |
|
249 |
244 /* ANY_DERIVED */ |
250 /* ANY_DERIVED */ |
|
251 if (is_ref_to(first_type) && is_ref_to(second_type)) |
|
252 return is_type_equal(search_base_type_c::get_basetype_decl(get_ref_to(first_type )), |
|
253 search_base_type_c::get_basetype_decl(get_ref_to(second_type))); |
|
254 |
245 return (first_type == second_type); |
255 return (first_type == second_type); |
246 } |
256 } |
247 |
257 |
248 |
258 |
249 |
259 |
256 |
266 |
257 |
267 |
258 |
268 |
259 |
269 |
260 |
270 |
|
271 |
|
272 /* returns the datatype the REF_TO datatype references/points to... */ |
|
273 symbol_c *get_datatype_info_c::get_ref_to(symbol_c *type_symbol) { |
|
274 ref_type_decl_c *type1 = dynamic_cast<ref_type_decl_c *>(type_symbol); |
|
275 if (NULL != type1) type_symbol = type1->ref_spec_init; |
|
276 |
|
277 ref_spec_init_c *type2 = dynamic_cast<ref_spec_init_c *>(type_symbol); |
|
278 if (NULL != type2) type_symbol = type2->ref_spec; |
|
279 |
|
280 ref_spec_c *type3 = dynamic_cast<ref_spec_c *>(type_symbol); |
|
281 if (NULL != type3) return type3->type_name; |
|
282 |
|
283 return NULL; /* this is not a ref datatype!! */ |
|
284 } |
|
285 |
|
286 |
|
287 |
|
288 |
|
289 |
|
290 |
|
291 bool get_datatype_info_c::is_ref_to(symbol_c *type_symbol) { |
|
292 symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); |
|
293 if (NULL == type_decl) {return false;} |
|
294 |
|
295 if (typeid(*type_decl) == typeid(ref_type_decl_c)) {return true;} /* identifier ':' ref_spec_init */ |
|
296 if (typeid(*type_decl) == typeid(ref_spec_init_c)) {return true;} /* ref_spec [ ASSIGN ref_initialization ]; */ |
|
297 if (typeid(*type_decl) == typeid(ref_spec_c)) {return true;} /* REF_TO (non_generic_type_name | function_block_type_name) */ |
|
298 return false; |
|
299 } |
|
300 |
|
301 |
|
302 |
|
303 |
261 bool get_datatype_info_c::is_sfc_initstep(symbol_c *type_symbol) { |
304 bool get_datatype_info_c::is_sfc_initstep(symbol_c *type_symbol) { |
262 symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); |
305 symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); |
263 if (NULL == type_decl) {return false;} |
306 if (NULL == type_decl) {return false;} |
264 if (typeid(*type_decl) == typeid(initial_step_c)) {return true;} /* INITIAL_STEP step_name ':' action_association_list END_STEP */ /* A pseudo data type! */ |
307 if (typeid(*type_decl) == typeid(initial_step_c)) {return true;} /* INITIAL_STEP step_name ':' action_association_list END_STEP */ /* A pseudo data type! */ |
265 return false; |
308 return false; |
266 } |
309 } |
267 |
|
268 |
|
269 |
310 |
270 |
311 |
271 |
312 |
272 bool get_datatype_info_c::is_sfc_step(symbol_c *type_symbol) { |
313 bool get_datatype_info_c::is_sfc_step(symbol_c *type_symbol) { |
273 symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); |
314 symbol_c *type_decl = search_base_type_c::get_basetype_decl(type_symbol); |