Ignore:
Timestamp:
Mar 16, 2024, 6:41:24 PM (7 weeks ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
8f650f0
Parents:
30ee3155
Message:

more reorganized enum_type rule in parser

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r30ee3155 r42422fb  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Mar 16 11:17:15 2024
    13 // Update Count     : 6599
     12// Last Modified On : Sat Mar 16 18:19:23 2024
     13// Update Count     : 6617
    1414//
    1515
     
    485485%type<decl> elaborated_type elaborated_type_nobody
    486486
    487 %type<decl> enumerator_list enum_type enum_type_nobody
     487%type<decl> enumerator_list enum_type enum_type_nobody enumerator_type
    488488%type<init> enumerator_value_opt
    489489
     
    27502750                        $$ = DeclarationNode::newEnum( nullptr, $5, true, false )->addQualifiers( $2 );
    27512751                }
    2752                 // pure enumeration
    2753         | ENUM '(' ')' attribute_list_opt hide_opt '{' enumerator_list comma_opt '}'
    2754                 {
    2755                         if ( $5 == EnumHiding::Hide ) {
     2752        | ENUM enumerator_type attribute_list_opt hide_opt '{' enumerator_list comma_opt '}'
     2753                {
     2754                        if ( $2 && ($2->storageClasses.val != 0 || $2->type->qualifiers.any()) ) {
     2755                                SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." );
     2756                        }
     2757                        if ( $4 == EnumHiding::Hide ) {
    27562758                                SemanticError( yylloc, "syntax error, hiding ('!') the enumerator names of an anonymous enumeration means the names are inaccessible." ); $$ = nullptr;
    27572759                        } // if
    2758                         $$ = DeclarationNode::newEnum( nullptr, $7, true, true )->addQualifiers( $4 );
    2759                 }
    2760                 // typed enumeration
    2761         | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt '{' enumerator_list comma_opt '}'
    2762                 {
    2763                         if ( $3->storageClasses.val != 0 || $3->type->qualifiers.any() ) {
    2764                                 SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." );
    2765                         }
    2766                         $$ = DeclarationNode::newEnum( nullptr, $7, true, true, $3 )->addQualifiers( $5 );
    2767                 }
    2768         | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt '!' '{' enumerator_list comma_opt '}' // unqualified type name
    2769                 { SemanticError( yylloc, "syntax error, hiding ('!') the enumerator names of an anonymous enumeration means the names are inaccessible." ); $$ = nullptr; }
    2770 
    2771                 // type name
     2760                        $$ = DeclarationNode::newEnum( nullptr, $6, true, true, $2 )->addQualifiers( $3 );
     2761                }
     2762
     2763                // named type
    27722764        | ENUM attribute_list_opt identifier
    27732765                { typedefTable.makeTypedef( *$3, "enum_type 1" ); }
     
    27762768        | ENUM attribute_list_opt typedef_name hide_opt '{' enumerator_list comma_opt '}' // unqualified type name
    27772769                { $$ = DeclarationNode::newEnum( $3->name, $6, true, false, nullptr, $4 )->addQualifiers( $2 ); }
    2778                 // pure enumeration
    2779         | ENUM '(' ')' attribute_list_opt identifier attribute_list_opt
    2780                 { typedefTable.makeTypedef( *$5, "enum_type 2" ); }
    2781           hide_opt '{' enumerator_list comma_opt '}'
    2782                 {
    2783                         $$ = DeclarationNode::newEnum( $5, $10, true, true, nullptr, $8 )->addQualifiers( $4 )->addQualifiers( $6 );
    2784                 }
    2785         | ENUM '(' ')' attribute_list_opt typedef_name attribute_list_opt hide_opt '{' enumerator_list comma_opt '}'
    2786                 {
    2787                         $$ = DeclarationNode::newEnum( $5->name, $9, true, true, nullptr, $7 )->addQualifiers( $4 )->addQualifiers( $6 );
    2788                 }
    2789                 // typed enumeration
    2790         | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt
    2791                 {
    2792                         if ( $3 && ($3->storageClasses.any() || $3->type->qualifiers.val != 0) ) {
     2770        | ENUM enumerator_type attribute_list_opt identifier attribute_list_opt
     2771                {
     2772                        if ( $2 && ($2->storageClasses.any() || $2->type->qualifiers.val != 0) ) {
    27932773                                SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." );
    27942774                        }
    2795                         typedefTable.makeTypedef( *$6, "enum_type 3" );
     2775                        typedefTable.makeTypedef( *$4, "enum_type 2" );
    27962776                }
    27972777          hide_opt '{' enumerator_list comma_opt '}'
    2798                 {
    2799                         $$ = DeclarationNode::newEnum( $6, $11, true, true, $3, $9 )->addQualifiers( $5 )->addQualifiers( $7 );
    2800                 }
    2801         | ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt typedef_name attribute_list_opt hide_opt '{' enumerator_list comma_opt '}'
    2802                 {
    2803                         $$ = DeclarationNode::newEnum( $6->name, $10, true, true, $3, $8 )->addQualifiers( $5 )->addQualifiers( $7 );
    2804                 }
     2778                { $$ = DeclarationNode::newEnum( $4, $9, true, true, $2, $7 )->addQualifiers( $3 )->addQualifiers( $5 ); }
     2779        | ENUM enumerator_type attribute_list_opt typedef_name attribute_list_opt hide_opt '{' enumerator_list comma_opt '}'
     2780                { $$ = DeclarationNode::newEnum( $4->name, $8, true, true, $2, $6 )->addQualifiers( $3 )->addQualifiers( $5 ); }
    28052781
    28062782                // forward declaration
    28072783        | enum_type_nobody
     2784        ;
     2785
     2786enumerator_type:
     2787        '(' ')'                                                                                         // pure enumeration
     2788                { $$ = nullptr; }
     2789        | '(' cfa_abstract_parameter_declaration ')'            // typed enumeration
     2790                { $$ = $2; }
    28082791        ;
    28092792
Note: See TracChangeset for help on using the changeset viewer.