Changeset 6d01d89


Ignore:
Timestamp:
Feb 14, 2019, 10:21:41 PM (5 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, persistent-indexer, pthread-emulation, qualifiedEnum
Children:
85d44c6
Parents:
65a7050
Message:

add for-control list

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r65a7050 r6d01d89  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Nov  8 18:08:23 2018
    13 // Update Count     : 4052
     12// Last Modified On : Thu Feb 14 18:02:44 2019
     13// Update Count     : 4216
    1414//
    1515
     
    9999        // distribute declaration_specifier across all declared variables, e.g., static, const, __attribute__.
    100100        DeclarationNode * cur = declList, * cl = (new DeclarationNode)->addType( specifier );
    101         //cur->addType( specifier );
    102         for ( cur = dynamic_cast< DeclarationNode * >( cur->get_next() ); cur != nullptr; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ) ) {
     101        for ( cur = dynamic_cast<DeclarationNode *>( cur->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) {
    103102                cl->cloneBaseType( cur );
    104103        } // for
    105104        declList->addType( cl );
    106 //      delete cl;
    107105        return declList;
    108106} // distAttr
     
    201199        if ( NameExpr * identifier = dynamic_cast<NameExpr *>(index->get_expr()) ) {
    202200                return forCtrl( type, new string( identifier->name ), start, compop, comp, inc );
     201        } else if ( CommaExpr * commaExpr = dynamic_cast<CommaExpr *>(index->get_expr()) ) {
     202                if ( NameExpr * identifier = dynamic_cast<NameExpr *>(commaExpr->arg1 ) ) {
     203                        return forCtrl( type, new string( identifier->name ), start, compop, comp, inc );
     204                } else {
     205                        SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); return nullptr;
     206                } // if
    203207        } else {
    204208                SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); return nullptr;
     
    324328%type<en> argument_expression_list              argument_expression                     default_initialize_opt
    325329%type<ifctl> if_control_expression
    326 %type<fctl> for_control_expression
     330%type<fctl> for_control_expression              for_control_expression_list
    327331%type<compop> inclexcl
    328332%type<en> subrange
     
    984988                // labels cannot be identifiers 0 or 1 or ATTR_IDENTIFIER
    985989        identifier_or_type_name ':' attribute_list_opt statement
    986                 {
    987                         $$ = $4->add_label( $1, $3 );
    988                 }
     990                { $$ = $4->add_label( $1, $3 ); }
    989991        ;
    990992
     
    10021004        statement_decl
    10031005        | statement_decl_list statement_decl
    1004                 { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
     1006                { assert( $1 ); $1->set_last( $2 ); $$ = $1; }
    10051007        ;
    10061008
     
    10091011                { $$ = new StatementNode( $1 ); }
    10101012        | EXTENSION declaration                                                         // GCC
    1011                 {
    1012                         distExt( $2 );
    1013                         $$ = new StatementNode( $2 );
    1014                 }
     1013                { distExt( $2 ); $$ = new StatementNode( $2 ); }
    10151014        | function_definition
    10161015                { $$ = new StatementNode( $1 ); }
    10171016        | EXTENSION function_definition                                         // GCC
    1018                 {
    1019                         distExt( $2 );
    1020                         $$ = new StatementNode( $2 );
    1021                 }
     1017                { distExt( $2 ); $$ = new StatementNode( $2 ); }
    10221018        | statement
    10231019        ;
     
    10261022        statement
    10271023        | statement_list_nodecl statement
    1028                 { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
     1024                { assert( $1 ); $1->set_last( $2 ); $$ = $1; }
    10291025        ;
    10301026
     
    11381134        | DO statement WHILE '(' ')' ';'                                        // CFA => do while( 1 )
    11391135                { $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), $2 ) ); }
    1140         | FOR '(' push for_control_expression ')' statement pop
     1136        | FOR '(' push for_control_expression_list ')' statement pop
    11411137                { $$ = new StatementNode( build_for( $4, $6 ) ); }
    11421138        | FOR '(' ')' statement                                                         // CFA => for ( ;; )
     
    11441140        ;
    11451141
     1142for_control_expression_list:
     1143        for_control_expression
     1144        | for_control_expression_list ':' for_control_expression
     1145                { $$ = $3; }
     1146        ;
     1147
    11461148for_control_expression:
    1147         comma_expression                                                                        // CFA
     1149        ';' comma_expression_opt ';' comma_expression_opt
     1150                { $$ = new ForCtrl( (ExpressionNode * )nullptr, $2, $4 ); }
     1151        | comma_expression ';' comma_expression_opt ';' comma_expression_opt
     1152                { $$ = new ForCtrl( $1, $3, $5 ); }
     1153        | declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
     1154                { $$ = new ForCtrl( $1, $2, $4 ); }
     1155        | comma_expression                                                                      // CFA
    11481156                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
    11491157                                                OperKinds::LThan, $1->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1150         | constant_expression inclexcl constant_expression      // CFA
     1158        | comma_expression inclexcl comma_expression            // CFA
    11511159                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1152         | constant_expression inclexcl constant_expression '~' constant_expression // CFA
     1160        | comma_expression inclexcl comma_expression '~' comma_expression // CFA
    11531161                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, $5 ); }
    11541162        | comma_expression ';' comma_expression                         // CFA
    11551163                { $$ = forCtrl( $3, $1, new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
    11561164                                                OperKinds::LThan, $3->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1157         | comma_expression ';' constant_expression inclexcl constant_expression // CFA
     1165        | comma_expression ';' comma_expression inclexcl comma_expression // CFA
    11581166                { $$ = forCtrl( $3, $1, $3->clone(), $4, $5, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1159         | comma_expression ';' constant_expression inclexcl constant_expression '~' constant_expression // CFA
     1167        | comma_expression ';' comma_expression inclexcl comma_expression '~' comma_expression // CFA
    11601168                { $$ = forCtrl( $3, $1, $3->clone(), $4, $5, $7 ); }
    1161         | comma_expression ';' comma_expression_opt ';' comma_expression_opt
    1162                 { $$ = new ForCtrl( $1, $3, $5 ); }
    1163         | ';' comma_expression_opt ';' comma_expression_opt
    1164                 { $$ = new ForCtrl( (ExpressionNode * )nullptr, $2, $4 ); }
    1165         | declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
    1166                 { $$ = new ForCtrl( $1, $2, $4 ); }
    11671169        ;
    11681170
Note: See TracChangeset for help on using the changeset viewer.