stage4/generate_c/generate_c_typedecl.cc
changeset 160 59d58f5e6caa
parent 139 668a54686827
child 164 a0679c78143a
equal deleted inserted replaced
159:1e4eb0d48385 160:59d58f5e6caa
   201   current_basetypedeclaration = subrangebasetype_bd;
   201   current_basetypedeclaration = subrangebasetype_bd;
   202   symbol->subrange_spec_init->accept(*this);
   202   symbol->subrange_spec_init->accept(*this);
   203   current_basetypedeclaration = none_bd;
   203   current_basetypedeclaration = none_bd;
   204   s4o_incl.print(" ");
   204   s4o_incl.print(" ");
   205   symbol->subrange_type_name->accept(*basedecl);
   205   symbol->subrange_type_name->accept(*basedecl);
   206   s4o_incl.print(";\n\n");
   206   s4o_incl.print(";\n");
   207   
   207   
   208   current_type_name = symbol->subrange_type_name;
   208   current_type_name = symbol->subrange_type_name;
   209   
   209   
   210   current_basetypedeclaration = subrangetest_bd;
   210   current_basetypedeclaration = subrangetest_bd;
   211   symbol->subrange_spec_init->accept(*this);
   211   symbol->subrange_spec_init->accept(*this);
   374   s4o.print("\n");
   374   s4o.print("\n");
   375   
   375   
   376   return NULL;
   376   return NULL;
   377 }
   377 }
   378 
   378 
   379 /* array_specification [ASSIGN array_initialization} */
   379 /* array_specification [ASSIGN array_initialization] */
   380 /* array_initialization may be NULL ! */
   380 /* array_initialization may be NULL ! */
   381 void *visit(array_spec_init_c *symbol) {
   381 void *visit(array_spec_init_c *symbol) {
   382   TRACE("array_spec_init_c");
   382   TRACE("array_spec_init_c");
   383   current_typedefinition = array_td;
   383   
   384   symbol->array_specification->accept(*this);
   384   identifier_c *array_type_name = dynamic_cast<identifier_c *>(symbol->array_specification);
   385   current_typedefinition = none_td;
   385   
       
   386   if (array_type_name == NULL) {
       
   387     current_typedefinition = array_td;
       
   388     symbol->array_specification->accept(*this);
       
   389     current_typedefinition = none_td;
       
   390   }
       
   391   else
       
   392     symbol->array_specification->accept(*basedecl);
   386   return NULL;
   393   return NULL;
   387 }
   394 }
   388 
   395 
   389 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   396 /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   390 void *visit(array_specification_c *symbol) {
   397 void *visit(array_specification_c *symbol) {
   433 }
   440 }
   434 
   441 
   435 /* helper symbol for data_type_declaration */
   442 /* helper symbol for data_type_declaration */
   436 void *visit(type_declaration_list_c *symbol) {
   443 void *visit(type_declaration_list_c *symbol) {
   437   TRACE("type_declaration_list_c");
   444   TRACE("type_declaration_list_c");
   438   return print_list(symbol, "", "\n");
   445   return print_list_incl(symbol, "", "\n", "\n");
   439 }
   446 }
   440 
   447 
   441 /*  simple_type_name ':' simple_spec_init */
   448 /*  simple_type_name ':' simple_spec_init */
   442 void *visit(simple_type_declaration_c *symbol) {
   449 void *visit(simple_type_declaration_c *symbol) {
   443   TRACE("simple_type_declaration_c");
   450   TRACE("simple_type_declaration_c");
   529 /* structure_type_name ASSIGN structure_initialization */
   536 /* structure_type_name ASSIGN structure_initialization */
   530 /* structure_initialization may be NULL ! */
   537 /* structure_initialization may be NULL ! */
   531 //SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization)
   538 //SYM_REF2(initialized_structure_c, structure_type_name, structure_initialization)
   532 void *visit(initialized_structure_c *symbol) {
   539 void *visit(initialized_structure_c *symbol) {
   533   TRACE("initialized_structure_c");
   540   TRACE("initialized_structure_c");
       
   541   fprintf(stderr, "initialized_structure_c\n");
       
   542   
   534   symbol->structure_type_name->accept(*this);
   543   symbol->structure_type_name->accept(*this);
   535   return NULL;
   544   return NULL;
   536 }
   545 }
   537 
   546 
   538 /* helper symbol for structure_declaration */
   547 /* helper symbol for structure_declaration */
   539 /* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
   548 /* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
   540 /* structure_element_declaration_list structure_element_declaration ';' */
   549 /* structure_element_declaration_list structure_element_declaration ';' */
   541 //SYM_LIST(structure_element_declaration_list_c)
   550 //SYM_LIST(structure_element_declaration_list_c)
   542 void *visit(structure_element_declaration_list_c *symbol) {
   551 void *visit(structure_element_declaration_list_c *symbol) {
   543   TRACE("structure_element_declaration_list_c");
   552   TRACE("structure_element_declaration_list_c");
   544   s4o.print("struct {\n");
   553   s4o_incl.print("struct {\n");
   545   s4o.indent_right();
   554   s4o_incl.indent_right();
   546   s4o.print(s4o.indent_spaces);
   555   s4o_incl.print(s4o_incl.indent_spaces);
   547 
   556 
   548   print_list(symbol);
   557   print_list_incl(symbol, "", s4o_incl.indent_spaces, "");
   549 
   558 
   550   s4o.indent_left();
   559   s4o_incl.indent_left();
   551   s4o.print(s4o.indent_spaces);
   560   s4o_incl.print(s4o_incl.indent_spaces);
   552   s4o.print("}");
   561   s4o_incl.print("}");
   553   return NULL;
   562   return NULL;
   554 }
   563 }
   555 
   564 
   556 /*  structure_element_name ':' spec_init */
   565 /*  structure_element_name ':' spec_init */
   557 //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
   566 //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
   558 void *visit(structure_element_declaration_c *symbol) {
   567 void *visit(structure_element_declaration_c *symbol) {
   559   TRACE("structure_element_declaration_c");
   568   TRACE("structure_element_declaration_c");
   560 
   569 
   561   symbol->spec_init->accept(*this);
   570   symbol->spec_init->accept(*this);
   562   s4o.print(" ");
   571   s4o_incl.print(" ");
   563   symbol->structure_element_name->accept(*this);
   572   symbol->structure_element_name->accept(*basedecl);
   564   s4o.print(";\n");
   573   s4o_incl.print(";\n");
   565   s4o.print(s4o.indent_spaces);
   574   s4o_incl.print(s4o.indent_spaces);
   566 
   575 
   567   return NULL;
   576   return NULL;
   568 }
   577 }
   569 
   578 
   570 /* helper symbol for structure_initialization */
   579 /* helper symbol for structure_initialization */
   573 //SYM_LIST(structure_element_initialization_list_c)
   582 //SYM_LIST(structure_element_initialization_list_c)
   574 void *visit(structure_element_initialization_list_c *symbol) {
   583 void *visit(structure_element_initialization_list_c *symbol) {
   575   TRACE("structure_element_initialization_list_c");
   584   TRACE("structure_element_initialization_list_c");
   576 
   585 
   577   // TODO ???
   586   // TODO ???
   578   ERROR;
   587   //ERROR;
   579   return NULL;
   588   return NULL;
   580 }
   589 }
   581 
   590 
   582 /*  structure_element_name ASSIGN value */
   591 /*  structure_element_name ASSIGN value */
   583 //SYM_REF2(structure_element_initialization_c, structure_element_name, value)
   592 //SYM_REF2(structure_element_initialization_c, structure_element_name, value)
   584 void *visit(structure_element_initialization_c *symbol) {
   593 void *visit(structure_element_initialization_c *symbol) {
   585   TRACE("structure_element_initialization_c");
   594   TRACE("structure_element_initialization_c");
   586 
   595 
   587   // TODO ???
   596   // TODO ???
   588   ERROR;
   597   //ERROR;
   589   return NULL;
   598   return NULL;
   590 }
   599 }
   591 
   600 
   592 #if 0
   601 #if 0
   593 /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */
   602 /*  string_type_name ':' elementary_string_type_name string_type_declaration_size string_type_declaration_init */