Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rd8454b9 r374cb117  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat May 14 09:16:22 2022
    13 // Update Count     : 5401
     12// Last Modified On : Mon Mar 14 16:35:29 2022
     13// Update Count     : 5276
    1414//
    1515
     
    5454#include "Common/SemanticError.h"                                               // error_str
    5555#include "Common/utility.h"                                                             // for maybeMoveBuild, maybeBuild, CodeLo...
    56 
    57 #include "SynTree/Attribute.h"     // for Attribute
    5856
    5957extern DeclarationNode * parseTree;
     
    9593} // appendStr
    9694
    97 DeclarationNode * distAttr( DeclarationNode * typeSpec, DeclarationNode * declList ) {
    98         // distribute declaration_specifier across all declared variables, e.g., static, const, but not __attribute__.
    99         assert( declList );
    100 //      printf( "distAttr1 typeSpec %p\n", typeSpec ); typeSpec->print( std::cout );
    101         DeclarationNode * cur = declList, * cl = (new DeclarationNode)->addType( typeSpec );
    102 //      printf( "distAttr2 cl %p\n", cl ); cl->type->print( std::cout );
    103 //      cl->type->aggregate.name = cl->type->aggInst.aggregate->aggregate.name;
    104 
     95DeclarationNode * distAttr( DeclarationNode * specifier, DeclarationNode * declList ) {
     96        // distribute declaration_specifier across all declared variables, e.g., static, const, __attribute__.
     97        DeclarationNode * cur = declList, * cl = (new DeclarationNode)->addType( specifier );
    10598        for ( cur = dynamic_cast<DeclarationNode *>( cur->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) {
    10699                cl->cloneBaseType( cur );
    107100        } // for
    108101        declList->addType( cl );
    109 //      printf( "distAttr3 declList %p\n", declList ); declList->print( std::cout, 0 );
    110102        return declList;
    111103} // distAttr
     
    119111
    120112void distInl( DeclarationNode * declaration ) {
    121         // distribute INLINE across all declarations
     113        // distribute EXTENSION across all declarations
    122114        for ( DeclarationNode *iter = declaration; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
    123115                iter->set_inLine( true );
     
    179171                if ( ! ( typeSpec->type && (typeSpec->type->kind == TypeData::Aggregate || typeSpec->type->kind == TypeData::Enum) ) ) {
    180172                        stringstream ss;
    181                         // printf( "fieldDecl1 typeSpec %p\n", typeSpec ); typeSpec->type->print( std::cout );
     173                        typeSpec->type->print( ss );
    182174                        SemanticWarning( yylloc, Warning::SuperfluousDecl, ss.str().c_str() );
    183175                        return nullptr;
    184176                } // if
    185                 // printf( "fieldDecl2 typeSpec %p\n", typeSpec ); typeSpec->type->print( std::cout );
    186177                fieldList = DeclarationNode::newName( nullptr );
    187178        } // if
    188 //      return distAttr( typeSpec, fieldList );                         // mark all fields in list
    189 
    190         // printf( "fieldDecl3 typeSpec %p\n", typeSpec ); typeSpec->print( std::cout, 0 );
    191         DeclarationNode * temp = distAttr( typeSpec, fieldList );                               // mark all fields in list
    192         // printf( "fieldDecl4 temp %p\n", temp ); temp->print( std::cout, 0 );
    193         return temp;
     179        return distAttr( typeSpec, fieldList );                         // mark all fields in list
    194180} // fieldDecl
    195181
     
    12351221
    12361222iteration_statement:
    1237         WHILE '(' ')' statement                                                         %prec THEN // CFA => while ( 1 )
     1223        WHILE '(' ')' statement                                                         // CFA => while ( 1 )
    12381224                { $$ = new StatementNode( build_while( new CondCtl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), maybe_build_compound( $4 ) ) ); }
    1239         | WHILE '(' ')' statement ELSE statement                        // CFA
    1240                 {
    1241                         $$ = new StatementNode( build_while( new CondCtl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), maybe_build_compound( $4 ) ) );
    1242                         SemanticWarning( yylloc, Warning::SuperfluousElse );
    1243                 }
    12441225        | WHILE '(' conditional_declaration ')' statement       %prec THEN
    12451226                { $$ = new StatementNode( build_while( $3, maybe_build_compound( $5 ) ) ); }
     
    12481229        | DO statement WHILE '(' ')' ';'                                        // CFA => do while( 1 )
    12491230                { $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), maybe_build_compound( $2 ) ) ); }
    1250         | DO statement WHILE '(' ')' ELSE statement                     // CFA
    1251                 {
    1252                         $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), maybe_build_compound( $2 ) ) );
    1253                         SemanticWarning( yylloc, Warning::SuperfluousElse );
    1254                 }
    1255         | DO statement WHILE '(' comma_expression ')' ';'
     1231        | DO statement WHILE '(' comma_expression ')' ';'       %prec THEN
    12561232                { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ) ) ); }
    12571233        | DO statement WHILE '(' comma_expression ')' ELSE statement // CFA
    12581234                { $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ), $8 ) ); }
    1259         | FOR '(' ')' statement                                                         %prec THEN // CFA => for ( ;; )
     1235        | FOR '(' ')' statement                                                         // CFA => for ( ;; )
    12601236                { $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) ); }
    1261         | FOR '(' ')' statement ELSE statement                          // CFA
    1262                 {
    1263                         $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) );
    1264                         SemanticWarning( yylloc, Warning::SuperfluousElse );
    1265                 }
    12661237        | FOR '(' for_control_expression_list ')' statement     %prec THEN
    12671238                { $$ = new StatementNode( build_for( $3, maybe_build_compound( $5 ) ) ); }
     
    16341605declaration:                                                                                    // old & new style declarations
    16351606        c_declaration ';'
    1636                 {
    1637                         // printf( "C_DECLARATION1 %p %s\n", $$, $$->name ? $$->name->c_str() : "(nil)" );
    1638                         // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
    1639                         //   printf( "\tattr %s\n", attr->name.c_str() );
    1640                         // } // for
    1641                 }
    16421607        | cfa_declaration ';'                                                           // CFA
    16431608        | static_assert                                                                         // C11
     
    18451810        basic_type_specifier
    18461811        | sue_type_specifier
    1847                 {
    1848                         // printf( "sue_type_specifier2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
    1849                         // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
    1850                         //   printf( "\tattr %s\n", attr->name.c_str() );
    1851                         // } // for
    1852                 }
    18531812        | type_type_specifier
    18541813        ;
     
    20672026sue_declaration_specifier:                                                              // struct, union, enum + storage class + type specifier
    20682027        sue_type_specifier
    2069                 {
    2070                         // printf( "sue_declaration_specifier %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
    2071                         // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
    2072                         //   printf( "\tattr %s\n", attr->name.c_str() );
    2073                         // } // for
    2074                 }
    20752028        | declaration_qualifier_list sue_type_specifier
    20762029                { $$ = $2->addQualifiers( $1 ); }
     
    20832036sue_type_specifier:                                                                             // struct, union, enum + type specifier
    20842037        elaborated_type
    2085                 {
    2086                         // printf( "sue_type_specifier %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
    2087                         // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
    2088                         //   printf( "\tattr %s\n", attr->name.c_str() );
    2089                         // } // for
    2090                 }
    20912038        | type_qualifier_list
    20922039                { if ( $1->type != nullptr && $1->type->forall ) forall = true; } // remember generic type
     
    21612108elaborated_type:                                                                                // struct, union, enum
    21622109        aggregate_type
    2163                 {
    2164                         // printf( "elaborated_type %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
    2165                         // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
    2166                         //   printf( "\tattr %s\n", attr->name.c_str() );
    2167                         // } // for
    2168                 }
    21692110        | enum_type
    21702111        ;
     
    21862127                }
    21872128          '{' field_declaration_list_opt '}' type_parameters_opt
    2188                 {
    2189                         // printf( "aggregate_type1 %s\n", $3.str->c_str() );
    2190                         // if ( $2 )
    2191                         //      for ( Attribute * attr: reverseIterate( $2->attributes ) ) {
    2192                         //              printf( "copySpecifiers12 %s\n", attr->name.c_str() );
    2193                         //      } // for
    2194                         $$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 );
    2195                         // printf( "aggregate_type2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
    2196                         // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
    2197                         //      printf( "aggregate_type3 %s\n", attr->name.c_str() );
    2198                         // } // for
    2199                 }
     2129                { $$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 ); }
    22002130        | aggregate_key attribute_list_opt TYPEDEFname          // unqualified type name
    22012131                {
     
    22052135          '{' field_declaration_list_opt '}' type_parameters_opt
    22062136                {
    2207                         // printf( "AGG3\n" );
    22082137                        DeclarationNode::newFromTypedef( $3 );
    22092138                        $$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 );
     
    22162145          '{' field_declaration_list_opt '}' type_parameters_opt
    22172146                {
    2218                         // printf( "AGG4\n" );
    22192147                        DeclarationNode::newFromTypeGen( $3, nullptr );
    22202148                        $$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 );
     
    22932221field_declaration:
    22942222        type_specifier field_declaring_list_opt ';'
    2295                 {
    2296                         // printf( "type_specifier1 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
    2297                         $$ = fieldDecl( $1, $2 );
    2298                         // printf( "type_specifier2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
    2299                         // for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
    2300                         //   printf( "\tattr %s\n", attr->name.c_str() );
    2301                         // } // for
    2302                 }
     2223                { $$ = fieldDecl( $1, $2 ); }
    23032224        | EXTENSION type_specifier field_declaring_list_opt ';' // GCC
    23042225                { $$ = fieldDecl( $2, $3 ); distExt( $$ ); }
     
    23822303        ;
    23832304
    2384 enum_type:
     2305enum_type: // static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body, bool typed );                                                                                         // enum
    23852306        ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
    23862307                { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); }
     
    23972318                        { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); }
    23982319
    2399                         $$ = DeclarationNode::newEnum( nullptr, $7, true, $3 )->addQualifiers( $5 );
    2400                 }
    2401         | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt
     2320                        $$ = DeclarationNode::newEnum( nullptr, $7, true ) ->addQualifiers( $5 )  -> addEnumBase( $3 );
     2321                }
     2322        | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt // Question: why attributes/qualifier after identifier
    24022323                {
    24032324                        if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); }
     
    24062327          '{' enumerator_list comma_opt '}'
    24072328                {
    2408                         $$ = DeclarationNode::newEnum( $6, $10, true, $3 )->addQualifiers( $5 )->addQualifiers( $7 );
     2329                        $$ = DeclarationNode::newEnum( $6, $10, true ) -> addQualifiers( $5 ) -> addQualifiers( $7 ) -> addEnumBase( $3 );
    24092330                }
    24102331        | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt typedef_name attribute_list_opt '{' enumerator_list comma_opt '}'
     
    24122333                        if ( $3->storageClasses.val != 0 || $3->type->qualifiers.val != 0 ) { SemanticError( yylloc, "storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." ); }
    24132334                        typedefTable.makeTypedef( *$6->name );
    2414                         $$ = DeclarationNode::newEnum( $6->name, $9, true, $3 )->addQualifiers( $5 )->addQualifiers( $7 );
     2335                        $$ = DeclarationNode::newEnum( $6->name, $9, true ) -> addQualifiers( $5 ) -> addQualifiers( $7 ) -> addEnumBase( $3 );
    24152336                }
    24162337        | enum_type_nobody
     
    29092830        // empty
    29102831                { $$ = nullptr; forall = false; }
    2911         | WITH '(' tuple_expression_list ')' attribute_list_opt
    2912                 {
    2913                         $$ = $3; forall = false;
    2914                         if ( $5 ) {
    2915                                 SemanticError( yylloc, "Attributes cannot be associated with function body. Move attribute(s) before \"with\" clause." );
    2916                                 $$ = nullptr;
    2917                         } // if
    2918                 }
     2832        | WITH '(' tuple_expression_list ')'
     2833                { $$ = $3; forall = false; }
    29192834        ;
    29202835
Note: See TracChangeset for help on using the changeset viewer.