Ignore:
Timestamp:
Feb 28, 2017, 4:44:00 PM (9 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
be65cca
Parents:
1e6b350 (diff), 20221d4 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r1e6b350 r60401b76  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 23 15:23:49 2017
    13 // Update Count     : 2187
     12// Last Modified On : Tue Feb 28 09:58:10 2017
     13// Update Count     : 2208
    1414//
    1515
     
    196196
    197197%type<aggKey> aggregate_key
    198 %type<decl>  aggregate_type
     198%type<decl> aggregate_type aggregate_type_nobody
    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 declarator declaring_list
    210 
    211 %type<decl> elaborated_type
    212 
    213 %type<decl> enumerator_list enum_type
     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
    214214%type<en> enumerator_value_opt
    215215
     
    251251%type<decl> storage_class storage_class_list
    252252
    253 %type<decl> sue_declaration_specifier sue_type_specifier
     253%type<decl> sue_declaration_specifier sue_declaration_specifier_nobody sue_type_specifier sue_type_specifier_nobody
    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
     270%type<decl> type_qualifier type_qualifier_name type_qualifier_list type_qualifier_list_opt type_specifier type_specifier_nobody
    271271
    272272%type<decl> variable_declarator variable_ptr variable_array variable_function
     
    973973
    974974exception_declaration:
    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
     975                // No SUE declaration in parameter list.
     976        type_specifier_nobody
     977        | type_specifier_nobody declarator
    982978                {
    983979                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    984980                        $$ = $2->addType( $1 );
    985981                }
    986         | type_specifier variable_abstract_declarator
     982        | type_specifier_nobody variable_abstract_declarator
    987983                { $$ = $2->addType( $1 ); }
    988984        | cfa_abstract_declarator_tuple no_attr_identifier      // CFA
     
    13491345        ;
    13501346
    1351 type_specifier:                                                                                 // declaration specifier - storage class
     1347declaration_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
     1359type_specifier:                                                                                 // type specifier
    13521360        basic_type_specifier
    13531361        | sue_type_specifier
     1362        | typedef_type_specifier
     1363        | typegen_type_specifier
     1364        ;
     1365
     1366type_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
    13541374        | typedef_type_specifier
    13551375        | typegen_type_specifier
     
    15141534        ;
    15151535
    1516 sue_declaration_specifier:
     1536sue_declaration_specifier:                                                              // struct, union, enum + storage class + type specifier
    15171537        sue_type_specifier
    15181538        | declaration_qualifier_list sue_type_specifier
     
    15241544        ;
    15251545
    1526 sue_type_specifier:
    1527         elaborated_type                                                                         // struct, union, enum
     1546sue_type_specifier:                                                                             // struct, union, enum + type specifier
     1547        elaborated_type
    15281548        | type_qualifier_list elaborated_type
    15291549                { $$ = $2->addQualifiers( $1 ); }
    15301550        | sue_type_specifier type_qualifier
     1551                { $$ = $1->addQualifiers( $2 ); }
     1552        ;
     1553
     1554sue_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
     1564sue_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
    15311569                { $$ = $1->addQualifiers( $2 ); }
    15321570        ;
     
    15511589        ;
    15521590
    1553 elaborated_type:
     1591elaborated_type:                                                                                // struct, union, enum
    15541592        aggregate_type
    15551593        | enum_type
    15561594        ;
    15571595
    1558 aggregate_type:
     1596elaborated_type_nobody:                                                                 // struct, union, enum - {...}
     1597        aggregate_type_nobody
     1598        | enum_type_nobody
     1599        ;
     1600
     1601aggregate_type:                                                                                 // struct, union
    15591602        aggregate_key attribute_list_opt '{' field_declaration_list '}'
    15601603                { $$ = 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                 }
    15661604        | aggregate_key attribute_list_opt no_attr_identifier_or_type_name
    15671605                { typedefTable.makeTypedef( *$3 ); }
     
    15701608        | aggregate_key attribute_list_opt '(' type_name_list ')' '{' field_declaration_list '}' // CFA
    15711609                { $$ = DeclarationNode::newAggregate( $1, nullptr, $4, $7, false )->addQualifiers( $2 ); }
     1610        | aggregate_type_nobody
     1611        ;
     1612
     1613aggregate_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                }
    15721619        | aggregate_key attribute_list_opt typegen_name         // CFA, S/R conflict
    15731620                { $$ = $3->addQualifiers( $2 ); }
     
    16471694        ;
    16481695
    1649 enum_type:
     1696enum_type:                                                                                              // enum
    16501697        ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
    16511698                { $$ = 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                 }
    16571699        | ENUM attribute_list_opt no_attr_identifier_or_type_name
    16581700                { typedefTable.makeTypedef( *$3 ); }
    16591701          '{' enumerator_list comma_opt '}'
    16601702                { $$ = DeclarationNode::newEnum( $3, $6, true )->addQualifiers( $2 ); }
     1703        | enum_type_nobody
     1704        ;
     1705
     1706enum_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                }
    16611712        ;
    16621713
     
    17591810
    17601811parameter_declaration:
    1761         declaration_specifier identifier_parameter_declarator assignment_opt
     1812                // No SUE declaration in parameter list.
     1813        declaration_specifier_nobody identifier_parameter_declarator assignment_opt
    17621814                {
    17631815                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    17641816                        $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr );
    17651817                }
    1766         | declaration_specifier type_parameter_redeclarator assignment_opt
     1818        | declaration_specifier_nobody type_parameter_redeclarator assignment_opt
    17671819                {
    17681820                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    17721824
    17731825abstract_parameter_declaration:
    1774         declaration_specifier assignment_opt
     1826        declaration_specifier_nobody assignment_opt
    17751827                { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
    1776         | declaration_specifier abstract_parameter_declarator assignment_opt
     1828        | declaration_specifier_nobody abstract_parameter_declarator assignment_opt
    17771829                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    17781830        ;
     
    27982850
    27992851cfa_identifier_parameter_ptr:                                                   // CFA
    2800         ptrref_operator type_specifier
     2852                // No SUE declaration in parameter list.
     2853        ptrref_operator type_specifier_nobody
    28012854                { $$ = $2->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
    2802         | type_qualifier_list ptrref_operator type_specifier
     2855        | type_qualifier_list ptrref_operator type_specifier_nobody
    28032856                { $$ = $3->addNewPointer( DeclarationNode::newPointer( $1 ) ); }
    28042857        | ptrref_operator cfa_abstract_function
     
    28152868                // Only the first dimension can be empty or have qualifiers. Empty dimension must be factored out due to
    28162869                // shift/reduce conflict with new-style empty (void) function return type.
    2817         '[' ']' type_specifier
     2870        '[' ']' type_specifier_nobody
    28182871                { $$ = $3->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    2819         | cfa_array_parameter_1st_dimension type_specifier
     2872        | cfa_array_parameter_1st_dimension type_specifier_nobody
    28202873                { $$ = $2->addNewArray( $1 ); }
    2821         | '[' ']' multi_array_dimension type_specifier
     2874        | '[' ']' multi_array_dimension type_specifier_nobody
    28222875                { $$ = $4->addNewArray( $3 )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
    2823         | cfa_array_parameter_1st_dimension multi_array_dimension type_specifier
     2876        | cfa_array_parameter_1st_dimension multi_array_dimension type_specifier_nobody
    28242877                { $$ = $3->addNewArray( $2 )->addNewArray( $1 ); }
    2825         | multi_array_dimension type_specifier
     2878        | multi_array_dimension type_specifier_nobody
    28262879                { $$ = $2->addNewArray( $1 ); }
    28272880
Note: See TracChangeset for help on using the changeset viewer.