Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r1b54b54 r1b8f13f0  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 21 08:45:07 2019
    13 // Update Count     : 4232
     12// Last Modified On : Thu Nov  8 18:08:23 2018
     13// Update Count     : 4052
    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         for ( cur = dynamic_cast<DeclarationNode *>( cur->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) {
     101        //cur->addType( specifier );
     102        for ( cur = dynamic_cast< DeclarationNode * >( cur->get_next() ); cur != nullptr; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ) ) {
    102103                cl->cloneBaseType( cur );
    103104        } // for
    104105        declList->addType( cl );
     106//      delete cl;
    105107        return declList;
    106108} // distAttr
     
    191193        return new ForCtrl(
    192194                distAttr( DeclarationNode::newTypeof( type, true ), DeclarationNode::newName( index )->addInitializer( new InitializerNode( start ) ) ),
    193                 // NULL comp/inc => leave blank
    194                 comp ? new ExpressionNode( build_binary_val( compop, new ExpressionNode( build_varref( new string( *index ) ) ), comp ) ) : 0,
    195                 inc ? new ExpressionNode( build_binary_val( compop == OperKinds::LThan || compop == OperKinds::LEThan ? // choose += or -= for upto/downto
    196                                                         OperKinds::PlusAssn : OperKinds::MinusAssn, new ExpressionNode( build_varref( new string( *index ) ) ), inc ) ) : 0 );
     195                new ExpressionNode( build_binary_val( compop, new ExpressionNode( build_varref( new string( *index ) ) ), comp ) ),
     196                new ExpressionNode( build_binary_val( compop == OperKinds::LThan || compop == OperKinds::LEThan ? // choose += or -= for upto/downto
     197                                                                                          OperKinds::PlusAssn : OperKinds::MinusAssn, new ExpressionNode( build_varref( new string( *index ) ) ), inc ) ) );
    197198} // forCtrl
    198199
     
    200201        if ( NameExpr * identifier = dynamic_cast<NameExpr *>(index->get_expr()) ) {
    201202                return forCtrl( type, new string( identifier->name ), start, compop, comp, inc );
    202         } else if ( CommaExpr * commaExpr = dynamic_cast<CommaExpr *>(index->get_expr()) ) {
    203                 if ( NameExpr * identifier = dynamic_cast<NameExpr *>(commaExpr->arg1 ) ) {
    204                         return forCtrl( type, new string( identifier->name ), start, compop, comp, inc );
    205                 } else {
    206                         SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); return nullptr;
    207                 } // if
    208203        } else {
    209204                SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); return nullptr;
     
    268263%token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED
    269264%token BOOL COMPLEX IMAGINARY                                                   // C99
    270 %token INT128 uuFLOAT80 uuFLOAT128                                              // GCC
    271 %token uFLOAT16 uFLOAT32 uFLOAT32X uFLOAT64 uFLOAT64X uFLOAT128 // GCC
     265%token INT128 FLOAT80 FLOAT128                                                  // GCC
    272266%token ZERO_T ONE_T                                                                             // CFA
    273267%token VALIST                                                                                   // GCC
     
    330324%type<en> argument_expression_list              argument_expression                     default_initialize_opt
    331325%type<ifctl> if_control_expression
    332 %type<fctl> for_control_expression              for_control_expression_list
     326%type<fctl> for_control_expression
    333327%type<compop> inclexcl
    334328%type<en> subrange
     
    990984                // labels cannot be identifiers 0 or 1 or ATTR_IDENTIFIER
    991985        identifier_or_type_name ':' attribute_list_opt statement
    992                 { $$ = $4->add_label( $1, $3 ); }
     986                {
     987                        $$ = $4->add_label( $1, $3 );
     988                }
    993989        ;
    994990
     
    10061002        statement_decl
    10071003        | statement_decl_list statement_decl
    1008                 { assert( $1 ); $1->set_last( $2 ); $$ = $1; }
     1004                { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
    10091005        ;
    10101006
     
    10131009                { $$ = new StatementNode( $1 ); }
    10141010        | EXTENSION declaration                                                         // GCC
    1015                 { distExt( $2 ); $$ = new StatementNode( $2 ); }
     1011                {
     1012                        distExt( $2 );
     1013                        $$ = new StatementNode( $2 );
     1014                }
    10161015        | function_definition
    10171016                { $$ = new StatementNode( $1 ); }
    10181017        | EXTENSION function_definition                                         // GCC
    1019                 { distExt( $2 ); $$ = new StatementNode( $2 ); }
     1018                {
     1019                        distExt( $2 );
     1020                        $$ = new StatementNode( $2 );
     1021                }
    10201022        | statement
    10211023        ;
     
    10241026        statement
    10251027        | statement_list_nodecl statement
    1026                 { assert( $1 ); $1->set_last( $2 ); $$ = $1; }
     1028                { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
    10271029        ;
    10281030
     
    11361138        | DO statement WHILE '(' ')' ';'                                        // CFA => do while( 1 )
    11371139                { $$ = new StatementNode( build_do_while( new ExpressionNode( build_constantInteger( *new string( "1" ) ) ), $2 ) ); }
    1138         | FOR '(' push for_control_expression_list ')' statement pop
     1140        | FOR '(' push for_control_expression ')' statement pop
    11391141                { $$ = new StatementNode( build_for( $4, $6 ) ); }
    11401142        | FOR '(' ')' statement                                                         // CFA => for ( ;; )
     
    11421144        ;
    11431145
    1144 for_control_expression_list:
    1145         for_control_expression
    1146         | for_control_expression_list ':' for_control_expression
    1147                 { $$ = $3; }
    1148         ;
    1149 
    11501146for_control_expression:
    1151         ';' comma_expression_opt ';' comma_expression_opt
    1152                 { $$ = new ForCtrl( (ExpressionNode * )nullptr, $2, $4 ); }
    1153         | comma_expression ';' comma_expression_opt ';' comma_expression_opt
    1154                 { $$ = new ForCtrl( $1, $3, $5 ); }
    1155         | declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
    1156                 { $$ = new ForCtrl( $1, $2, $4 ); }
    1157         | comma_expression                                                                      // CFA
     1147        comma_expression                                                                        // CFA
    11581148                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
    11591149                                                OperKinds::LThan, $1->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1160         | comma_expression inclexcl comma_expression            // CFA
     1150        | constant_expression inclexcl constant_expression      // CFA
    11611151                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1162         | comma_expression inclexcl comma_expression '~' comma_expression // CFA
     1152        | constant_expression inclexcl constant_expression '~' constant_expression // CFA
    11631153                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, $5 ); }
    11641154        | comma_expression ';' comma_expression                         // CFA
    11651155                { $$ = forCtrl( $3, $1, new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
    11661156                                                OperKinds::LThan, $3->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1167         | comma_expression ';' comma_expression inclexcl comma_expression // CFA
     1157        | comma_expression ';' constant_expression inclexcl constant_expression // CFA
    11681158                { $$ = forCtrl( $3, $1, $3->clone(), $4, $5, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1169         | comma_expression ';' comma_expression inclexcl comma_expression '~' comma_expression // CFA
     1159        | comma_expression ';' constant_expression inclexcl constant_expression '~' constant_expression // CFA
    11701160                { $$ = forCtrl( $3, $1, $3->clone(), $4, $5, $7 ); }
    1171         | comma_expression ';' comma_expression '~' '@' '~' comma_expression // CFA
    1172                 { $$ = forCtrl( $3, $1, $3->clone(), OperKinds::LThan, nullptr, $7 ); }
    1173         | comma_expression ';' comma_expression ErangeDown '@' '~' comma_expression // CFA
    1174                 { $$ = forCtrl( $3, $1, $3->clone(), OperKinds::GThan, nullptr, $7 ); }
    1175         | comma_expression ';' comma_expression '~' '@' '~' '@' // CFA
    1176                 { $$ = forCtrl( $3, $1, $3->clone(), OperKinds::LThan, nullptr, nullptr ); }
     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 ); }
    11771167        ;
    11781168
     
    17811771        | FLOAT
    17821772                { $$ = DeclarationNode::newBasicType( DeclarationNode::Float ); }
     1773        | FLOAT80
     1774                { $$ = DeclarationNode::newBasicType( DeclarationNode::Float80 ); }
     1775        | FLOAT128
     1776                { $$ = DeclarationNode::newBasicType( DeclarationNode::Float128 ); }
    17831777        | DOUBLE
    17841778                { $$ = DeclarationNode::newBasicType( DeclarationNode::Double ); }
    1785         | uuFLOAT80
    1786                 { $$ = DeclarationNode::newBasicType( DeclarationNode::uuFloat80 ); }
    1787         | uuFLOAT128
    1788                 { $$ = DeclarationNode::newBasicType( DeclarationNode::uuFloat128 ); }
    1789         | uFLOAT16
    1790                 { $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat16 ); }
    1791         | uFLOAT32
    1792                 { $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat32 ); }
    1793         | uFLOAT32X
    1794                 { $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat32x ); }
    1795         | uFLOAT64
    1796                 { $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat64 ); }
    1797         | uFLOAT64X
    1798                 { $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat64x ); }
    1799         | uFLOAT128
    1800                 { $$ = DeclarationNode::newBasicType( DeclarationNode::uFloat128 ); }
    18011779        | COMPLEX                                                                                       // C99
    18021780                { $$ = DeclarationNode::newComplexType( DeclarationNode::Complex ); }
Note: See TracChangeset for help on using the changeset viewer.