Ignore:
Timestamp:
Aug 4, 2018, 10:44:06 AM (3 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, no_list, persistent-indexer
Children:
1f32235, 4084928e, 51fcdbc7
Parents:
ac3362c
Message:

first attempt at extended for-crtl, name changes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rac3362c rf271bdd  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jul 25 15:54:35 2018
    13 // Update Count     : 3841
     12// Last Modified On : Sat Aug  4 09:38:36 2018
     13// Update Count     : 3986
    1414//
    1515
     
    186186} // fieldDecl
    187187
     188ForCtrl * forCtrl( ExpressionNode * type, string * index, ExpressionNode * start, ExpressionNode * comp, ExpressionNode * inc ) {
     189        return new ForCtrl(
     190                distAttr( DeclarationNode::newTypeof( type ), DeclarationNode::newName( index )->addInitializer( new InitializerNode( start ) ) ),
     191                new ExpressionNode( build_binary_val( OperKinds::LThan, new ExpressionNode( build_varref( new string( *index ) ) ), comp ) ),
     192                new ExpressionNode( build_binary_val( OperKinds::PlusAssn, new ExpressionNode( build_varref( new string( *index ) ) ), inc ) ) );
     193} // forCtrl
     194
     195
    188196bool forall = false, yyy = false;                                               // aggregate have one or more forall qualifiers ?
    189197
     
    217225        WaitForStmt * wfs;
    218226        Expression * constant;
    219         IfCtl * ifctl;
    220         ForCtl * fctl;
     227        IfCtrl * ifctl;
     228        ForCtrl * fctl;
    221229        LabelNode * label;
    222230        InitializerNode * in;
     
    10491057if_control_expression:
    10501058        comma_expression
    1051                 { $$ = new IfCtl( nullptr, $1 ); }
     1059                { $$ = new IfCtrl( nullptr, $1 ); }
    10521060        | c_declaration                                                                         // no semi-colon
    1053                 { $$ = new IfCtl( $1, nullptr ); }
     1061                { $$ = new IfCtrl( $1, nullptr ); }
    10541062        | cfa_declaration                                                                       // no semi-colon
    1055                 { $$ = new IfCtl( $1, nullptr ); }
     1063                { $$ = new IfCtrl( $1, nullptr ); }
    10561064        | declaration comma_expression                                          // semi-colon separated
    1057                 { $$ = new IfCtl( $1, $2 ); }
     1065                { $$ = new IfCtrl( $1, $2 ); }
    10581066        ;
    10591067
     
    11111119        WHILE '(' push if_control_expression ')' statement pop
    11121120                { $$ = new StatementNode( build_while( $4, $6 ) ); }
     1121        | WHILE '(' ')' statement                                                       // CFA => while ( 1 )
     1122                { $$ = new StatementNode( build_while( new IfCtrl( nullptr, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ), $4 ) ); }
    11131123        | DO statement WHILE '(' comma_expression ')' ';'
    11141124                { $$ = new StatementNode( build_do_while( $5, $2 ) ); }
     1125        | DO statement WHILE '(' ')' ';'                                        // CFA => do while( 1 )
     1126                { $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), $2 ) ); }
    11151127        | FOR '(' push for_control_expression ')' statement pop
    11161128                { $$ = new StatementNode( build_for( $4, $6 ) ); }
     
    11181130
    11191131for_control_expression:
    1120         comma_expression_opt ';' comma_expression_opt ';' comma_expression_opt
    1121                 { $$ = new ForCtl( $1, $3, $5 ); }
    1122         | declaration comma_expression_opt ';' comma_expression_opt // C99
    1123                 { $$ = new ForCtl( $1, $2, $4 ); }
     1132        comma_expression_opt                                                            // CFA
     1133                {
     1134                        if ( ! $1 ) {                                                           // => for ( ;; )
     1135                                $$ = new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr );
     1136                        } else {
     1137                                $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ), $1->clone(),
     1138                                                         new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) );
     1139                        } // if
     1140                }
     1141        | constant_expression '~' constant_expression           // CFA
     1142                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $3, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
     1143        | constant_expression '~' constant_expression '~' constant_expression // CFA
     1144                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $3, $5 ); }
     1145        | comma_expression_opt ';' comma_expression                     // CFA
     1146                {
     1147                        if ( ! $1 ) {
     1148                                SemanticError( yylloc, "Missing loop index." ); $$ = nullptr;
     1149                        } else if ( ! $3 ) {
     1150                                SemanticError( yylloc, "Missing loop range." ); $$ = nullptr;
     1151                        } else {
     1152                                if ( NameExpr *identifier = dynamic_cast<NameExpr *>($1->get_expr()) ) {
     1153                                        $$ = forCtrl( $3, new string( identifier->name ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ), $3->clone(),
     1154                                                                 new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) );
     1155                                } else {
     1156                                        SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); $$ = nullptr;
     1157                                } // if
     1158                        } // if
     1159                }
     1160        | comma_expression_opt ';' constant_expression '~' constant_expression // CFA
     1161                {
     1162                        if ( ! $1 ) {
     1163                                SemanticError( yylloc, "Missing loop index." ); $$ = nullptr;
     1164                        } else {
     1165                                if ( NameExpr *identifier = dynamic_cast<NameExpr *>($1->get_expr()) ) {
     1166                                        $$ = forCtrl( $3, new string( identifier->name ), $3->clone(), $5, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) );
     1167                                } else {
     1168                                        SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); $$ = nullptr;
     1169                                } // if
     1170                        } // if
     1171                }
     1172        | comma_expression_opt ';' constant_expression '~' constant_expression '~' constant_expression // CFA
     1173                {
     1174                        if ( ! $1 ) {
     1175                                SemanticError( yylloc, "Missing loop index." ); $$ = nullptr;
     1176                        } else {
     1177                                if ( NameExpr *identifier = dynamic_cast<NameExpr *>($1->get_expr()) ) {
     1178                                        $$ = forCtrl( $3, new string( identifier->name ), $3->clone(), $5, $7 );
     1179                                } else {
     1180                                        SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); $$ = nullptr;
     1181                                } // if
     1182                        } // if
     1183                }
     1184        | comma_expression_opt ';' comma_expression_opt ';' comma_expression_opt
     1185                { $$ = new ForCtrl( $1, $3, $5 ); }
     1186        | declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
     1187                { $$ = new ForCtrl( $1, $2, $4 ); }
    11241188        ;
    11251189
Note: See TracChangeset for help on using the changeset viewer.