Changeset 5e25953


Ignore:
Timestamp:
Mar 15, 2021, 2:06:06 PM (3 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
ea837e94
Parents:
fcd01432
Message:

add more locations where attribute clause may appear

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rfcd01432 r5e25953  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 12 15:21:02 2021
    13 // Update Count     : 4728
     12// Last Modified On : Mon Mar 15 13:34:17 2021
     13// Update Count     : 4740
    1414//
    1515
     
    10301030                { $$ = new StatementNode( build_compound( (StatementNode *)0 ) ); }
    10311031        | '{' push
    1032           local_label_declaration_opt                                           // GCC, local labels
     1032          local_label_declaration_opt                                           // GCC, local labels appear at start of block
    10331033          statement_decl_list                                                           // C99, intermix declarations and statements
    10341034          pop '}'
     
    17791779type_qualifier:
    17801780        type_qualifier_name
    1781         | attribute
     1781        | attribute                                                                                     // trick handles most atrribute locations
    17821782        ;
    17831783
     
    26492649                }
    26502650        | ASM '(' string_literal ')' ';'                                        // GCC, global assembler statement
    2651                 {
    2652                         $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) );
    2653                 }
     2651                { $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) ); }
    26542652        | EXTERN STRINGliteral                                                          // C++-style linkage specifier
    26552653                {
     
    28642862// declaring an array of functions versus a pointer to an array of functions.
    28652863
     2864paren_identifier:
     2865        identifier
     2866                { $$ = DeclarationNode::newName( $1 ); }
     2867        | '(' paren_identifier ')'                                                      // redundant parenthesis
     2868                { $$ = $2; }
     2869        ;
     2870
    28662871variable_declarator:
    28672872        paren_identifier attribute_list_opt
     
    28742879        ;
    28752880
    2876 paren_identifier:
    2877         identifier
    2878                 { $$ = DeclarationNode::newName( $1 ); }
    2879         | '(' paren_identifier ')'                                                      // redundant parenthesis
    2880                 { $$ = $2; }
    2881         ;
    2882 
    28832881variable_ptr:
    28842882        ptrref_operator variable_declarator
     
    28862884        | ptrref_operator type_qualifier_list variable_declarator
    28872885                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    2888         | '(' variable_ptr ')' attribute_list_opt
    2889                 { $$ = $2->addQualifiers( $4 ); }                               // redundant parenthesis
     2886        | '(' variable_ptr ')' attribute_list_opt                       // redundant parenthesis
     2887                { $$ = $2->addQualifiers( $4 ); }
     2888        | '(' attribute_list variable_ptr ')' attribute_list_opt // redundant parenthesis
     2889                { $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); }
    28902890        ;
    28912891
     
    28952895        | '(' variable_ptr ')' array_dimension
    28962896                { $$ = $2->addArray( $4 ); }
    2897         | '(' variable_array ')' multi_array_dimension          // redundant parenthesis
     2897        | '(' attribute_list variable_ptr ')' array_dimension
     2898                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
     2899        | '(' variable_array ')' multi_array_dimension          // redundant parenthesis
    28982900                { $$ = $2->addArray( $4 ); }
     2901        | '(' attribute_list variable_array ')' multi_array_dimension // redundant parenthesis
     2902                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    28992903        | '(' variable_array ')'                                                        // redundant parenthesis
    29002904                { $$ = $2; }
     2905        | '(' attribute_list variable_array ')'                         // redundant parenthesis
     2906                { $$ = $3->addQualifiers( $2 ); }
    29012907        ;
    29022908
     
    29042910        '(' variable_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
    29052911                { $$ = $2->addParamList( $6 ); }
     2912        | '(' attribute_list variable_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
     2913                { $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
    29062914        | '(' variable_function ')'                                                     // redundant parenthesis
    29072915                { $$ = $2; }
     2916        | '(' attribute_list variable_function ')'                      // redundant parenthesis
     2917                { $$ = $3->addQualifiers( $2 ); }
    29082918        ;
    29092919
     
    29252935        | '(' function_ptr ')' '(' push parameter_type_list_opt pop ')'
    29262936                { $$ = $2->addParamList( $6 ); }
     2937        | '(' attribute_list function_ptr ')' '(' push parameter_type_list_opt pop ')'
     2938                { $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
    29272939        | '(' function_no_ptr ')'                                                       // redundant parenthesis
    29282940                { $$ = $2; }
     2941        | '(' attribute_list function_no_ptr ')'                        // redundant parenthesis
     2942                { $$ = $3->addQualifiers( $2 ); }
    29292943        ;
    29302944
     
    29342948        | ptrref_operator type_qualifier_list function_declarator
    29352949                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    2936         | '(' function_ptr ')'
    2937                 { $$ = $2; }
     2950        | '(' function_ptr ')' attribute_list_opt
     2951                { $$ = $2->addQualifiers( $4 ); }
     2952        | '(' attribute_list function_ptr ')' attribute_list_opt
     2953                { $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); }
    29382954        ;
    29392955
     
    29412957        '(' function_ptr ')' array_dimension
    29422958                { $$ = $2->addArray( $4 ); }
     2959        | '(' attribute_list function_ptr ')' array_dimension
     2960                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    29432961        | '(' function_array ')' multi_array_dimension          // redundant parenthesis
    29442962                { $$ = $2->addArray( $4 ); }
     2963        | '(' attribute_list function_array ')' multi_array_dimension // redundant parenthesis
     2964                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    29452965        | '(' function_array ')'                                                        // redundant parenthesis
    29462966                { $$ = $2; }
     2967        | '(' attribute_list function_array ')'                         // redundant parenthesis
     2968                { $$ = $3->addQualifiers( $2 ); }
    29472969        ;
    29482970
     
    29652987        | '(' KR_function_ptr ')' '(' push parameter_type_list_opt pop ')'
    29662988                { $$ = $2->addParamList( $6 ); }
     2989        | '(' attribute_list KR_function_ptr ')' '(' push parameter_type_list_opt pop ')'
     2990                { $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
    29672991        | '(' KR_function_no_ptr ')'                                            // redundant parenthesis
    29682992                { $$ = $2; }
     2993        | '(' attribute_list KR_function_no_ptr ')'                     // redundant parenthesis
     2994                { $$ = $3->addQualifiers( $2 ); }
    29692995        ;
    29702996
     
    29763002        | '(' KR_function_ptr ')'
    29773003                { $$ = $2; }
     3004        | '(' attribute_list KR_function_ptr ')'
     3005                { $$ = $3->addQualifiers( $2 ); }
    29783006        ;
    29793007
     
    29813009        '(' KR_function_ptr ')' array_dimension
    29823010                { $$ = $2->addArray( $4 ); }
     3011        | '(' attribute_list KR_function_ptr ')' array_dimension
     3012                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    29833013        | '(' KR_function_array ')' multi_array_dimension       // redundant parenthesis
    29843014                { $$ = $2->addArray( $4 ); }
     3015        | '(' attribute_list KR_function_array ')' multi_array_dimension // redundant parenthesis
     3016                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    29853017        | '(' KR_function_array ')'                                                     // redundant parenthesis
    29863018                { $$ = $2; }
     3019        | '(' attribute_list KR_function_array ')'                      // redundant parenthesis
     3020                { $$ = $3->addQualifiers( $2 ); }
    29873021        ;
    29883022
     
    29963030// The pattern precludes declaring an array of functions versus a pointer to an array of functions, and returning arrays
    29973031// and functions versus pointers to arrays and functions.
     3032
     3033paren_type:
     3034        typedef
     3035                // hide type name in enclosing scope by variable name
     3036                {
     3037                        // if ( ! typedefTable.existsCurr( *$1->name ) ) {
     3038                                typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER, "ID" );
     3039                        // } else {
     3040                        //      SemanticError( yylloc, string("'") + *$1->name + "' redeclared as different kind of symbol." ); $$ = nullptr;
     3041                        // } // if
     3042                }
     3043        | '(' paren_type ')'
     3044                { $$ = $2; }
     3045        ;
    29983046
    29993047variable_type_redeclarator:
     
    30073055        ;
    30083056
    3009 paren_type:
    3010         typedef
    3011                 // hide type name in enclosing scope by variable name
    3012                 {
    3013                         // if ( ! typedefTable.existsCurr( *$1->name ) ) {
    3014                                 typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER, "ID" );
    3015                         // } else {
    3016                         //      SemanticError( yylloc, string("'") + *$1->name + "' redeclared as different kind of symbol." ); $$ = nullptr;
    3017                         // } // if
    3018                 }
    3019         | '(' paren_type ')'
    3020                 { $$ = $2; }
    3021         ;
    3022 
    30233057type_ptr:
    30243058        ptrref_operator variable_type_redeclarator
     
    30263060        | ptrref_operator type_qualifier_list variable_type_redeclarator
    30273061                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    3028         | '(' type_ptr ')' attribute_list_opt
    3029                 { $$ = $2->addQualifiers( $4 ); }                               // redundant parenthesis
     3062        | '(' type_ptr ')' attribute_list_opt                           // redundant parenthesis
     3063                { $$ = $2->addQualifiers( $4 ); }
     3064        | '(' attribute_list type_ptr ')' attribute_list_opt // redundant parenthesis
     3065                { $$ = $3->addQualifiers( $2 )->addQualifiers( $5 ); }
    30303066        ;
    30313067
     
    30353071        | '(' type_ptr ')' array_dimension
    30363072                { $$ = $2->addArray( $4 ); }
     3073        | '(' attribute_list type_ptr ')' array_dimension
     3074                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    30373075        | '(' type_array ')' multi_array_dimension                      // redundant parenthesis
    30383076                { $$ = $2->addArray( $4 ); }
     3077        | '(' attribute_list type_array ')' multi_array_dimension // redundant parenthesis
     3078                { $$ = $3->addQualifiers( $2 )->addArray( $5 ); }
    30393079        | '(' type_array ')'                                                            // redundant parenthesis
    30403080                { $$ = $2; }
     3081        | '(' attribute_list type_array ')'                                     // redundant parenthesis
     3082                { $$ = $3->addQualifiers( $2 ); }
    30413083        ;
    30423084
     
    30463088        | '(' type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
    30473089                { $$ = $2->addParamList( $6 ); }
     3090        | '(' attribute_list type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
     3091                { $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
    30483092        | '(' type_function ')'                                                         // redundant parenthesis
    30493093                { $$ = $2; }
     3094        | '(' attribute_list type_function ')'                          // redundant parenthesis
     3095                { $$ = $3->addQualifiers( $2 ); }
    30503096        ;
    30513097
     
    30723118        | ptrref_operator type_qualifier_list identifier_parameter_declarator
    30733119                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    3074         | '(' identifier_parameter_ptr ')' attribute_list_opt
     3120        | '(' identifier_parameter_ptr ')' attribute_list_opt // redundant parenthesis
    30753121                { $$ = $2->addQualifiers( $4 ); }
    30763122        ;
     
    31293175        | ptrref_operator type_qualifier_list type_parameter_redeclarator
    31303176                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    3131         | '(' type_parameter_ptr ')' attribute_list_opt
     3177        | '(' type_parameter_ptr ')' attribute_list_opt         // redundant parenthesis
    31323178                { $$ = $2->addQualifiers( $4 ); }
    31333179        ;
     
    32703316        | ptrref_operator type_qualifier_list abstract_parameter_declarator
    32713317                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    3272         | '(' abstract_parameter_ptr ')' attribute_list_opt
     3318        | '(' abstract_parameter_ptr ')' attribute_list_opt     // redundant parenthesis
    32733319                { $$ = $2->addQualifiers( $4 ); }
    32743320        ;
     
    33493395        | ptrref_operator type_qualifier_list variable_abstract_declarator
    33503396                { $$ = $3->addPointer( DeclarationNode::newPointer( $2, $1 ) ); }
    3351         | '(' variable_abstract_ptr ')' attribute_list_opt
     3397        | '(' variable_abstract_ptr ')' attribute_list_opt      // redundant parenthesis
    33523398                { $$ = $2->addQualifiers( $4 ); }
    33533399        ;
Note: See TracChangeset for help on using the changeset viewer.