Ignore:
Timestamp:
Aug 8, 2018, 10:57:58 PM (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:
3b2b37f
Parents:
b3763ca
Message:

second attempt to at extended for-ctrl

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    rb3763ca rcc22003  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Aug  4 09:38:36 2018
    13 // Update Count     : 3986
     12// Last Modified On : Wed Aug  8 17:50:07 2018
     13// Update Count     : 3998
    1414//
    1515
     
    186186} // fieldDecl
    187187
    188 ForCtrl * forCtrl( ExpressionNode * type, string * index, ExpressionNode * start, ExpressionNode * comp, ExpressionNode * inc ) {
     188ForCtrl * forCtrl( ExpressionNode * type, string * index, ExpressionNode * start, enum OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) {
    189189        return new ForCtrl(
    190190                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 ) ),
     191                new ExpressionNode( build_binary_val( compop, new ExpressionNode( build_varref( new string( *index ) ) ), comp ) ),
    192192                new ExpressionNode( build_binary_val( OperKinds::PlusAssn, new ExpressionNode( build_varref( new string( *index ) ) ), inc ) ) );
    193193} // forCtrl
     
    227227        IfCtrl * ifctl;
    228228        ForCtrl * fctl;
     229        enum OperKinds compop;
    229230        LabelNode * label;
    230231        InitializerNode * in;
     
    289290%token ANDassign        ERassign        ORassign                                // &=   ^=      |=
    290291
     292%token Erange                                                                                   // ~=
    291293%token ATassign                                                                                 // @=
    292294
     
    311313%type<ifctl> if_control_expression
    312314%type<fctl> for_control_expression
     315%type<compop> inclexcl
    313316%type<en> subrange
    314317%type<decl> asm_name_opt
     
    11351138                                $$ = new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr );
    11361139                        } else {
    1137                                 $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ), $1->clone(),
     1140                                $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ), OperKinds::LThan, $1->clone(),
    11381141                                                         new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) );
    11391142                        } // if
    11401143                }
    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 ); }
     1144        | constant_expression inclexcl constant_expression      // CFA
     1145                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
     1146        | constant_expression inclexcl constant_expression '~' constant_expression // CFA
     1147                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, $5 ); }
    11451148        | comma_expression_opt ';' comma_expression                     // CFA
    11461149                {
     
    11511154                        } else {
    11521155                                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(),
     1156                                        $$ = forCtrl( $3, new string( identifier->name ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ), OperKinds::LThan, $3->clone(),
    11541157                                                                 new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) );
    11551158                                } else {
     
    11581161                        } // if
    11591162                }
    1160         | comma_expression_opt ';' constant_expression '~' constant_expression // CFA
     1163        | comma_expression_opt ';' constant_expression inclexcl constant_expression // CFA
    11611164                {
    11621165                        if ( ! $1 ) {
     
    11641167                        } else {
    11651168                                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" ) ) ) );
     1169                                        $$ = forCtrl( $3, new string( identifier->name ), $3->clone(), $4, $5, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) );
    11671170                                } else {
    11681171                                        SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); $$ = nullptr;
     
    11701173                        } // if
    11711174                }
    1172         | comma_expression_opt ';' constant_expression '~' constant_expression '~' constant_expression // CFA
     1175        | comma_expression_opt ';' constant_expression inclexcl constant_expression '~' constant_expression // CFA
    11731176                {
    11741177                        if ( ! $1 ) {
     
    11761179                        } else {
    11771180                                if ( NameExpr *identifier = dynamic_cast<NameExpr *>($1->get_expr()) ) {
    1178                                         $$ = forCtrl( $3, new string( identifier->name ), $3->clone(), $5, $7 );
     1181                                        $$ = forCtrl( $3, new string( identifier->name ), $3->clone(), $4, $5, $7 );
    11791182                                } else {
    11801183                                        SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); $$ = nullptr;
     
    11861189        | declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
    11871190                { $$ = new ForCtrl( $1, $2, $4 ); }
     1191        ;
     1192
     1193inclexcl:
     1194        '~'
     1195                { $$ = OperKinds::LThan; }
     1196        | Erange
     1197                { $$ = OperKinds::LEThan; }
    11881198        ;
    11891199
Note: See TracChangeset for help on using the changeset viewer.