Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rd63aeba r9fa61f5  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar 22 21:26:01 2023
    13 // Update Count     : 6002
     12// Last Modified On : Tue Mar 14 09:37:58 2023
     13// Update Count     : 5990
    1414//
    1515
     
    270270        SemanticError( yylloc, ::toString( "Identifier \"", identifier, "\" cannot appear before a ", kind, ".\n"
    271271                                   "Possible cause is misspelled storage/CV qualifier, misspelled typename, or missing generic parameter." ) );
    272 } // IdentifierBeforeType
    273 
    274 static bool TypedefForall( DeclarationNode * decl ) {
    275         if ( decl->type->forall || (decl->type->kind == TypeData::Aggregate && decl->type->aggregate.params) ) {
    276                 SemanticError( yylloc, "forall qualifier in typedef is currently unimplemented." );
    277                 return true;
    278         } // if
    279         return false;
    280272} // IdentifierBeforeType
    281273
     
    504496%type<decl> typedef_name typedef_declaration typedef_expression
    505497
    506 %type<decl> variable_type_redeclarator variable_type_ptr variable_type_array variable_type_function
    507 %type<decl> general_function_declarator function_type_redeclarator function_type_array function_type_no_ptr function_type_ptr
     498%type<decl> variable_type_redeclarator type_ptr type_array type_function
    508499
    509500%type<decl> type_parameter_redeclarator type_parameter_ptr type_parameter_array type_parameter_function
     
    19661957        TYPEDEF type_specifier declarator
    19671958                {
     1959                        // if type_specifier is an anon aggregate => name
    19681960                        typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "4" );
    1969                         if ( TypedefForall( $2 ) ) $$ = nullptr;
    1970                         else $$ = $3->addType( $2 )->addTypedef();              // watchout frees $2 and $3
     1961                        $$ = $3->addType( $2 )->addTypedef();           // watchout frees $2 and $3
    19711962                }
    19721963        | typedef_declaration pop ',' push declarator
     
    19781969                {
    19791970                        typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname, "6" );
    1980                         if ( TypedefForall( $1 ) ) $$ = nullptr;
    1981                         else $$ = $4->addQualifiers( $1 )->addType( $3 )->addTypedef();
     1971                        $$ = $4->addQualifiers( $1 )->addType( $3 )->addTypedef();
    19821972                }
    19831973        | type_specifier TYPEDEF declarator
    19841974                {
    19851975                        typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "7" );
    1986                         if ( TypedefForall( $1 ) ) $$ = nullptr;
    1987                         else $$ = $3->addType( $1 )->addTypedef();
     1976                        $$ = $3->addType( $1 )->addTypedef();
    19881977                }
    19891978        | type_specifier TYPEDEF type_qualifier_list declarator
    19901979                {
    19911980                        typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname, "8" );
    1992                         if ( TypedefForall( $3 ) ) $$ = nullptr;
    1993                         else $$ = $4->addQualifiers( $1 )->addType( $1 )->addTypedef();
     1981                        $$ = $4->addQualifiers( $1 )->addType( $1 )->addTypedef();
    19941982                }
    19951983        ;
     
    20282016                // A semantic check is required to ensure asm_name only appears on declarations with implicit or explicit static
    20292017                // storage-class
    2030         variable_declarator asm_name_opt initializer_opt
     2018        declarator asm_name_opt initializer_opt
    20312019                { $$ = $1->addAsmName( $2 )->addInitializer( $3 ); }
    2032         | variable_type_redeclarator asm_name_opt initializer_opt
    2033                 { $$ = $1->addAsmName( $2 )->addInitializer( $3 ); }
    2034 
    2035         | general_function_declarator asm_name_opt
    2036                 { $$ = $1->addAsmName( $2 )->addInitializer( nullptr ); }
    2037         | general_function_declarator asm_name_opt '=' VOID
    2038                 { $$ = $1->addAsmName( $2 )->addInitializer( new InitializerNode( true ) ); }
    2039 
    20402020        | declaring_list ',' attribute_list_opt declarator asm_name_opt initializer_opt
    20412021                { $$ = $1->appendList( $4->addQualifiers( $3 )->addAsmName( $5 )->addInitializer( $6 ) ); }
    2042         ;
    2043 
    2044 general_function_declarator:
    2045         function_type_redeclarator
    2046         | function_declarator
    20472022        ;
    20482023
     
    25682543                // A semantic check is required to ensure bit_subrange only appears on integral types.
    25692544                { $$ = $1->addBitfield( $2 ); }
    2570         | function_type_redeclarator bit_subrange_size_opt
    2571                 // A semantic check is required to ensure bit_subrange only appears on integral types.
    2572                 { $$ = $1->addBitfield( $2 ); }
    25732545        ;
    25742546
     
    32233195                        $$ = $2->addFunctionBody( $4, $3 )->addType( $1 );
    32243196                }
    3225         | declaration_specifier function_type_redeclarator with_clause_opt compound_statement
     3197        | declaration_specifier variable_type_redeclarator with_clause_opt compound_statement
    32263198                {
    32273199                        rebindForall( $1, $2 );
     
    32593231        | variable_type_redeclarator
    32603232        | function_declarator
    3261         | function_type_redeclarator
    32623233        ;
    32633234
     
    35103481        ;
    35113482
    3512 // This pattern parses a declaration for a variable that redefines a type name, e.g.:
     3483// This pattern parses a declaration for a variable or function prototype that redefines a type name, e.g.:
    35133484//
    35143485//              typedef int foo;
     
    35163487//                 int foo; // redefine typedef name in new scope
    35173488//              }
     3489//
     3490// The pattern precludes declaring an array of functions versus a pointer to an array of functions, and returning arrays
     3491// and functions versus pointers to arrays and functions.
    35183492
    35193493paren_type:
     
    35303504        paren_type attribute_list_opt
    35313505                { $$ = $1->addQualifiers( $2 ); }
    3532         | variable_type_ptr
    3533         | variable_type_array attribute_list_opt
     3506        | type_ptr
     3507        | type_array attribute_list_opt
    35343508                { $$ = $1->addQualifiers( $2 ); }
    3535         | variable_type_function attribute_list_opt
     3509        | type_function attribute_list_opt
    35363510                { $$ = $1->addQualifiers( $2 ); }
    35373511        ;
    35383512
    3539 variable_type_ptr:
     3513type_ptr:
    35403514        ptrref_operator variable_type_redeclarator
    35413515                { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
    35423516        | ptrref_operator type_qualifier_list variable_type_redeclarator
    35433517                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    3544         | '(' variable_type_ptr ')' attribute_list_opt          // redundant parenthesis
     3518        | '(' type_ptr ')' attribute_list_opt                           // redundant parenthesis
    35453519                { $$ = $2->addQualifiers( $4 ); }
    3546         | '(' attribute_list variable_type_ptr ')' attribute_list_opt // redundant parenthesis
     3520        | '(' attribute_list type_ptr ')' attribute_list_opt // redundant parenthesis
    35473521                { $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); }
    35483522        ;
    35493523
    3550 variable_type_array:
     3524type_array:
    35513525        paren_type array_dimension
    35523526                { $$ = $1->addArray( $2 ); }
    3553         | '(' variable_type_ptr ')' array_dimension
     3527        | '(' type_ptr ')' array_dimension
    35543528                { $$ = $2->addArray( $4 ); }
    3555         | '(' attribute_list variable_type_ptr ')' array_dimension
     3529        | '(' attribute_list type_ptr ')' array_dimension
    35563530                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    3557         | '(' variable_type_array ')' multi_array_dimension     // redundant parenthesis
     3531        | '(' type_array ')' multi_array_dimension                      // redundant parenthesis
    35583532                { $$ = $2->addArray( $4 ); }
    3559         | '(' attribute_list variable_type_array ')' multi_array_dimension // redundant parenthesis
     3533        | '(' attribute_list type_array ')' multi_array_dimension // redundant parenthesis
    35603534                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    3561         | '(' variable_type_array ')'                                           // redundant parenthesis
     3535        | '(' type_array ')'                                                            // redundant parenthesis
    35623536                { $$ = $2; }
    3563         | '(' attribute_list variable_type_array ')'            // redundant parenthesis
     3537        | '(' attribute_list type_array ')'                                     // redundant parenthesis
    35643538                { $$ = $3->addQualifiers( $2 ); }
    35653539        ;
    35663540
    3567 variable_type_function:
    3568         '(' variable_type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
    3569                 { $$ = $2->addParamList( $6 ); }
    3570         | '(' attribute_list variable_type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
    3571                 { $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
    3572         | '(' variable_type_function ')'                                        // redundant parenthesis
    3573                 { $$ = $2; }
    3574         | '(' attribute_list variable_type_function ')'         // redundant parenthesis
    3575                 { $$ = $3->addQualifiers( $2 ); }
    3576         ;
    3577 
    3578 // This pattern parses a declaration for a function prototype that redefines a type name.  It precludes declaring an
    3579 // array of functions versus a pointer to an array of functions, and returning arrays and functions versus pointers to
    3580 // arrays and functions.
    3581 
    3582 function_type_redeclarator:
    3583         function_type_no_ptr attribute_list_opt
    3584                 { $$ = $1->addQualifiers( $2 ); }
    3585         | function_type_ptr
    3586         | function_type_array attribute_list_opt
    3587                 { $$ = $1->addQualifiers( $2 ); }
    3588         ;
    3589 
    3590 function_type_no_ptr:
     3541type_function:
    35913542        paren_type '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
    35923543                { $$ = $1->addParamList( $4 ); }
    3593         | '(' function_type_ptr ')' '(' push parameter_type_list_opt pop ')'
     3544        | '(' type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
    35943545                { $$ = $2->addParamList( $6 ); }
    3595         | '(' attribute_list function_type_ptr ')' '(' push parameter_type_list_opt pop ')'
     3546        | '(' attribute_list type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
    35963547                { $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
    3597         | '(' function_type_no_ptr ')'                                          // redundant parenthesis
     3548        | '(' type_function ')'                                                         // redundant parenthesis
    35983549                { $$ = $2; }
    3599         | '(' attribute_list function_type_no_ptr ')'           // redundant parenthesis
    3600                 { $$ = $3->addQualifiers( $2 ); }
    3601         ;
    3602 
    3603 function_type_ptr:
    3604         ptrref_operator function_type_redeclarator
    3605                 { $$ = $2->addPointer( DeclarationNode::newPointer( nullptr, $1 ) ); }
    3606         | ptrref_operator type_qualifier_list function_type_redeclarator
    3607                 { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    3608         | '(' function_type_ptr ')' attribute_list_opt
    3609                 { $$ = $2->addQualifiers( $4 ); }
    3610         | '(' attribute_list function_type_ptr ')' attribute_list_opt
    3611                 { $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); }
    3612         ;
    3613 
    3614 function_type_array:
    3615         '(' function_type_ptr ')' array_dimension
    3616                 { $$ = $2->addArray( $4 ); }
    3617         | '(' attribute_list function_type_ptr ')' array_dimension
    3618                 { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    3619         | '(' function_type_array ')' multi_array_dimension     // redundant parenthesis
    3620                 { $$ = $2->addArray( $4 ); }
    3621         | '(' attribute_list function_type_array ')' multi_array_dimension // redundant parenthesis
    3622                 { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    3623         | '(' function_type_array ')'                                           // redundant parenthesis
    3624                 { $$ = $2; }
    3625         | '(' attribute_list function_type_array ')'            // redundant parenthesis
     3550        | '(' attribute_list type_function ')'                          // redundant parenthesis
    36263551                { $$ = $3->addQualifiers( $2 ); }
    36273552        ;
Note: See TracChangeset for help on using the changeset viewer.