stage4/generate_c/generate_c.cc
changeset 1016 91bef6704b44
parent 1011 76175defb87b
child 1021 21a97cdb317d
equal deleted inserted replaced
1015:9414b0785849 1016:91bef6704b44
   857       vardecl->print(symbol->var_declarations_list);
   857       vardecl->print(symbol->var_declarations_list);
   858       delete vardecl;
   858       delete vardecl;
   859     
   859     
   860       /* (B.2) Temporary variable for function's return value */
   860       /* (B.2) Temporary variable for function's return value */
   861       /* It will have the same name as the function itself! */
   861       /* It will have the same name as the function itself! */
   862       s4o.print(s4o.indent_spaces);
   862       /* NOTE: matiec supports a non-standard syntax, in which functions do not return a value
   863       symbol->type_name->accept(print_base); /* return type */
   863        *       (declared as returning the special non-standard datatype VOID)
   864       s4o.print(" ");
   864        *       e.g.:   FUNCTION foo: VOID
   865       symbol->derived_function_name->accept(print_base);
   865        *                ...
   866       s4o.print(" = ");
   866        *               END_FUNCTION
   867       {
   867        *       
   868         /* get the default value of this variable's type */
   868        *       These functions cannot return any value, so they do not need a variable to
   869         symbol_c *default_value = type_initial_value_c::get(symbol->type_name);
   869        *       store the return value.
   870         if (default_value == NULL) ERROR;
   870        *       Note that any attemot to sto a value in the implicit variable
   871         initialization_analyzer_c initialization_analyzer(default_value);
   871        *       e.g.:   FUNCTION foo: VOID
   872         switch (initialization_analyzer.get_initialization_type()) {
   872        *                ...
   873           case initialization_analyzer_c::struct_it:
   873        *                 foo := 42;
   874             {
   874        *               END_FUNCTION
   875               generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
   875        *       will always return a datatype incompatilibiyt error in stage 3 of matiec, 
   876               structure_initialization->init_structure_default(symbol->type_name);
   876        *       so it is safe for stage 4 to assume that this return variable will never be needed
   877               structure_initialization->init_structure_values(default_value);
   877        *       if the function's return type is VOID.
   878               delete structure_initialization;
   878        */
   879             }
   879       if (!get_datatype_info_c::is_VOID(symbol->type_name->datatype)) { // only print return variable if return datatype is not VOID
   880             break;
   880         s4o.print(s4o.indent_spaces);
   881           case initialization_analyzer_c::array_it:
   881         symbol->type_name->accept(print_base); /* return type */
   882             {
   882         s4o.print(" ");
   883               generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
   883         symbol->derived_function_name->accept(print_base);
   884               array_initialization->init_array_size(symbol->type_name);
   884         s4o.print(" = ");
   885               array_initialization->init_array_values(default_value);
   885         {
   886               delete array_initialization;
   886           /* get the default value of this variable's type */
   887             }
   887           symbol_c *default_value = type_initial_value_c::get(symbol->type_name);
   888             break;
   888           if (default_value == NULL) ERROR;
   889           default:
   889           initialization_analyzer_c initialization_analyzer(default_value);
   890             default_value->accept(print_base);
   890           switch (initialization_analyzer.get_initialization_type()) {
   891             break;
   891             case initialization_analyzer_c::struct_it:
       
   892               {
       
   893                 generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
       
   894                 structure_initialization->init_structure_default(symbol->type_name);
       
   895                 structure_initialization->init_structure_values(default_value);
       
   896                 delete structure_initialization;
       
   897               }
       
   898               break;
       
   899             case initialization_analyzer_c::array_it:
       
   900               {
       
   901                 generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
       
   902                 array_initialization->init_array_size(symbol->type_name);
       
   903                 array_initialization->init_array_values(default_value);
       
   904                 delete array_initialization;
       
   905               }
       
   906               break;
       
   907             default:
       
   908               default_value->accept(print_base);
       
   909               break;
       
   910           }
   892         }
   911         }
   893       }
   912       }
   894       s4o.print(";\n\n");
   913       s4o.print(";\n\n");
   895       
   914       
   896       
   915       
   907         s4o.print(s4o.indent_spaces + "if (__ENO != NULL) {\n");
   926         s4o.print(s4o.indent_spaces + "if (__ENO != NULL) {\n");
   908         s4o.indent_right();
   927         s4o.indent_right();
   909         s4o.print(s4o.indent_spaces + "*__ENO = __BOOL_LITERAL(FALSE);\n");
   928         s4o.print(s4o.indent_spaces + "*__ENO = __BOOL_LITERAL(FALSE);\n");
   910         s4o.indent_left();
   929         s4o.indent_left();
   911         s4o.print(s4o.indent_spaces + "}\n");
   930         s4o.print(s4o.indent_spaces + "}\n");
   912         s4o.print(s4o.indent_spaces + "return ");
   931         if (!get_datatype_info_c::is_VOID(symbol->type_name->datatype)) { // only print return variable if return datatype is not VOID
   913         symbol->derived_function_name->accept(print_base);
   932           s4o.print(s4o.indent_spaces + "return ");
   914         s4o.print(";\n");
   933           symbol->derived_function_name->accept(print_base);
       
   934           s4o.print(";\n");
       
   935         }
   915         s4o.indent_left();
   936         s4o.indent_left();
   916         s4o.print(s4o.indent_spaces + "}\n");
   937         s4o.print(s4o.indent_spaces + "}\n");
   917       }
   938       }
   918     
   939     
   919       /* (C) Function body */
   940       /* (C) Function body */
   928                     generate_c_vardecl_c::inoutput_vt |
   949                     generate_c_vardecl_c::inoutput_vt |
   929                     generate_c_vardecl_c::eno_vt);
   950                     generate_c_vardecl_c::eno_vt);
   930       vardecl->print(symbol->var_declarations_list);
   951       vardecl->print(symbol->var_declarations_list);
   931       delete vardecl;
   952       delete vardecl;
   932       
   953       
   933       s4o.print(s4o.indent_spaces + "return ");
   954       if (!get_datatype_info_c::is_VOID(symbol->type_name->datatype)) { // only print 'return <fname>' if return datatype is not VOID
   934       symbol->derived_function_name->accept(print_base);
   955         s4o.print(s4o.indent_spaces + "return ");
   935       s4o.print(";\n");
   956         symbol->derived_function_name->accept(print_base);
       
   957         s4o.print(";\n");
       
   958       }
       
   959 
   936       s4o.indent_left();
   960       s4o.indent_left();
   937       s4o.print(s4o.indent_spaces + "}\n\n\n");
   961       s4o.print(s4o.indent_spaces + "}\n\n\n");
   938     
   962     
   939       return;
   963       return;
   940     }
   964     }