Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r777bfcf r8cc5cb0  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Aug 14 11:03:22 2016
    13 // Update Count     : 1879
     12// Last Modified On : Thu Aug 11 18:02:57 2016
     13// Update Count     : 1861
    1414//
    1515
     
    143143%type<en> constant_expression                   assignment_expression           assignment_expression_opt
    144144%type<en> comma_expression                              comma_expression_opt
     145//%type<en> argument_expression_list            argument_expression                     for_control_expression          assignment_opt
    145146%type<en> argument_expression_list              argument_expression                     assignment_opt
    146147%type<fctl> for_control_expression
     
    161162%type<sn> case_value_list                               case_label                                      case_label_list
    162163%type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
    163 %type<sn> handler_list                                  handler_clause                          finally_clause
     164%type<pn> handler_list                                  handler_clause                          finally_clause
    164165
    165166// declarations
     
    388389                        Token fn;
    389390                        fn.str = new std::string( "?{}" ); // location undefined
    390                         $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_last( $3 ) ) );
     391                        $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_link( $3 ) ) );
    391392                }
    392393        ;
     
    395396        argument_expression
    396397        | argument_expression_list ',' argument_expression
    397                 { $$ = (ExpressionNode *)( $1->set_last( $3 )); }
     398                { $$ = (ExpressionNode *)( $1->set_link( $3 )); }
    398399        ;
    399400
     
    406407field_list:                                                                                             // CFA, tuple field selector
    407408        field
    408         | field_list ',' field                                          { $$ = (ExpressionNode *)$1->set_last( $3 ); }
     409        | field_list ',' field                                          { $$ = (ExpressionNode *)$1->set_link( $3 ); }
    409410        ;
    410411
     
    626627                { $$ = new ExpressionNode( build_tuple( $3 ) ); }
    627628        | '[' push ',' tuple_expression_list pop ']'
    628                 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( $4 ) ) ); }
     629                { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_link( $4 ) ) ); }
    629630        | '[' push assignment_expression ',' tuple_expression_list pop ']'
    630                 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_last( $5 ) ) ); }
     631                { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_link( $5 ) ) ); }
    631632        ;
    632633
     
    634635        assignment_expression_opt
    635636        | tuple_expression_list ',' assignment_expression_opt
    636                 { $$ = (ExpressionNode *)$1->set_last( $3 ); }
     637                { $$ = (ExpressionNode *)$1->set_link( $3 ); }
    637638        ;
    638639
     
    664665                        Token fn;
    665666                        fn.str = new std::string( "^?{}" ); // location undefined
    666                         $$ = new StatementNode2( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $2 )->set_last( $4 ) ) ) ) );
     667                        $$ = new StatementNode2( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $2 )->set_link( $4 ) ) ) ) );
    667668                }
    668669        ;
     
    691692        block_item
    692693        | block_item_list push block_item
    693                 { if ( $1 != 0 ) { $1->set_last( $3 ); $$ = $1; } }
     694                { if ( $1 != 0 ) { $1->set_link( $3 ); $$ = $1; } }
    694695        ;
    695696
    696697block_item:
    697698        declaration                                                                                     // CFA, new & old style declarations
    698                 { $$ = new StatementNode2( $1 ); }
     699                { $$ = new StatementNode( $1 ); }
    699700        | EXTENSION declaration                                                         // GCC
    700701                {       // mark all fields in list
    701                         for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_next() )
     702                        for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_link() )
    702703                                iter->set_extension( true );
    703                         $$ = new StatementNode2( $2 );
     704                        $$ = new StatementNode( $2 );
    704705                }
    705706        | function_definition
    706                 { $$ = new StatementNode2( $1 ); }
     707                { $$ = new StatementNode( $1 ); }
    707708        | statement pop
    708709        ;
     
    711712        statement
    712713        | statement_list statement
    713                 { if ( $1 != 0 ) { $1->set_last( $2 ); $$ = $1; } }
     714                { if ( $1 != 0 ) { $1->set_link( $2 ); $$ = $1; } }
    714715        ;
    715716
     
    735736                        // therefore, are removed from the grammar even though C allows it. The change also applies to choose
    736737                        // statement.
    737                         $$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode2( $7 ))->set_last( sw )) ) : sw;
     738                        $$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode( $7 ))->set_link( sw )) ) : sw;
    738739                }
    739740        | CHOOSE '(' comma_expression ')' case_clause           // CFA
     
    742743                {
    743744                        StatementNode *sw = new StatementNode2( build_switch( $3, $8 ) );
    744                         $$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode2( $7 ))->set_last( sw )) ) : sw;
     745                        $$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode( $7 ))->set_link( sw )) ) : sw;
    745746                }
    746747        ;
     
    757758
    758759case_value_list:                                                                                // CFA
     760        //case_value                                                                    { $$ = new StatementNode( StatementNode::Case, $1, 0 ); }
    759761        case_value                                                                      { $$ = new StatementNode2( build_case( $1 ) ); }
    760762                // convert case list, e.g., "case 1, 3, 5:" into "case 1: case 3: case 5"
    761         | case_value_list ',' case_value                        { $$ = (StatementNode *)($1->set_last( new StatementNode2( build_case( $3 ) ) ) ); }
     763        | case_value_list ',' case_value                        { $$ = (StatementNode *)($1->set_link( new StatementNode2( build_case( $3 ) ) ) ); }
    762764        ;
    763765
     
    770772case_label_list:                                                                                // CFA
    771773        case_label
    772         | case_label_list case_label                            { $$ = (StatementNode *)( $1->set_last( $2 )); }
     774        | case_label_list case_label                            { $$ = (StatementNode *)( $1->set_link( $2 )); }
    773775        ;
    774776
     
    787789                { $$ = $1->append_last_case( new CompoundStmtNode( $2 ) ); }
    788790        | switch_clause_list case_label_list statement_list
    789                 { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new CompoundStmtNode( $3 ) ) ) ); }
     791                { $$ = (StatementNode *)( $1->set_link( $2->append_last_case( new CompoundStmtNode( $3 ) ) ) ); }
    790792        ;
    791793
     
    802804                { $$ = $1->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*$2, *$3 ) ) ) ); }
    803805        | choose_clause_list case_label_list fall_through
    804                 { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( $3 ))); }
     806                { $$ = (StatementNode *)( $1->set_link( $2->append_last_case( $3 ))); }
    805807        | choose_clause_list case_label_list statement_list fall_through_opt
    806                 { $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*$3, *$4 ) ) ) ) ) ); }
     808                { $$ = (StatementNode *)( $1->set_link( $2->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*$3, *$4 ) ) ) ) ) ); }
    807809        ;
    808810
     
    869871exception_statement:
    870872        TRY compound_statement handler_list
    871                 { $$ = new StatementNode2( build_try( $2, $3, 0 ) ); }
     873                { $$ = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*$2,*$3 )))); }
    872874        | TRY compound_statement finally_clause
    873                 { $$ = new StatementNode2( build_try( $2, 0, $3 ) ); }
     875                { $$ = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*$2,*$3 )))); }
    874876        | TRY compound_statement handler_list finally_clause
    875                 { $$ = new StatementNode2( build_try( $2, $3, $4 ) ); }
     877                {
     878                        $3->set_link( $4 );
     879                        $$ = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*$2,*$3 ))));
     880                }
    876881        ;
    877882
    878883handler_list:
     884                // There must be at least one catch clause
    879885        handler_clause
    880886                // ISO/IEC 9899:1999 Section 15.3(6 ) If present, a "..." handler shall be the last handler for its try block.
    881887        | CATCH '(' ELLIPSIS ')' compound_statement
    882                 { $$ = new StatementNode2( build_catch( 0, $5, true ) ); }
     888                { $$ = StatementNode::newCatchStmt( 0, $5, true ); }
    883889        | handler_clause CATCH '(' ELLIPSIS ')' compound_statement
    884                 { $$ = (StatementNode *)$1->set_last( new StatementNode2( build_catch( 0, $6, true ) ) ); }
     890                { $$ = $1->set_link( StatementNode::newCatchStmt( 0, $6, true ) ); }
    885891        | CATCHRESUME '(' ELLIPSIS ')' compound_statement
    886                 { $$ = new StatementNode2( build_catch( 0, $5, true ) ); }
     892                { $$ = StatementNode::newCatchStmt( 0, $5, true ); }
    887893        | handler_clause CATCHRESUME '(' ELLIPSIS ')' compound_statement
    888                 { $$ = (StatementNode *)$1->set_last( new StatementNode2( build_catch( 0, $6, true ) ) ); }
     894                { $$ = $1->set_link( StatementNode::newCatchStmt( 0, $6, true ) ); }
    889895        ;
    890896
    891897handler_clause:
    892898        CATCH '(' push push exception_declaration pop ')' compound_statement pop
    893                 { $$ = new StatementNode2( build_catch( $5, $8 ) ); }
     899                { $$ = StatementNode::newCatchStmt( $5, $8 ); }
    894900        | handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop
    895         { $$ = (StatementNode *)$1->set_last( new StatementNode2( build_catch( $6, $9 ) ) ); }
     901                { $$ = $1->set_link( StatementNode::newCatchStmt( $6, $9 ) ); }
    896902        | CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
    897                 { $$ = new StatementNode2( build_catch( $5, $8 ) ); }
     903                { $$ = StatementNode::newCatchStmt( $5, $8 ); }
    898904        | handler_clause CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
    899                 { $$ = (StatementNode *)$1->set_last( new StatementNode2( build_catch( $6, $9 ) ) ); }
     905                { $$ = $1->set_link( StatementNode::newCatchStmt( $6, $9 ) ); }
    900906        ;
    901907
     
    903909        FINALLY compound_statement
    904910                {
    905                         $$ = new StatementNode2( build_finally( $2 ) );
     911                        $$ = new StatementNode( StatementNode::Finally, 0, $2 );
     912                        std::cout << "Just created a finally node" << std::endl;
    906913                }
    907914        ;
     
    931938asm_statement:
    932939        ASM asm_volatile_opt '(' string_literal_list ')' ';'
    933                 { $$ = new AsmStmtNode( $2, $4, 0 ); }
     940                { $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, 0 ); }
    934941        | ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ')' ';' // remaining GCC
    935                 { $$ = new AsmStmtNode( $2, $4, $6 ); }
     942                { $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, $6 ); }
    936943        | ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ':' asm_operands_opt ')' ';'
    937                 { $$ = new AsmStmtNode( $2, $4, $6, $8 ); }
     944                { $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, $6, $8 ); }
    938945        | ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ':' asm_operands_opt ':' asm_clobbers_list_opt ')' ';'
    939                 { $$ = new AsmStmtNode( $2, $4, $6, $8, $10 ); }
     946                { $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, $6, $8, $10 ); }
    940947        | ASM asm_volatile_opt GOTO '(' string_literal_list ':' ':' asm_operands_opt ':' asm_clobbers_list_opt ':' label_list ')' ';'
    941                 { $$ = new AsmStmtNode( $2, $5, 0, $8, $10, $12 ); }
     948                { $$ = new AsmStmtNode( StatementNode::Asm, $2, $5, 0, $8, $10, $12 ); }
    942949        ;
    943950
     
    958965        asm_operand
    959966        | asm_operands_list ',' asm_operand
    960                 { $$ = (ExpressionNode *)$1->set_last( $3 ); }
     967                { $$ = (ExpressionNode *)$1->set_link( $3 ); }
    961968        ;
    962969
     
    974981                { $$ = new ExpressionNode( $1 ); }
    975982        | asm_clobbers_list_opt ',' string_literal_list
    976         { $$ = (ExpressionNode *)$1->set_last( new ExpressionNode( $3 ) ); }
     983        { $$ = (ExpressionNode *)$1->set_link( new ExpressionNode( $3 ) ); }
    977984        ;
    978985
     
    14971504        | EXTENSION field_declaring_list ';'                            // GCC
    14981505                {       // mark all fields in list
    1499                         for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_next() )
     1506                        for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_link() )
    15001507                                iter->set_extension( true );
    15011508                        $$ = $2;
     
    17431750        | initializer
    17441751        | designation initializer                                       { $$ = $2->set_designators( $1 ); }
    1745         | initializer_list ',' initializer                      { $$ = (InitializerNode *)( $1->set_last( $3 ) ); }
     1752        | initializer_list ',' initializer                      { $$ = (InitializerNode *)( $1->set_link( $3 ) ); }
    17461753        | initializer_list ',' designation initializer
    1747                 { $$ = (InitializerNode *)( $1->set_last( $4->set_designators( $3 ) ) ); }
     1754                { $$ = (InitializerNode *)( $1->set_link( $4->set_designators( $3 ) ) ); }
    17481755        ;
    17491756
     
    17671774        designator
    17681775        | designator_list designator
    1769                 { $$ = (ExpressionNode *)( $1->set_last( $2 ) ); }
     1776                { $$ = (ExpressionNode *)( $1->set_link( $2 ) ); }
    17701777        //| designator_list designator                                          { $$ = new ExpressionNode( $1, $2 ); }
    17711778        ;
     
    18731880        | assignment_expression
    18741881        | type_name_list ',' type_name
    1875                 { $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( build_typevalue( $3 ) ) ) ); }
     1882                { $$ = (ExpressionNode *)( $1->set_link( new ExpressionNode( build_typevalue( $3 ) ) ) ); }
    18761883        | type_name_list ',' assignment_expression
    1877                 { $$ = (ExpressionNode *)( $1->set_last( $3 )); }
     1884                { $$ = (ExpressionNode *)( $1->set_link( $3 )); }
    18781885        ;
    18791886
     
    20132020        | EXTENSION external_definition
    20142021                {       // mark all fields in list
    2015                         for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_next() )
     2022                        for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_link() )
    20162023                                iter->set_extension( true );
    20172024                        $$ = $2;
Note: See TracChangeset for help on using the changeset viewer.