Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rdd020c0 re7cc8cb  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar  3 21:35:28 2017
    13 // Update Count     : 2222
     12// Last Modified On : Thu Feb 16 15:56:33 2017
     13// Update Count     : 2186
    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
     
    14001380type_qualifier_name:
    14011381        CONST
    1402                 { $$ = DeclarationNode::newTypeQualifier( DeclarationNode::Const ); }
     1382                { $$ = DeclarationNode::newQualifier( DeclarationNode::Const ); }
    14031383        | RESTRICT
    1404                 { $$ = DeclarationNode::newTypeQualifier( DeclarationNode::Restrict ); }
     1384                { $$ = DeclarationNode::newQualifier( DeclarationNode::Restrict ); }
    14051385        | VOLATILE
    1406                 { $$ = DeclarationNode::newTypeQualifier( DeclarationNode::Volatile ); }
     1386                { $$ = DeclarationNode::newQualifier( DeclarationNode::Volatile ); }
    14071387        | LVALUE                                                                                        // CFA
    1408                 { $$ = DeclarationNode::newTypeQualifier( DeclarationNode::Lvalue ); }
     1388                { $$ = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); }
    14091389        | ATOMIC
    1410                 { $$ = DeclarationNode::newTypeQualifier( DeclarationNode::Atomic ); }
     1390                { $$ = DeclarationNode::newQualifier( DeclarationNode::Atomic ); }
    14111391        | FORALL '('
    14121392                {
     
    14481428        | REGISTER
    14491429                { $$ = DeclarationNode::newStorageClass( DeclarationNode::Register ); }
     1430        | INLINE                                                                                        // C99
     1431                //{ $$ = DeclarationNode::newStorageClass( DeclarationNode::Inline ); }
     1432                { $$ = new DeclarationNode; $$->isInline = true; }
     1433        | FORTRAN                                                                                       // C99
     1434                { $$ = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }
     1435        | NORETURN                                                                                      // C11
     1436                //{ $$ = DeclarationNode::newStorageClass( DeclarationNode::Noreturn ); }
     1437                { $$ = new DeclarationNode; $$->isNoreturn = true; }
    14501438        | THREADLOCAL                                                                           // C11
    14511439                { $$ = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); }
    1452                 // Put function specifiers here to simplify parsing rules, but separate them semantically.
    1453         | INLINE                                                                                        // C99
    1454                 { $$ = DeclarationNode::newFuncSpecifier( DeclarationNode::Inline ); }
    1455         | FORTRAN                                                                                       // C99
    1456                 { $$ = DeclarationNode::newFuncSpecifier( DeclarationNode::Fortran ); }
    1457         | NORETURN                                                                                      // C11
    1458                 { $$ = DeclarationNode::newFuncSpecifier( DeclarationNode::Noreturn ); }
    14591440        ;
    14601441
     
    15331514        ;
    15341515
    1535 sue_declaration_specifier:                                                              // struct, union, enum + storage class + type specifier
     1516sue_declaration_specifier:
    15361517        sue_type_specifier
    15371518        | declaration_qualifier_list sue_type_specifier
     
    15431524        ;
    15441525
    1545 sue_type_specifier:                                                                             // struct, union, enum + type specifier
    1546         elaborated_type
     1526sue_type_specifier:
     1527        elaborated_type                                                                         // struct, union, enum
    15471528        | type_qualifier_list elaborated_type
    15481529                { $$ = $2->addQualifiers( $1 ); }
    15491530        | sue_type_specifier type_qualifier
    1550                 { $$ = $1->addQualifiers( $2 ); }
    1551         ;
    1552 
    1553 sue_declaration_specifier_nobody:                                               // struct, union, enum - {...} + storage class + type specifier
    1554         sue_type_specifier_nobody
    1555         | declaration_qualifier_list sue_type_specifier_nobody
    1556                 { $$ = $2->addQualifiers( $1 ); }
    1557         | sue_declaration_specifier_nobody storage_class        // remaining OBSOLESCENT (see 2)
    1558                 { $$ = $1->addQualifiers( $2 ); }
    1559         | sue_declaration_specifier_nobody storage_class type_qualifier_list
    1560                 { $$ = $1->addQualifiers( $2 )->addQualifiers( $3 ); }
    1561         ;
    1562 
    1563 sue_type_specifier_nobody:                                                              // struct, union, enum - {...} + type specifier
    1564         elaborated_type_nobody
    1565         | type_qualifier_list elaborated_type_nobody
    1566                 { $$ = $2->addQualifiers( $1 ); }
    1567         | sue_type_specifier_nobody type_qualifier
    15681531                { $$ = $1->addQualifiers( $2 ); }
    15691532        ;
     
    15881551        ;
    15891552
    1590 elaborated_type:                                                                                // struct, union, enum
     1553elaborated_type:
    15911554        aggregate_type
    15921555        | enum_type
    15931556        ;
    15941557
    1595 elaborated_type_nobody:                                                                 // struct, union, enum - {...}
    1596         aggregate_type_nobody
    1597         | enum_type_nobody
    1598         ;
    1599 
    1600 aggregate_type:                                                                                 // struct, union
     1558aggregate_type:
    16011559        aggregate_key attribute_list_opt '{' field_declaration_list '}'
    16021560                { $$ = 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                }
    16031566        | aggregate_key attribute_list_opt no_attr_identifier_or_type_name
    16041567                { typedefTable.makeTypedef( *$3 ); }
     
    16071570        | aggregate_key attribute_list_opt '(' type_name_list ')' '{' field_declaration_list '}' // CFA
    16081571                { $$ = DeclarationNode::newAggregate( $1, nullptr, $4, $7, false )->addQualifiers( $2 ); }
    1609         | aggregate_type_nobody
    1610         ;
    1611 
    1612 aggregate_type_nobody:                                                                  // struct, union - {...}
    1613         aggregate_key attribute_list_opt no_attr_identifier_or_type_name
    1614                 {
    1615                         typedefTable.makeTypedef( *$3 );
    1616                         $$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 );
    1617                 }
    16181572        | aggregate_key attribute_list_opt typegen_name         // CFA, S/R conflict
    16191573                { $$ = $3->addQualifiers( $2 ); }
     
    16931647        ;
    16941648
    1695 enum_type:                                                                                              // enum
     1649enum_type:
    16961650        ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
    1697                 { $$ = DeclarationNode::newEnum( nullptr, $4, true )->addQualifiers( $2 ); }
     1651                { $$ = DeclarationNode::newEnum( nullptr, $4 )->addQualifiers( $2 ); }
     1652        | ENUM attribute_list_opt no_attr_identifier_or_type_name
     1653                {
     1654                        typedefTable.makeTypedef( *$3 );
     1655                        $$ = DeclarationNode::newEnum( $3, 0 )->addQualifiers( $2 );
     1656                }
    16981657        | ENUM attribute_list_opt no_attr_identifier_or_type_name
    16991658                { typedefTable.makeTypedef( *$3 ); }
    17001659          '{' enumerator_list comma_opt '}'
    1701                 { $$ = DeclarationNode::newEnum( $3, $6, true )->addQualifiers( $2 ); }
    1702         | enum_type_nobody
    1703         ;
    1704 
    1705 enum_type_nobody:                                                                               // enum - {...}
    1706         ENUM attribute_list_opt no_attr_identifier_or_type_name
    1707                 {
    1708                         typedefTable.makeTypedef( *$3 );
    1709                         $$ = DeclarationNode::newEnum( $3, 0, false )->addQualifiers( $2 );
    1710                 }
     1660                { $$ = DeclarationNode::newEnum( $3, $6 )->addQualifiers( $2 ); }
    17111661        ;
    17121662
     
    18091759
    18101760parameter_declaration:
    1811                 // No SUE declaration in parameter list.
    1812         declaration_specifier_nobody identifier_parameter_declarator assignment_opt
     1761        declaration_specifier identifier_parameter_declarator assignment_opt
    18131762                {
    18141763                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    18151764                        $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr );
    18161765                }
    1817         | declaration_specifier_nobody type_parameter_redeclarator assignment_opt
     1766        | declaration_specifier type_parameter_redeclarator assignment_opt
    18181767                {
    18191768                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    18231772
    18241773abstract_parameter_declaration:
    1825         declaration_specifier_nobody assignment_opt
     1774        declaration_specifier assignment_opt
    18261775                { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
    1827         | declaration_specifier_nobody abstract_parameter_declarator assignment_opt
     1776        | declaration_specifier abstract_parameter_declarator assignment_opt
    18281777                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    18291778        ;
     
    28492798
    28502799cfa_identifier_parameter_ptr:                                                   // CFA
    2851                 // No SUE declaration in parameter list.
    2852         ptrref_operator type_specifier_nobody
     2800        ptrref_operator type_specifier
    28532801                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    2854         | type_qualifier_list ptrref_operator type_specifier_nobody
     2802        | type_qualifier_list ptrref_operator type_specifier
    28552803                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    28562804        | ptrref_operator cfa_abstract_function
     
    28672815                // Only the first dimension can be empty or have qualifiers. Empty dimension must be factored out due to
    28682816                // shift/reduce conflict with new-style empty (void) function return type.
    2869         '[' ']' type_specifier_nobody
     2817        '[' ']' type_specifier
    28702818                { $$ = $3->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    2871         | cfa_array_parameter_1st_dimension type_specifier_nobody
     2819        | cfa_array_parameter_1st_dimension type_specifier
    28722820                { $$ = $2->addNewArray( $1 ); }
    2873         | '[' ']' multi_array_dimension type_specifier_nobody
     2821        | '[' ']' multi_array_dimension type_specifier
    28742822                { $$ = $4->addNewArray( $3 )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    2875         | cfa_array_parameter_1st_dimension multi_array_dimension type_specifier_nobody
     2823        | cfa_array_parameter_1st_dimension multi_array_dimension type_specifier
    28762824                { $$ = $3->addNewArray( $2 )->addNewArray( $1 ); }
    2877         | multi_array_dimension type_specifier_nobody
     2825        | multi_array_dimension type_specifier
    28782826                { $$ = $2->addNewArray( $1 ); }
    28792827
Note: See TracChangeset for help on using the changeset viewer.