Changeset f271bdd


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

Location:
src/Parser
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ParseNode.h

    rac3362c rf271bdd  
    1010// Created On       : Sat May 16 13:28:16 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 20 14:56:30 2018
    13 // Update Count     : 850
     12// Last Modified On : Sat Aug  4 09:39:40 2018
     13// Update Count     : 853
    1414//
    1515
     
    132132        void printOneLine( __attribute__((unused)) std::ostream & os, __attribute__((unused)) int indent = 0 ) const {}
    133133
     134        Expression *get_expr() const { return expr.get(); }
    134135        template<typename T>
    135136        bool isExpressionType() const { return nullptr != dynamic_cast<T>(expr.get()); }
     
    390391Statement * build_expr( ExpressionNode * ctl );
    391392
    392 struct IfCtl {
    393         IfCtl( DeclarationNode * decl, ExpressionNode * condition ) :
     393struct IfCtrl {
     394        IfCtrl( DeclarationNode * decl, ExpressionNode * condition ) :
    394395                init( decl ? new StatementNode( decl ) : nullptr ), condition( condition ) {}
    395396
     
    398399};
    399400
    400 struct ForCtl {
    401         ForCtl( ExpressionNode * expr, ExpressionNode * condition, ExpressionNode * change ) :
     401struct ForCtrl {
     402        ForCtrl( ExpressionNode * expr, ExpressionNode * condition, ExpressionNode * change ) :
    402403                init( new StatementNode( build_expr( expr ) ) ), condition( condition ), change( change ) {}
    403         ForCtl( DeclarationNode * decl, ExpressionNode * condition, ExpressionNode * change ) :
     404        ForCtrl( DeclarationNode * decl, ExpressionNode * condition, ExpressionNode * change ) :
    404405                init( new StatementNode( decl ) ), condition( condition ), change( change ) {}
    405406
     
    409410};
    410411
    411 Expression * build_if_control( IfCtl * ctl, std::list< Statement * > & init );
    412 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt );
     412Expression * build_if_control( IfCtrl * ctl, std::list< Statement * > & init );
     413Statement * build_if( IfCtrl * ctl, StatementNode * then_stmt, StatementNode * else_stmt );
    413414Statement * build_switch( bool isSwitch, ExpressionNode * ctl, StatementNode * stmt );
    414415Statement * build_case( ExpressionNode * ctl );
    415416Statement * build_default();
    416 Statement * build_while( IfCtl * ctl, StatementNode * stmt );
     417Statement * build_while( IfCtrl * ctl, StatementNode * stmt );
    417418Statement * build_do_while( ExpressionNode * ctl, StatementNode * stmt );
    418 Statement * build_for( ForCtl * forctl, StatementNode * stmt );
     419Statement * build_for( ForCtrl * forctl, StatementNode * stmt );
    419420Statement * build_branch( BranchStmt::Type kind );
    420421Statement * build_branch( std::string * identifier, BranchStmt::Type kind );
  • src/Parser/StatementNode.cc

    rac3362c rf271bdd  
    1010// Created On       : Sat May 16 14:59:41 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jun  5 08:58:34 2018
    13 // Update Count     : 362
     12// Last Modified On : Sat Aug  4 09:39:25 2018
     13// Update Count     : 363
    1414//
    1515
     
    7878} // build_expr
    7979
    80 Expression * build_if_control( IfCtl * ctl, std::list< Statement * > & init ) {
     80Expression * build_if_control( IfCtrl * ctl, std::list< Statement * > & init ) {
    8181        if ( ctl->init != 0 ) {
    8282                buildMoveList( ctl->init, init );
     
    100100} // build_if_control
    101101
    102 Statement * build_if( IfCtl * ctl, StatementNode * then_stmt, StatementNode * else_stmt ) {
     102Statement * build_if( IfCtrl * ctl, StatementNode * then_stmt, StatementNode * else_stmt ) {
    103103        Statement * thenb, * elseb = nullptr;
    104104        std::list< Statement * > branches;
     
    145145} // build_default
    146146
    147 Statement * build_while( IfCtl * ctl, StatementNode * stmt ) {
     147Statement * build_while( IfCtrl * ctl, StatementNode * stmt ) {
    148148        std::list< Statement * > branches;
    149149        buildMoveList< Statement, StatementNode >( stmt, branches );
     
    164164} // build_do_while
    165165
    166 Statement * build_for( ForCtl * forctl, StatementNode * stmt ) {
     166Statement * build_for( ForCtrl * forctl, StatementNode * stmt ) {
    167167        std::list< Statement * > branches;
    168168        buildMoveList< Statement, StatementNode >( stmt, branches );
  • 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.