Ignore:
Timestamp:
Jul 3, 2024, 5:32:06 PM (7 weeks ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
39cf5cc
Parents:
597f284
Message:

Change (enum) range loop so that it works on any type that define succ() and upperBound()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r597f284 r6d2b3dc  
    275275} // forCtrl
    276276
    277 ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, __attribute__((unused)) OperKinds compop, ExpressionNode * range_over_expr ) {
     277ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, OperKinds compop, ExpressionNode * range_over_expr, DeclarationNode * type ) {
     278        assert( compop == OperKinds::LEThan || compop == OperKinds::GEThan );
    278279        if ( auto identifier = dynamic_cast<ast::NameExpr *>(index_expr->expr.get()) ) {
    279                 DeclarationNode * indexDecl = DeclarationNode::newName( new std::string(identifier->name) );
    280                 assert( range_over_expr );
     280                DeclarationNode * indexDecl =
     281                        DeclarationNode::newName( new std::string(identifier->name) )->addType( type );
    281282                return new ForCtrl( new StatementNode( indexDecl ), range_over_expr, compop );
    282283        } else {
     
    16051606                { SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; }
    16061607
    1607         | comma_expression ';' enum_key                                         // CFA, enum type
    1608                 {
    1609                         $$ = enumRangeCtrl( $1, OperKinds::LEThan, new ExpressionNode( new ast::TypeExpr( yylloc, $3->buildType() ) ) );
     1608        | comma_expression ';' type_type_specifier                                              // CFA, enum type
     1609                {
     1610                        $$ = enumRangeCtrl( $1, OperKinds::LEThan, new ExpressionNode( new ast::TypeExpr( yylloc, $3->clone()->buildType() ) ), $3 );
    16101611                }
    16111612        | comma_expression ';' downupdowneq enum_key            // CFA, enum type, reverse direction
     
    16151616                                $3 = OperKinds::GEThan;
    16161617                        } // if
    1617                         $$ = enumRangeCtrl( $1, $3, new ExpressionNode( new ast::TypeExpr( yylloc, $4->buildType() ) ) );
     1618                        $$ = enumRangeCtrl( $1, $3, new ExpressionNode( new ast::TypeExpr( yylloc, $4->clone()->buildType() ) ), $4 );
    16181619                }
    16191620        ;
     
    16211622enum_key:
    16221623        type_name
    1623                 { $$ = DeclarationNode::newEnum( $1->symbolic.name, nullptr, false, false ); }
     1624                {       typedefTable.makeTypedef( *$1->symbolic.name, "enum_type_nobody 1" );
     1625                        $$ = DeclarationNode::newEnum( $1->symbolic.name, nullptr, false, false ); }
    16241626        | ENUM identifier
    1625                 { $$ = DeclarationNode::newEnum( $2, nullptr, false, false ); }
     1627                {       typedefTable.makeTypedef( *$2, "enum_type_nobody 2" );
     1628                        $$ = DeclarationNode::newEnum( $2, nullptr, false, false ); }
    16261629        | ENUM type_name
    1627                 { $$ = DeclarationNode::newEnum( $2->symbolic.name, nullptr, false, false ); }
     1630                {       typedefTable.makeTypedef( *$2->symbolic.name, "enum_type_nobody 3" );
     1631                        $$ = DeclarationNode::newEnum( $2->symbolic.name, nullptr, false, false ); }
    16281632        ;
    16291633
Note: See TracChangeset for help on using the changeset viewer.