Changeset 35718a9


Ignore:
Timestamp:
May 30, 2018, 9:28:14 PM (4 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, with_gc
Children:
94b1022a
Parents:
cb4bbb6
Message:

more push/pop updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rcb4bbb6 r35718a9  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 29 07:24:32 2018
    13 // Update Count     : 3387
     12// Last Modified On : Wed May 30 20:29:03 2018
     13// Update Count     : 3432
    1414//
    1515
     
    330330%type<decl> c_declaration static_assert
    331331%type<decl> KR_function_declarator KR_function_no_ptr KR_function_ptr KR_function_array
    332 %type<decl> KR_declaration_list KR_declaration_list_opt
     332%type<decl> KR_parameter_list KR_parameter_list_opt
    333333
    334334%type<decl> parameter_declaration parameter_list parameter_type_list_opt
     
    892892        '{' '}'
    893893                { $$ = new StatementNode( build_compound( (StatementNode *)0 ) ); }
    894         | '{'
    895                 // Two scopes are necessary because the block itself has a scope, but every declaration within the block also
    896                 // requires its own scope.
    897           push push
     894        | '{' push
    898895          local_label_declaration_opt                                           // GCC, local labels
    899896          statement_decl_list                                                           // C99, intermix declarations and statements
    900897          pop '}'
    901                 { $$ = new StatementNode( build_compound( $5 ) ); }
     898                { $$ = new StatementNode( build_compound( $4 ) ); }
    902899        ;
    903900
    904901statement_decl_list:                                                                    // C99
    905902        statement_decl
    906         | statement_decl_list push statement_decl
    907                 { if ( $1 != 0 ) { $1->set_last( $3 ); $$ = $1; } }
     903        | statement_decl_list statement_decl
     904                { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
    908905        ;
    909906
     
    923920                        $$ = new StatementNode( $2 );
    924921                }
    925         | statement pop
     922        | statement
    926923        ;
    927924
     
    938935
    939936selection_statement:
    940         IF '(' push if_control_expression ')' statement         %prec THEN
     937        IF '(' push if_control_expression ')' statement pop             %prec THEN
    941938                // explicitly deal with the shift/reduce conflict on if/else
    942939                { $$ = new StatementNode( build_if( $4, $6, nullptr ) ); }
    943         | IF '(' push if_control_expression ')' statement ELSE statement
     940        | IF '(' push if_control_expression ')' statement ELSE statement pop
    944941                { $$ = new StatementNode( build_if( $4, $6, $8 ) ); }
    945942        | SWITCH '(' comma_expression ')' case_clause
    946943                { $$ = new StatementNode( build_switch( true, $3, $5 ) ); }
    947         | SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA
     944        | SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt pop '}' // CFA
    948945                {
    949946                        StatementNode *sw = new StatementNode( build_switch( true, $3, $8 ) );
     
    957954        | CHOOSE '(' comma_expression ')' case_clause           // CFA
    958955                { $$ = new StatementNode( build_switch( false, $3, $5 ) ); }
    959         | CHOOSE '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA
     956        | CHOOSE '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt pop '}' // CFA
    960957                {
    961958                        StatementNode *sw = new StatementNode( build_switch( false, $3, $8 ) );
     
    965962
    966963if_control_expression:
    967         comma_expression pop
     964        comma_expression
    968965                { $$ = new IfCtl( nullptr, $1 ); }
    969         | c_declaration pop                                                                     // no semi-colon
     966        | c_declaration                                                                         // no semi-colon
    970967                { $$ = new IfCtl( $1, nullptr ); }
    971         | cfa_declaration pop                                                           // no semi-colon
     968        | cfa_declaration                                                                       // no semi-colon
    972969                { $$ = new IfCtl( $1, nullptr ); }
    973970        | declaration comma_expression                                          // semi-colon separated
     
    10301027        | DO statement WHILE '(' comma_expression ')' ';'
    10311028                { $$ = new StatementNode( build_while( $5, $2, true ) ); }
    1032         | FOR '(' push for_control_expression ')' statement
     1029        | FOR '(' push for_control_expression ')' statement pop
    10331030                { $$ = new StatementNode( build_for( $4, $6 ) ); }
    10341031        ;
    10351032
    10361033for_control_expression:
    1037         comma_expression_opt pop ';' comma_expression_opt ';' comma_expression_opt
    1038                 { $$ = new ForCtl( $1, $4, $6 ); }
     1034        comma_expression_opt ';' comma_expression_opt ';' comma_expression_opt
     1035                { $$ = new ForCtl( $1, $3, $5 ); }
    10391036        | declaration comma_expression_opt ';' comma_expression_opt // C99
    10401037                { $$ = new ForCtl( $1, $2, $4 ); }
     
    12651262
    12661263declaration_list_opt:                                                                   // used at beginning of switch statement
    1267         pop     // empty
     1264        // empty
    12681265                { $$ = nullptr; }
    12691266        | declaration_list
     
    12721269declaration_list:
    12731270        declaration
    1274         | declaration_list push declaration
    1275                 { $$ = $1->appendList( $3 ); }
    1276         ;
    1277 
    1278 KR_declaration_list_opt:                                                                // used to declare parameter types in K&R style functions
     1271        | declaration_list declaration
     1272                { $$ = $1->appendList( $2 ); }
     1273        ;
     1274
     1275KR_parameter_list_opt:                                                          // used to declare parameter types in K&R style functions
    12791276        // empty
    12801277                { $$ = nullptr; }
    1281         | KR_declaration_list
    1282         ;
    1283 
    1284 KR_declaration_list:
     1278        | KR_parameter_list
     1279        ;
     1280
     1281KR_parameter_list:
    12851282        push c_declaration pop ';'
    12861283                { $$ = $2; }
    1287         | KR_declaration_list push c_declaration pop ';'
     1284        | KR_parameter_list push c_declaration pop ';'
    12881285                { $$ = $1->appendList( $3 ); }
    12891286        ;
     
    13051302
    13061303declaration:                                                                                    // old & new style declarations
    1307         c_declaration pop ';'
    1308         | cfa_declaration pop ';'                                                       // CFA
     1304        c_declaration ';'
     1305        | cfa_declaration ';'                                                           // CFA
    13091306        | static_assert
    13101307        ;
     
    14141411        TYPEDEF cfa_variable_specifier
    14151412                {
    1416                         typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname );
     1413                        typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname /*, "1"*/ );
    14171414                        $$ = $2->addTypedef();
    14181415                }
    14191416        | TYPEDEF cfa_function_specifier
    14201417                {
    1421                         typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname );
     1418                        typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname /*, "2"*/ );
    14221419                        $$ = $2->addTypedef();
    14231420                }
    14241421        | cfa_typedef_declaration pop ',' push no_attr_identifier
    14251422                {
    1426                         typedefTable.addToEnclosingScope( *$5, TYPEDEFname );
     1423                        typedefTable.addToEnclosingScope( *$5, TYPEDEFname /*, "3"*/ );
    14271424                        $$ = $1->appendList( $1->cloneType( $5 ) );
    14281425                }
     
    14351432        TYPEDEF type_specifier declarator
    14361433                {
    1437                         typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname );
     1434                        typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname /*, "4"*/ );
    14381435                        $$ = $3->addType( $2 )->addTypedef();
    14391436                }
    14401437        | typedef_declaration pop ',' push declarator
    14411438                {
    1442                         typedefTable.addToEnclosingScope( *$5->name, TYPEDEFname );
     1439                        typedefTable.addToEnclosingScope( *$5->name, TYPEDEFname /*, "5"*/ );
    14431440                        $$ = $1->appendList( $1->cloneBaseType( $5 )->addTypedef() );
    14441441                }
    14451442        | type_qualifier_list TYPEDEF type_specifier declarator // remaining OBSOLESCENT (see 2 )
    14461443                {
    1447                         typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname );
     1444                        typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname /*, "6"*/ );
    14481445                        $$ = $4->addType( $3 )->addQualifiers( $1 )->addTypedef();
    14491446                }
    14501447        | type_specifier TYPEDEF declarator
    14511448                {
    1452                         typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname );
     1449                        typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname /*, "7"*/ );
    14531450                        $$ = $3->addType( $1 )->addTypedef();
    14541451                }
    14551452        | type_specifier TYPEDEF type_qualifier_list declarator
    14561453                {
    1457                         typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname );
     1454                        typedefTable.addToEnclosingScope( *$4->name, TYPEDEFname /*, "8"*/ );
    14581455                        $$ = $4->addQualifiers( $1 )->addTypedef()->addType( $1 );
    14591456                }
     
    15821579
    15831580forall:
    1584         FORALL '(' push type_parameter_list pop ')'                                     // CFA
    1585                 { $$ = DeclarationNode::newForall( $4 ); }
     1581        FORALL '(' type_parameter_list ')'                                      // CFA
     1582                { $$ = DeclarationNode::newForall( $3 ); }
    15861583        ;
    15871584
     
    21752172type_parameter:                                                                                 // CFA
    21762173        type_class no_attr_identifier_or_type_name
    2177                 { typedefTable.addToEnclosingScope( *$2, TYPEDEFname ); }
     2174                { typedefTable.addToScope( *$2, TYPEDEFname /*, "9"*/ ); }
    21782175          type_initializer_opt assertion_list_opt
    21792176                { $$ = DeclarationNode::newTypeParam( $1, $2 )->addTypeInitializer( $4 )->addAssertions( $5 ); }
     
    22112208        | '|' '{' push trait_declaration_list pop '}'
    22122209                { $$ = $4; }
    2213         | '|' '(' push type_parameter_list pop ')' '{' push trait_declaration_list pop '}' '(' type_list ')'
    2214                 { SemanticError( yylloc, "Generic data-type assertion is currently unimplemented." ); $$ = nullptr; }
     2210        // | '|' '(' push type_parameter_list pop ')' '{' push trait_declaration_list pop '}' '(' type_list ')'
     2211        //      { SemanticError( yylloc, "Generic data-type assertion is currently unimplemented." ); $$ = nullptr; }
    22152212        ;
    22162213
     
    22442241        no_attr_identifier_or_type_name
    22452242                {
    2246                         typedefTable.addToEnclosingScope( *$1, TYPEDEFname );
     2243                        typedefTable.addToEnclosingScope( *$1, TYPEDEFname /*, "10"*/ );
    22472244                        $$ = DeclarationNode::newTypeDecl( $1, 0 );
    22482245                }
    2249         | no_attr_identifier_or_type_name '(' push type_parameter_list pop ')'
    2250                 {
    2251                         typedefTable.addToEnclosingScope( *$1, TYPEGENname );
    2252                         $$ = DeclarationNode::newTypeDecl( $1, $4 );
     2246        | no_attr_identifier_or_type_name '(' type_parameter_list ')'
     2247                {
     2248                        typedefTable.addToEnclosingScope( *$1, TYPEGENname /*, "11"*/ );
     2249                        $$ = DeclarationNode::newTypeDecl( $1, $3 );
    22532250                }
    22542251        ;
    22552252
    22562253trait_specifier:                                                                                // CFA
    2257         TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{' '}'
    2258                 { $$ = DeclarationNode::newTrait( $2, $5, 0 ); }
    2259         | TRAIT no_attr_identifier_or_type_name '(' push type_parameter_list pop ')' '{' push trait_declaration_list pop '}'
    2260                 { $$ = DeclarationNode::newTrait( $2, $5, $10 ); }
     2254        TRAIT no_attr_identifier_or_type_name '(' type_parameter_list ')' '{' '}'
     2255                { $$ = DeclarationNode::newTrait( $2, $4, 0 ); }
     2256        | TRAIT no_attr_identifier_or_type_name '(' type_parameter_list ')' '{' push trait_declaration_list pop '}'
     2257                { $$ = DeclarationNode::newTrait( $2, $4, $8 ); }
    22612258        ;
    22622259
     
    22962293
    22972294external_definition_list:
    2298         external_definition
     2295        push external_definition pop
     2296                { $$ = $2; }
    22992297        | external_definition_list
    23002298                { forall = xxx; }
    2301           push external_definition
     2299          push external_definition pop
    23022300                { $$ = $1 ? $1->appendList( $4 ) : $4; }
    23032301        ;
     
    23212319                        linkage = LinkageSpec::linkageUpdate( yylloc, linkage, $2 );
    23222320                }
    2323           '{' external_definition_list_opt '}'
     2321                        // SKULLDUGGERY: Declarations in extern "X" need to be added to the current lexical scope.  However,
     2322                        // external_definition_list_opt creates a new scope that loses the types at the end of the extern block. The
     2323                        // correction is a pop/push (reverse order) to undo the push/pop from external_definition_list_opt.  This
     2324                        // trick works for nested extern "X"s, as each one undoes itself in the nesting.
     2325          '{' pop external_definition_list_opt push '}'
    23242326                {
    23252327                        linkage = linkageStack.top();
    23262328                        linkageStack.pop();
    2327                         $$ = $5;
     2329                        $$ = $6;
    23282330                }
    23292331        | EXTENSION external_definition                                         // GCC, multiple __extension__ allowed, meaning unknown
     
    23342336        | type_qualifier_list
    23352337                { if ( $1->type->forall ) xxx = forall = true; } // remember generic type
    2336           push '{' external_definition_list '}'                         // CFA, namespace
    2337                 {
    2338                         for ( DeclarationNode * iter = $5; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
     2338          '{' external_definition_list push '}'                  // CFA, namespace
     2339                {
     2340                        for ( DeclarationNode * iter = $4; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
    23392341                                if ( isMangled( iter->linkage ) ) {             // ignore extern "C"
    23402342                                        iter->addQualifiers( $1->clone() );
     
    23432345                        xxx = false;
    23442346                        delete $1;
    2345                         $$ = $5;
     2347                        $$ = $4;
    23462348                }
    23472349        | declaration_qualifier_list
    23482350                { if ( $1->type->forall ) xxx = forall = true; } // remember generic type
    2349           push '{' external_definition_list '}'                         // CFA, namespace
    2350                 {
    2351                         for ( DeclarationNode * iter = $5; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
     2351          '{' external_definition_list '}'                                       // CFA, namespace
     2352                {
     2353                        for ( DeclarationNode * iter = $4; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
    23522354                                if ( isMangled( iter->linkage ) ) {             // ignore extern "C"
    23532355                                        iter->addQualifiers( $1->clone() );
     
    23562358                        xxx = false;
    23572359                        delete $1;
    2358                         $$ = $5;
     2360                        $$ = $4;
    23592361                }
    23602362        | declaration_qualifier_list type_qualifier_list
     
    23632365                        if ( $2->type->forall ) xxx = forall = true; // remember generic type
    23642366                }
    2365           push '{' external_definition_list '}'                         // CFA, namespace
    2366                 {
    2367                         for ( DeclarationNode * iter = $6; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
     2367          '{' external_definition_list '}'                                      // CFA, namespace
     2368                {
     2369                        for ( DeclarationNode * iter = $5; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
    23682370                                if ( isMangled( iter->linkage ) && isMangled( $2->linkage ) ) { // ignore extern "C"
    23692371                                        iter->addQualifiers( $1->clone() );
     
    23742376                        delete $1;
    23752377                        delete $2;
    2376                         $$ = $6;
     2378                        $$ = $5;
    23772379                }
    23782380        ;
     
    23872389        | function_declarator compound_statement
    23882390                { $$ = $1->addFunctionBody( $2 ); }
    2389         | KR_function_declarator KR_declaration_list_opt compound_statement
     2391        | KR_function_declarator KR_parameter_list_opt compound_statement
    23902392                { $$ = $1->addOldDeclList( $2 )->addFunctionBody( $3 ); }
    23912393        ;
     
    24272429
    24282430                // Old-style K&R function definition, OBSOLESCENT (see 4)
    2429         | declaration_specifier KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement
     2431        | declaration_specifier KR_function_declarator KR_parameter_list_opt with_clause_opt compound_statement
    24302432                {
    24312433                        rebindForall( $1, $2 );
     
    24332435                }
    24342436                // handles default int return type, OBSOLESCENT (see 1)
    2435         | type_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement
     2437        | type_qualifier_list KR_function_declarator KR_parameter_list_opt with_clause_opt compound_statement
    24362438                { $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addQualifiers( $1 ); }
    24372439                // handles default int return type, OBSOLESCENT (see 1)
    2438         | declaration_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement
     2440        | declaration_qualifier_list KR_function_declarator KR_parameter_list_opt with_clause_opt compound_statement
    24392441                { $$ = $2->addOldDeclList( $3 )->addFunctionBody( $5, $4 )->addQualifiers( $1 ); }
    24402442                // handles default int return type, OBSOLESCENT (see 1)
    2441         | declaration_qualifier_list type_qualifier_list KR_function_declarator KR_declaration_list_opt with_clause_opt compound_statement
     2443        | declaration_qualifier_list type_qualifier_list KR_function_declarator KR_parameter_list_opt with_clause_opt compound_statement
    24422444                { $$ = $3->addOldDeclList( $4 )->addFunctionBody( $6, $5 )->addQualifiers( $2 )->addQualifiers( $1 ); }
    24432445        ;
     
    26842686        typedef
    26852687                // hide type name in enclosing scope by variable name
    2686                 { typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER ); }
     2688                { typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER /*, "ID"*/ ); }
    26872689        | '(' paren_type ')'
    26882690                { $$ = $2; }
     
    31743176        '[' push cfa_abstract_parameter_list pop ']'
    31753177                { $$ = DeclarationNode::newTuple( $3 ); }
    3176         | '[' push type_specifier_nobody ELLIPSIS ']'
     3178        | '[' push type_specifier_nobody ELLIPSIS pop ']'
    31773179                { SemanticError( yylloc, "Tuple array currently unimplemented." ); $$ = nullptr; }
    3178         | '[' push type_specifier_nobody ELLIPSIS constant_expression ']'
     3180        | '[' push type_specifier_nobody ELLIPSIS constant_expression pop ']'
    31793181                { SemanticError( yylloc, "Tuple array currently unimplemented." ); $$ = nullptr; }
    31803182        ;
Note: See TracChangeset for help on using the changeset viewer.