Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rd0ffed1 rca1a547  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb 28 09:58:10 2017
    13 // Update Count     : 2208
     12// Last Modified On : Thu Feb 23 15:23:49 2017
     13// Update Count     : 2187
    1414//
    1515
     
    196196
    197197%type<aggKey> aggregate_key
    198 %type<decl> aggregate_type aggregate_type_nobody
     198%type<decl>  aggregate_type
    199199
    200200%type<decl> assertion assertion_list_opt
     
    207207
    208208%type<decl> declaration declaration_list declaration_list_opt declaration_qualifier_list
    209 %type<decl> declaration_specifier declaration_specifier_nobody declarator declaring_list
    210 
    211 %type<decl> elaborated_type elaborated_type_nobody
    212 
    213 %type<decl> enumerator_list enum_type enum_type_nobody
     209%type<decl> declaration_specifier declarator declaring_list
     210
     211%type<decl> elaborated_type
     212
     213%type<decl> enumerator_list enum_type
    214214%type<en> enumerator_value_opt
    215215
     
    251251%type<decl> storage_class storage_class_list
    252252
    253 %type<decl> sue_declaration_specifier sue_declaration_specifier_nobody sue_type_specifier sue_type_specifier_nobody
     253%type<decl> sue_declaration_specifier sue_type_specifier
    254254
    255255%type<tclass> type_class
     
    268268%type<en> type_name_list
    269269
    270 %type<decl> type_qualifier type_qualifier_name type_qualifier_list type_qualifier_list_opt type_specifier type_specifier_nobody
     270%type<decl> type_qualifier type_qualifier_name type_qualifier_list type_qualifier_list_opt type_specifier
    271271
    272272%type<decl> variable_declarator variable_ptr variable_array variable_function
     
    973973
    974974exception_declaration:
    975                 // No SUE declaration in parameter list.
    976         type_specifier_nobody
    977         | type_specifier_nobody declarator
     975                // A semantic check is required to ensure type_specifier does not create a new type, e.g.:
     976                //
     977                //              catch ( struct { int i; } x ) ...
     978                //
     979                // This new type cannot catch any thrown type because of name equivalence among types.
     980        type_specifier
     981        | type_specifier declarator
    978982                {
    979983                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    980984                        $$ = $2->addType( $1 );
    981985                }
    982         | type_specifier_nobody variable_abstract_declarator
     986        | type_specifier variable_abstract_declarator
    983987                { $$ = $2->addType( $1 ); }
    984988        | cfa_abstract_declarator_tuple no_attr_identifier      // CFA
     
    13451349        ;
    13461350
    1347 declaration_specifier_nobody:                                                   // type specifier + storage class - {...}
    1348                 // Preclude SUE declarations in restricted scopes:
    1349                 //
    1350                 //    int f( struct S { int i; } s1, Struct S s2 ) { struct S s3; ... }
    1351                 //
    1352                 // because it is impossible to call f due to name equivalence.
    1353         basic_declaration_specifier
    1354         | sue_declaration_specifier_nobody
    1355         | typedef_declaration_specifier
    1356         | typegen_declaration_specifier
    1357         ;
    1358 
    1359 type_specifier:                                                                                 // type specifier
     1351type_specifier:                                                                                 // declaration specifier - storage class
    13601352        basic_type_specifier
    13611353        | sue_type_specifier
    1362         | typedef_type_specifier
    1363         | typegen_type_specifier
    1364         ;
    1365 
    1366 type_specifier_nobody:                                                                  // type specifier - {...}
    1367                 // Preclude SUE declarations in restricted scopes:
    1368                 //
    1369                 //    int f( struct S { int i; } s1, Struct S s2 ) { struct S s3; ... }
    1370                 //
    1371                 // because it is impossible to call f due to name equivalence.
    1372         basic_type_specifier
    1373         | sue_type_specifier_nobody
    13741354        | typedef_type_specifier
    13751355        | typegen_type_specifier
     
    15341514        ;
    15351515
    1536 sue_declaration_specifier:                                                              // struct, union, enum + storage class + type specifier
     1516sue_declaration_specifier:
    15371517        sue_type_specifier
    15381518        | declaration_qualifier_list sue_type_specifier
     
    15441524        ;
    15451525
    1546 sue_type_specifier:                                                                             // struct, union, enum + type specifier
    1547         elaborated_type
     1526sue_type_specifier:
     1527        elaborated_type                                                                         // struct, union, enum
    15481528        | type_qualifier_list elaborated_type
    15491529                { $$ = $2->addQualifiers( $1 ); }
    15501530        | sue_type_specifier type_qualifier
    1551                 { $$ = $1->addQualifiers( $2 ); }
    1552         ;
    1553 
    1554 sue_declaration_specifier_nobody:                                               // struct, union, enum - {...} + storage class + type specifier
    1555         sue_type_specifier_nobody
    1556         | declaration_qualifier_list sue_type_specifier_nobody
    1557                 { $$ = $2->addQualifiers( $1 ); }
    1558         | sue_declaration_specifier_nobody storage_class        // remaining OBSOLESCENT (see 2)
    1559                 { $$ = $1->addQualifiers( $2 ); }
    1560         | sue_declaration_specifier_nobody storage_class type_qualifier_list
    1561                 { $$ = $1->addQualifiers( $2 )->addQualifiers( $3 ); }
    1562         ;
    1563 
    1564 sue_type_specifier_nobody:                                                              // struct, union, enum - {...} + type specifier
    1565         elaborated_type_nobody
    1566         | type_qualifier_list elaborated_type_nobody
    1567                 { $$ = $2->addQualifiers( $1 ); }
    1568         | sue_type_specifier_nobody type_qualifier
    15691531                { $$ = $1->addQualifiers( $2 ); }
    15701532        ;
     
    15891551        ;
    15901552
    1591 elaborated_type:                                                                                // struct, union, enum
     1553elaborated_type:
    15921554        aggregate_type
    15931555        | enum_type
    15941556        ;
    15951557
    1596 elaborated_type_nobody:                                                                 // struct, union, enum - {...}
    1597         aggregate_type_nobody
    1598         | enum_type_nobody
    1599         ;
    1600 
    1601 aggregate_type:                                                                                 // struct, union
     1558aggregate_type:
    16021559        aggregate_key attribute_list_opt '{' field_declaration_list '}'
    16031560                { $$ = DeclarationNode::newAggregate( $1, nullptr, nullptr, $4, true )->addQualifiers( $2 ); }
     1561        | aggregate_key attribute_list_opt no_attr_identifier_or_type_name
     1562                {
     1563                        typedefTable.makeTypedef( *$3 );
     1564                        $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 );
     1565                }
    16041566        | aggregate_key attribute_list_opt no_attr_identifier_or_type_name
    16051567                { typedefTable.makeTypedef( *$3 ); }
     
    16081570        | aggregate_key attribute_list_opt '(' type_name_list ')' '{' field_declaration_list '}' // CFA
    16091571                { $$ = DeclarationNode::newAggregate( $1, nullptr, $4, $7, false )->addQualifiers( $2 ); }
    1610         | aggregate_type_nobody
    1611         ;
    1612 
    1613 aggregate_type_nobody:                                                                  // struct, union - {...}
    1614         aggregate_key attribute_list_opt no_attr_identifier_or_type_name
    1615                 {
    1616                         typedefTable.makeTypedef( *$3 );
    1617                         $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 );
    1618                 }
    16191572        | aggregate_key attribute_list_opt typegen_name         // CFA, S/R conflict
    16201573                { $$ = $3->addQualifiers( $2 ); }
     
    16941647        ;
    16951648
    1696 enum_type:                                                                                              // enum
     1649enum_type:
    16971650        ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
    16981651                { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); }
     1652        | ENUM attribute_list_opt no_attr_identifier_or_type_name
     1653                {
     1654                        typedefTable.makeTypedef( *$3 );
     1655                        $$ = DeclarationNode::newEnum( $3, 0, false )->addQualifiers( $2 );
     1656                }
    16991657        | ENUM attribute_list_opt no_attr_identifier_or_type_name
    17001658                { typedefTable.makeTypedef( *$3 ); }
    17011659          '{' enumerator_list comma_opt '}'
    17021660                { $$ = DeclarationNode::newEnum( $3, $6, true )->addQualifiers( $2 ); }
    1703         | enum_type_nobody
    1704         ;
    1705 
    1706 enum_type_nobody:                                                                               // enum - {...}
    1707         ENUM attribute_list_opt no_attr_identifier_or_type_name
    1708                 {
    1709                         typedefTable.makeTypedef( *$3 );
    1710                         $$ = DeclarationNode::newEnum( $3, 0, false )->addQualifiers( $2 );
    1711                 }
    17121661        ;
    17131662
     
    18101759
    18111760parameter_declaration:
    1812                 // No SUE declaration in parameter list.
    1813         declaration_specifier_nobody identifier_parameter_declarator assignment_opt
     1761        declaration_specifier identifier_parameter_declarator assignment_opt
    18141762                {
    18151763                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    18161764                        $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr );
    18171765                }
    1818         | declaration_specifier_nobody type_parameter_redeclarator assignment_opt
     1766        | declaration_specifier type_parameter_redeclarator assignment_opt
    18191767                {
    18201768                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    18241772
    18251773abstract_parameter_declaration:
    1826         declaration_specifier_nobody assignment_opt
     1774        declaration_specifier assignment_opt
    18271775                { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
    1828         | declaration_specifier_nobody abstract_parameter_declarator assignment_opt
     1776        | declaration_specifier abstract_parameter_declarator assignment_opt
    18291777                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    18301778        ;
     
    28502798
    28512799cfa_identifier_parameter_ptr:                                                   // CFA
    2852                 // No SUE declaration in parameter list.
    2853         ptrref_operator type_specifier_nobody
     2800        ptrref_operator type_specifier
    28542801                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    2855         | type_qualifier_list ptrref_operator type_specifier_nobody
     2802        | type_qualifier_list ptrref_operator type_specifier
    28562803                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    28572804        | ptrref_operator cfa_abstract_function
     
    28682815                // Only the first dimension can be empty or have qualifiers. Empty dimension must be factored out due to
    28692816                // shift/reduce conflict with new-style empty (void) function return type.
    2870         '[' ']' type_specifier_nobody
     2817        '[' ']' type_specifier
    28712818                { $$ = $3->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    2872         | cfa_array_parameter_1st_dimension type_specifier_nobody
     2819        | cfa_array_parameter_1st_dimension type_specifier
    28732820                { $$ = $2->addNewArray( $1 ); }
    2874         | '[' ']' multi_array_dimension type_specifier_nobody
     2821        | '[' ']' multi_array_dimension type_specifier
    28752822                { $$ = $4->addNewArray( $3 )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    2876         | cfa_array_parameter_1st_dimension multi_array_dimension type_specifier_nobody
     2823        | cfa_array_parameter_1st_dimension multi_array_dimension type_specifier
    28772824                { $$ = $3->addNewArray( $2 )->addNewArray( $1 ); }
    2878         | multi_array_dimension type_specifier_nobody
     2825        | multi_array_dimension type_specifier
    28792826                { $$ = $2->addNewArray( $1 ); }
    28802827
Note: See TracChangeset for help on using the changeset viewer.