293 |
293 |
294 search_varfb_instance_type_c *search_varfb_instance_type; |
294 search_varfb_instance_type_c *search_varfb_instance_type; |
295 |
295 |
296 search_base_type_c search_base_type; |
296 search_base_type_c search_base_type; |
297 |
297 |
|
298 bool current_param_is_pointer; |
|
299 |
298 public: |
300 public: |
299 generate_c_il_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) |
301 generate_c_il_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) |
300 : generate_c_typedecl_c(s4o_ptr), |
302 : generate_c_typedecl_c(s4o_ptr), |
301 default_variable_name(IL_DEFVAR, NULL), |
303 default_variable_name(IL_DEFVAR, NULL), |
302 default_variable_back_name(IL_DEFVAR_BACK, NULL) |
304 default_variable_back_name(IL_DEFVAR_BACK, NULL) |
306 search_fb_instance_decl = new search_fb_instance_decl_c(scope); |
308 search_fb_instance_decl = new search_fb_instance_decl_c(scope); |
307 search_varfb_instance_type = new search_varfb_instance_type_c(scope); |
309 search_varfb_instance_type = new search_varfb_instance_type_c(scope); |
308 current_operand = NULL; |
310 current_operand = NULL; |
309 current_operand_type = NULL; |
311 current_operand_type = NULL; |
310 il_default_variable_init_value = NULL; |
312 il_default_variable_init_value = NULL; |
|
313 current_param_is_pointer = false; |
311 this->set_variable_prefix(variable_prefix); |
314 this->set_variable_prefix(variable_prefix); |
312 } |
315 } |
313 |
316 |
314 virtual ~generate_c_il_c(void) { |
317 virtual ~generate_c_il_c(void) { |
315 delete search_fb_instance_decl; |
318 delete search_fb_instance_decl; |
456 } |
459 } |
457 |
460 |
458 |
461 |
459 private: |
462 private: |
460 |
463 |
|
464 void *visit(eno_param_c *symbol) { |
|
465 if (this->is_variable_prefix_null()) { |
|
466 s4o.print("*"); |
|
467 } |
|
468 else { |
|
469 this->print_variable_prefix(); |
|
470 } |
|
471 s4o.print("ENO"); |
|
472 return NULL; |
|
473 } |
|
474 |
|
475 /*********************/ |
|
476 /* B 1.4 - Variables */ |
|
477 /*********************/ |
|
478 void *visit(symbolic_variable_c *symbol) { |
|
479 unsigned int vartype = search_varfb_instance_type->get_vartype(symbol); |
|
480 if (!current_param_is_pointer && (vartype == search_var_instance_decl_c::external_vt || vartype == search_var_instance_decl_c::located_vt)) { |
|
481 s4o.print("*("); |
|
482 generate_c_base_c::visit(symbol); |
|
483 s4o.print(")"); |
|
484 } |
|
485 else if (current_param_is_pointer && vartype != search_var_instance_decl_c::external_vt && vartype != search_var_instance_decl_c::located_vt) { |
|
486 s4o.print("&("); |
|
487 generate_c_base_c::visit(symbol); |
|
488 s4o.print(")"); |
|
489 } |
|
490 else { |
|
491 generate_c_base_c::visit(symbol); |
|
492 } |
|
493 return NULL; |
|
494 } |
|
495 |
461 /********************************************/ |
496 /********************************************/ |
462 /* B.1.4.1 Directly Represented Variables */ |
497 /* B.1.4.1 Directly Represented Variables */ |
463 /********************************************/ |
498 /********************************************/ |
464 // direct_variable: direct_variable_token {$$ = new direct_variable_c($1);}; |
499 // direct_variable: direct_variable_token {$$ = new direct_variable_c($1);}; |
465 void *visit(direct_variable_c *symbol) { |
500 void *visit(direct_variable_c *symbol) { |
466 TRACE("direct_variable_c"); |
501 TRACE("direct_variable_c"); |
467 /* Do not use print_token() as it will change everything into uppercase */ |
502 /* Do not use print_token() as it will change everything into uppercase */ |
468 if (strlen(symbol->value) == 0) ERROR; |
503 if (strlen(symbol->value) == 0) ERROR; |
469 s4o.print("*("); |
504 if (!current_param_is_pointer) { |
|
505 s4o.print("*("); |
|
506 } |
470 this->print_variable_prefix(); |
507 this->print_variable_prefix(); |
471 s4o.printlocation(symbol->value + 1); |
508 s4o.printlocation(symbol->value + 1); |
472 s4o.print(")"); |
509 if (!current_param_is_pointer) { |
|
510 s4o.print(")"); |
|
511 } |
473 return NULL; |
512 return NULL; |
474 } |
513 } |
475 |
514 |
476 /****************************************/ |
515 /****************************************/ |
477 /* B.2 - Language IL (Instruction List) */ |
516 /* B.2 - Language IL (Instruction List) */ |
581 |
620 |
582 int nb_param = 1; |
621 int nb_param = 1; |
583 if (symbol->il_operand_list != NULL) |
622 if (symbol->il_operand_list != NULL) |
584 nb_param += ((list_c *)symbol->il_operand_list)->n; |
623 nb_param += ((list_c *)symbol->il_operand_list)->n; |
585 |
624 |
586 #include "il_code_gen.c" |
625 #include "il_code_gen.c" |
587 |
|
588 #if 0 |
|
589 for(int current_param = 0; current_param < nb_param; current_param++) { |
|
590 symbol_c *param_value; |
|
591 if (current_param == 0) |
|
592 param_value = &this->default_variable_name; |
|
593 else { |
|
594 symbol_c *param_name = NULL; |
|
595 switch (current_function_type) { |
|
596 default: ERROR; |
|
597 } |
|
598 |
|
599 |
|
600 /* Get the value from a foo(<param_name> = <param_value>) style call */ |
|
601 param_value = function_call_param_iterator.search(param_name); |
|
602 delete param_name; |
|
603 |
|
604 /* Get the value from a foo(<param_value>) style call */ |
|
605 if (param_value == NULL) |
|
606 param_value = function_call_param_iterator.next(); |
|
607 |
|
608 if (param_value == NULL) ERROR; |
|
609 } |
|
610 |
|
611 switch (current_function_type) { |
|
612 case (function_sqrt): |
|
613 if (current_param == 0) { |
|
614 s4o.print("sqrt("); |
|
615 param_value->accept(*this); |
|
616 s4o.print(")"); |
|
617 } |
|
618 else ERROR; |
|
619 break; |
|
620 default: ERROR; |
|
621 } |
|
622 } /* for(...) */ |
|
623 #endif |
|
624 |
626 |
625 /* the data type returned by the function, and stored in the il default variable... */ |
627 /* the data type returned by the function, and stored in the il default variable... */ |
626 default_variable_name.current_type = return_data_type; |
628 default_variable_name.current_type = return_data_type; |
627 } |
629 } |
628 else { |
630 else { |
694 if (param_value == NULL) ERROR; |
696 if (param_value == NULL) ERROR; |
695 param_value->accept(*this); |
697 param_value->accept(*this); |
696 break; |
698 break; |
697 case function_param_iterator_c::direction_out: |
699 case function_param_iterator_c::direction_out: |
698 case function_param_iterator_c::direction_inout: |
700 case function_param_iterator_c::direction_inout: |
|
701 current_param_is_pointer = true; |
699 if (param_value == NULL) { |
702 if (param_value == NULL) { |
700 /* no parameter value given, so we pass a previously declared temporary variable. */ |
703 s4o.print("NULL"); |
701 std::string *temp_var_name = temp_var_name_factory.new_name(); |
|
702 s4o.print(*temp_var_name); |
|
703 delete temp_var_name; |
|
704 } else { |
704 } else { |
705 param_value->accept(*this); |
705 param_value->accept(*this); |
706 } |
706 } |
|
707 current_param_is_pointer = false; |
707 break; |
708 break; |
708 case function_param_iterator_c::direction_extref: |
709 case function_param_iterator_c::direction_extref: |
709 /* TODO! */ |
710 /* TODO! */ |
710 ERROR; |
711 ERROR; |
711 break; |
712 break; |