Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/parser.yy

    r7bf7fb9 r51e076e  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Aug  7 09:37:48 2016
    13 // Update Count     : 1764
     12// Last Modified On : Fri Aug  5 08:15:57 2016
     13// Update Count     : 1721
    1414//
    1515
     
    6060std::stack< LinkageSpec::Type > linkageStack;
    6161TypedefTable typedefTable;
    62 
    63 void appendStr( std::string &to, std::string *from ) {
    64         // "abc" "def" "ghi" => "abcdefghi", remove new text from quotes and insert before last quote in old string.
    65         to.insert( to.length() - 1, from->substr( 1, from->length() - 2 ) );
    66 } // appendStr
    6762%}
    6863
     
    124119        LabelNode *label;
    125120        InitializerNode *in;
    126         OperKinds op;
     121        OperatorNode::Type op;
    127122        bool flag;
    128123}
     
    135130%type<constant> constant
    136131%type<en> tuple                                                 tuple_expression_list
    137 %type<op> ptrref_operator                               unary_operator                          assignment_operator
     132%type<op> ptrref_operator
     133%type<en> unary_operator                                assignment_operator
    138134%type<en> primary_expression                    postfix_expression                      unary_expression
    139135%type<en> cast_expression                               multiplicative_expression       additive_expression                     shift_expression
     
    309305constant:
    310306                // ENUMERATIONconstant is not included here; it is treated as a variable with type "enumeration constant".
    311 INTEGERconstant                                                                 { $$ = build_constantInteger( *$1 ); }
    312         | FLOATINGconstant                                                      { $$ = build_constantFloat( *$1 ); }
    313         | CHARACTERconstant                                                     { $$ = build_constantChar( *$1 ); }
     307INTEGERconstant                                                                 { $$ = makeConstantInteger( *$1 ); }
     308        | FLOATINGconstant                                                      { $$ = makeConstantFloat( *$1 ); }
     309        | CHARACTERconstant                                                     { $$ = makeConstantChar( *$1 ); }
    314310        ;
    315311
     
    336332
    337333string_literal_list:                                                                    // juxtaposed strings are concatenated
    338         STRINGliteral                                                           { $$ = build_constantStr( *$1 ); }
    339         | string_literal_list STRINGliteral
    340                 {
    341                         appendStr( $1->get_expr()->get_constant()->get_value(), $2 );
    342                         delete $2;                                                                      // allocated by lexer
    343                         $$ = $1;
    344                 }
     334        STRINGliteral                                                           { $$ = makeConstantStr( *$1 ); }
     335        | string_literal_list STRINGliteral                     { $$ = $1->appendstr( $2 ); }
    345336        ;
    346337
     
    365356                // little advantage to this feature and many disadvantages. It is possible to write x[(i,j)] in CFA, which is
    366357                // equivalent to the old x[i,j].
    367                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Index, $1, $4 ) ); }
     358                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Index, $1, $4 ) ); }
    368359        | postfix_expression '(' argument_expression_list ')'
    369                 { $$ = new CompositeExprNode( build_func( $1, $3 ) ); }
     360                { $$ = new CompositeExprNode( $1, $3 ); }
    370361        // ambiguity with .0 so space required after field-selection, e.g.
    371362                //   struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1;
    372363        | postfix_expression '.' no_attr_identifier
    373                 { $$ = new CompositeExprNode( build_fieldSel( $1, new VarRefNode( $3 ) ) ); }
     364                { $$ = new CompositeExprNode2( build_fieldSel( $1, new VarRefNode( $3 ) ) ); }
    374365        | postfix_expression '.' '[' push field_list pop ']' // CFA, tuple field selector
    375366        | postfix_expression ARROW no_attr_identifier
    376                 { $$ = new CompositeExprNode( build_pfieldSel( $1, new VarRefNode( $3 ) ) ); }
     367                { $$ = new CompositeExprNode2( build_pfieldSel( $1, new VarRefNode( $3 ) ) ); }
    377368        | postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector
    378369        | postfix_expression ICR
    379                 { $$ = new CompositeExprNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); }
     370                { $$ = new CompositeExprNode2( build_opr1( OperatorNode::IncrPost, $1 ) ); }
    380371        | postfix_expression DECR
    381                 { $$ = new CompositeExprNode( build_unary_ptr( OperKinds::DecrPost, $1 ) ); }
     372                { $$ = new CompositeExprNode2( build_opr1( OperatorNode::DecrPost, $1 ) ); }
    382373        | '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99
    383374                { $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true ) ); }
    384375        | postfix_expression '{' argument_expression_list '}' // CFA
    385376                {
    386                         Token fn;
    387                         fn.str = new std::string( "?{}" ); // location undefined
    388                         $$ = new CompositeExprNode( build_func( new VarRefNode( fn ), (ExpressionNode *)( $1 )->set_link( $3 ) ) );
     377                        Token fn; fn.str = new std::string( "?{}" ); // location undefined
     378                        $$ = new CompositeExprNode( new VarRefNode( fn ), (ExpressionNode *)( $1 )->set_link( $3 ) );
    389379                }
    390380        ;
     
    408398                { $$ = $7->set_argName( $3 ); }
    409399        | '[' push assignment_expression ',' tuple_expression_list pop ']' ':' assignment_expression
    410                 { $$ = $9->set_argName( new CompositeExprNode( build_tuple( (ExpressionNode *)$3->set_link( $5 ) ) ) ); }
     400                { $$ = $9->set_argName( new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)$3->set_link( flattenCommas( $5 )))); }
    411401        ;
    412402
     
    422412                //   struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1;
    423413        | no_attr_identifier '.' field
    424                 { $$ = new CompositeExprNode( build_fieldSel( $3, new VarRefNode( $1 ) ) ); }
     414                { $$ = new CompositeExprNode2( build_fieldSel( $3, new VarRefNode( $1 ) ) ); }
    425415        | no_attr_identifier '.' '[' push field_list pop ']'
    426                 { $$ = new CompositeExprNode( build_fieldSel( $5, new VarRefNode( $1 ) ) ); }
     416                { $$ = new CompositeExprNode2( build_fieldSel( $5, new VarRefNode( $1 ) ) ); }
    427417        | no_attr_identifier ARROW field
    428                 { $$ = new CompositeExprNode( build_pfieldSel( $3, new VarRefNode( $1 ) ) ); }
     418                { $$ = new CompositeExprNode2( build_pfieldSel( $3, new VarRefNode( $1 ) ) ); }
    429419        | no_attr_identifier ARROW '[' push field_list pop ']'
    430                 { $$ = new CompositeExprNode( build_pfieldSel( $5, new VarRefNode( $1 ) ) ); }
     420                { $$ = new CompositeExprNode2( build_pfieldSel( $5, new VarRefNode( $1 ) ) ); }
    431421        ;
    432422
     
    445435                //              { * int X; } // CFA declaration of pointer to int
    446436        | ptrref_operator cast_expression                                       // CFA
    447                 {
    448                         switch ( $1 ) {
    449                           case OperKinds::AddressOf:
    450                                 $$ = new CompositeExprNode( build_addressOf( $2 ) );
    451                                 break;
    452                           case OperKinds::PointTo:
    453                                 $$ = new CompositeExprNode( build_unary_val( $1, $2 ) );
    454                                 break;
    455                           default:
    456                                 assert( false );
    457                         }
    458                 }
     437                { $$ = $1 == OperatorNode::AddressOf ? (ExpressionNode*) new CompositeExprNode2( build_addressOf( $2 ) )
     438                                                                                        : (ExpressionNode*)new CompositeExprNode( new OperatorNode ( $1 ), $2 ); }
    459439        | unary_operator cast_expression
    460                         { $$ = new CompositeExprNode( build_unary_val( $1, $2 ) ); }
     440                { $$ = new CompositeExprNode( $1, $2 ); }
    461441        | ICR unary_expression
    462                 { $$ = new CompositeExprNode( build_unary_ptr( OperKinds::Incr, $2 ) ); }
     442                { $$ = new CompositeExprNode2( build_opr1( OperatorNode::Incr, $2 ) ); }
    463443        | DECR unary_expression
    464                 { $$ = new CompositeExprNode( build_unary_ptr( OperKinds::Decr, $2 ) ); }
     444                { $$ = new CompositeExprNode2( build_opr1( OperatorNode::Decr, $2 ) ); }
    465445        | SIZEOF unary_expression
    466                 { $$ = new CompositeExprNode( build_sizeOf( $2 ) ); }
     446                { $$ = new CompositeExprNode2( build_sizeOf( $2 ) ); }
    467447        | SIZEOF '(' type_name_no_function ')'
    468                 { $$ = new CompositeExprNode( build_sizeOf( new TypeValueNode( $3 ) ) ); }
     448                { $$ = new CompositeExprNode2( build_sizeOf( new TypeValueNode( $3 ) ) ); }
    469449        | OFFSETOF '(' type_name_no_function ',' no_attr_identifier ')'
    470                 { $$ = new CompositeExprNode( build_offsetOf( new TypeValueNode( $3 ), new VarRefNode( $5 ) ) ); }
     450                { $$ = new CompositeExprNode2( build_offsetOf( new TypeValueNode( $3 ), new VarRefNode( $5 ) ) ); }
    471451        | ATTR_IDENTIFIER
    472                 { $$ = new CompositeExprNode( build_attr( new VarRefNode( $1 ) ) ); }
     452                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ) ); }
    473453        | ATTR_IDENTIFIER '(' type_name ')'
    474                 { $$ = new CompositeExprNode( build_attr( new VarRefNode( $1 ), new TypeValueNode( $3 ) ) ); }
     454                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), new TypeValueNode( $3 ) ); }
    475455        | ATTR_IDENTIFIER '(' argument_expression ')'
    476                 { $$ = new CompositeExprNode( build_attr( new VarRefNode( $1 ), $3 ) ); }
     456                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), $3 ); }
    477457        | ALIGNOF unary_expression                                                      // GCC, variable alignment
    478                 { $$ = new CompositeExprNode( build_alignOf( $2 ) ); }
     458                { $$ = new CompositeExprNode2( build_alignOf( $2 ) ); }
    479459        | ALIGNOF '(' type_name_no_function ')'                         // GCC, type alignment
    480                 { $$ = new CompositeExprNode( build_alignOf( new TypeValueNode( $3 ) ) ); }
     460                { $$ = new CompositeExprNode2( build_alignOf( new TypeValueNode( $3 ) ) ); }
    481461//      | ANDAND IDENTIFIER                                                                     // GCC, address of label
    482 //              { $$ = new CompositeExprNode( new OperatorNode( OperKinds::LabelAddress ), new VarRefNode( $2, true ) ); }
     462//              { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LabelAddress ), new VarRefNode( $2, true ) ); }
    483463        ;
    484464
    485465ptrref_operator:
    486         '*'                                                                                     { $$ = OperKinds::PointTo; }
    487         | '&'                                                                           { $$ = OperKinds::AddressOf; }
     466        '*'                                                                                     { $$ = OperatorNode::PointTo; }
     467        | '&'                                                                           { $$ = OperatorNode::AddressOf; }
    488468                // GCC, address of label must be handled by semantic check for ref,ref,label
    489 //      | ANDAND                                                                        { $$ = OperKinds::And; }
     469        | ANDAND                                                                        { $$ = OperatorNode::And; }
    490470        ;
    491471
    492472unary_operator:
    493         '+'                                                                                     { $$ = OperKinds::UnPlus; }
    494         | '-'                                                                           { $$ = OperKinds::UnMinus; }
    495         | '!'                                                                           { $$ = OperKinds::Neg; }
    496         | '~'                                                                           { $$ = OperKinds::BitNeg; }
     473        '+'                                                                                     { $$ = new OperatorNode( OperatorNode::UnPlus ); }
     474        | '-'                                                                           { $$ = new OperatorNode( OperatorNode::UnMinus ); }
     475        | '!'                                                                           { $$ = new OperatorNode( OperatorNode::Neg ); }
     476        | '~'                                                                           { $$ = new OperatorNode( OperatorNode::BitNeg ); }
    497477        ;
    498478
     
    500480        unary_expression
    501481        | '(' type_name_no_function ')' cast_expression
    502                 { $$ = new CompositeExprNode( build_cast( new TypeValueNode( $2 ), $4 ) ); }
     482                { $$ = new CompositeExprNode2( build_cast( new TypeValueNode( $2 ), $4 ) ); }
    503483        | '(' type_name_no_function ')' tuple
    504                 { $$ = new CompositeExprNode( build_cast( new TypeValueNode( $2 ), $4 ) ); }
     484                { $$ = new CompositeExprNode2( build_cast( new TypeValueNode( $2 ), $4 ) ); }
    505485        ;
    506486
     
    508488        cast_expression
    509489        | multiplicative_expression '*' cast_expression
    510                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); }
     490                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Mul, $1, $3 ) ); }
    511491        | multiplicative_expression '/' cast_expression
    512                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Div, $1, $3 ) ); }
     492                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Div, $1, $3 ) ); }
    513493        | multiplicative_expression '%' cast_expression
    514                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); }
     494                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Mod, $1, $3 ) ); }
    515495        ;
    516496
     
    518498        multiplicative_expression
    519499        | additive_expression '+' multiplicative_expression
    520                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Plus, $1, $3 ) ); }
     500                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Plus, $1, $3 ) ); }
    521501        | additive_expression '-' multiplicative_expression
    522                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Minus, $1, $3 ) ); }
     502                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Minus, $1, $3 ) ); }
    523503        ;
    524504
     
    526506        additive_expression
    527507        | shift_expression LS additive_expression
    528                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::LShift, $1, $3 ) ); }
     508                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::LShift, $1, $3 ) ); }
    529509        | shift_expression RS additive_expression
    530                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::RShift, $1, $3 ) ); }
     510                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::RShift, $1, $3 ) ); }
    531511        ;
    532512
     
    534514        shift_expression
    535515        | relational_expression '<' shift_expression
    536                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::LThan, $1, $3 ) ); }
     516                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::LThan, $1, $3 ) ); }
    537517        | relational_expression '>' shift_expression
    538                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::GThan, $1, $3 ) ); }
     518                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::GThan, $1, $3 ) ); }
    539519        | relational_expression LE shift_expression
    540                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::LEThan, $1, $3 ) ); }
     520                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::LEThan, $1, $3 ) ); }
    541521        | relational_expression GE shift_expression
    542                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::GEThan, $1, $3 ) ); }
     522                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::GEThan, $1, $3 ) ); }
    543523        ;
    544524
     
    546526        relational_expression
    547527        | equality_expression EQ relational_expression
    548                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Eq, $1, $3 ) ); }
     528                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Eq, $1, $3 ) ); }
    549529        | equality_expression NE relational_expression
    550                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Neq, $1, $3 ) ); }
     530                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Neq, $1, $3 ) ); }
    551531        ;
    552532
     
    554534        equality_expression
    555535        | AND_expression '&' equality_expression
    556                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::BitAnd, $1, $3 ) ); }
     536                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::BitAnd, $1, $3 ) ); }
    557537        ;
    558538
     
    560540        AND_expression
    561541        | exclusive_OR_expression '^' AND_expression
    562                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::Xor, $1, $3 ) ); }
     542                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Xor, $1, $3 ) ); }
    563543        ;
    564544
     
    566546        exclusive_OR_expression
    567547        | inclusive_OR_expression '|' exclusive_OR_expression
    568                 { $$ = new CompositeExprNode( build_binary_val( OperKinds::BitOr, $1, $3 ) ); }
     548                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::BitOr, $1, $3 ) ); }
    569549        ;
    570550
     
    572552        inclusive_OR_expression
    573553        | logical_AND_expression ANDAND inclusive_OR_expression
    574                 { $$ = new CompositeExprNode( build_and_or( $1, $3, true ) ); }
     554                { $$ = new CompositeExprNode2( build_and_or( $1, $3, true ) ); }
    575555        ;
    576556
     
    578558        logical_AND_expression
    579559        | logical_OR_expression OROR logical_AND_expression
    580                 { $$ = new CompositeExprNode( build_and_or( $1, $3, false ) ); }
     560                { $$ = new CompositeExprNode2( build_and_or( $1, $3, false ) ); }
    581561        ;
    582562
     
    584564        logical_OR_expression
    585565        | logical_OR_expression '?' comma_expression ':' conditional_expression
    586                 { $$ = new CompositeExprNode( build_cond( $1, $3, $5 ) ); }
    587                 // FIX ME: this hack computes $1 twice
     566                { $$ = new CompositeExprNode2( build_cond( $1, $3, $5 ) ); }
    588567        | logical_OR_expression '?' /* empty */ ':' conditional_expression // GCC, omitted first operand
    589                 { $$ = new CompositeExprNode( build_cond( $1, $1, $4 ) ); }
     568                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), $1, $4 ); }
    590569        | logical_OR_expression '?' comma_expression ':' tuple // CFA, tuple expression
    591                 { $$ = new CompositeExprNode( build_cond( $1, $3, $5 ) ); }
     570                { $$ = new CompositeExprNode2( build_cond( $1, $3, $5 ) ); }
    592571        ;
    593572
     
    599578                // CFA, assignment is separated from assignment_operator to ensure no assignment operations for tuples
    600579        conditional_expression
     580        | unary_expression '=' assignment_expression
     581                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $3 ); }
    601582        | unary_expression assignment_operator assignment_expression
    602                 { $$ = new CompositeExprNode( build_binary_ptr( $2, $1, $3 ) ); }
     583                { $$ = new CompositeExprNode( $2, $1, $3 ); }
    603584        | tuple assignment_opt                                                          // CFA, tuple expression
    604                 { $$ = ( $2 == 0 ) ? $1 : new CompositeExprNode( build_binary_ptr( OperKinds::Assign, $1, $2 ) ); }
     585                { $$ = ( $2 == 0 ) ? $1 : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $2 ); }
    605586        ;
    606587
     
    611592        ;
    612593
    613 assignment_operator:
    614         '='                                                                                     { $$ = OperKinds::Assign; }
    615         | MULTassign                                                            { $$ = OperKinds::MulAssn; }
    616         | DIVassign                                                                     { $$ = OperKinds::DivAssn; }
    617         | MODassign                                                                     { $$ = OperKinds::ModAssn; }
    618         | PLUSassign                                                            { $$ = OperKinds::PlusAssn; }
    619         | MINUSassign                                                           { $$ = OperKinds::MinusAssn; }
    620         | LSassign                                                                      { $$ = OperKinds::LSAssn; }
    621         | RSassign                                                                      { $$ = OperKinds::RSAssn; }
    622         | ANDassign                                                                     { $$ = OperKinds::AndAssn; }
    623         | ERassign                                                                      { $$ = OperKinds::ERAssn; }
    624         | ORassign                                                                      { $$ = OperKinds::OrAssn; }
    625         ;
    626 
    627594tuple:                                                                                                  // CFA, tuple
    628595                // CFA, one assignment_expression is factored out of comma_expression to eliminate a shift/reduce conflict with
    629596                // comma_expression in new_identifier_parameter_array and new_abstract_array
    630597        '[' ']'
    631                 { $$ = new CompositeExprNode( build_tuple() ); }
     598                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ) ); }
    632599        | '[' push assignment_expression pop ']'
    633                 { $$ = new CompositeExprNode( build_tuple( $3 ) ); }
     600                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), $3 ); }
    634601        | '[' push ',' tuple_expression_list pop ']'
    635                 { $$ = new CompositeExprNode( build_tuple( (ExpressionNode *)(new NullExprNode)->set_link( $4 ) ) ); }
     602                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(new NullExprNode)->set_link( $4 ) ); }
    636603        | '[' push assignment_expression ',' tuple_expression_list pop ']'
    637                 { $$ = new CompositeExprNode( build_tuple( (ExpressionNode *)$3->set_link( $5 ) ) ); }
     604                { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)$3->set_link( flattenCommas( $5 ) ) ); }
    638605        ;
    639606
     
    644611        ;
    645612
     613assignment_operator:
     614        MULTassign                                                                      { $$ = new OperatorNode( OperatorNode::MulAssn ); }
     615        | DIVassign                                                                     { $$ = new OperatorNode( OperatorNode::DivAssn ); }
     616        | MODassign                                                                     { $$ = new OperatorNode( OperatorNode::ModAssn ); }
     617        | PLUSassign                                                            { $$ = new OperatorNode( OperatorNode::PlusAssn ); }
     618        | MINUSassign                                                           { $$ = new OperatorNode( OperatorNode::MinusAssn ); }
     619        | LSassign                                                                      { $$ = new OperatorNode( OperatorNode::LSAssn ); }
     620        | RSassign                                                                      { $$ = new OperatorNode( OperatorNode::RSAssn ); }
     621        | ANDassign                                                                     { $$ = new OperatorNode( OperatorNode::AndAssn ); }
     622        | ERassign                                                                      { $$ = new OperatorNode( OperatorNode::ERAssn ); }
     623        | ORassign                                                                      { $$ = new OperatorNode( OperatorNode::OrAssn ); }
     624        ;
     625
    646626comma_expression:
    647627        assignment_expression
    648         | comma_expression ',' assignment_expression
    649                 { $$ = new CompositeExprNode( build_comma( $1, $3 ) ); }
     628        | comma_expression ',' assignment_expression    // { $$ = (ExpressionNode *)$1->add_to_list( $3 ); }
     629        //{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), $1, $3 ); }
     630                { $$ = new CompositeExprNode2( build_comma( $1, $3 ) ); }
    650631        ;
    651632
     
    669650        | '^' postfix_expression '{' argument_expression_list '}' ';' // CFA
    670651                {
    671                         Token fn;
    672                         fn.str = new std::string( "^?{}" ); // location undefined
    673                         $$ = new StatementNode( StatementNode::Exp, new CompositeExprNode( build_func( new VarRefNode( fn ), (ExpressionNode *)( $2 )->set_link( $4 ) ) ), 0 );
     652                        Token fn; fn.str = new std::string( "^?{}" ); // location undefined
     653                        $$ = new StatementNode( StatementNode::Exp, new CompositeExprNode( new VarRefNode( fn ),
     654                                (ExpressionNode *)( $2 )->set_link( $4 ) ), 0 );
    674655                }
    675656        ;
     
    759740        constant_expression                                                     { $$ = $1; }
    760741        | constant_expression ELLIPSIS constant_expression      // GCC, subrange
    761                 { $$ = new CompositeExprNode( build_range( $1, $3 ) ); }
     742                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Range, $1, $3 ) ); }
    762743        | subrange                                                                                      // CFA, subrange
    763744        ;
     
    18001781                { $$ = new DesignatorNode( $3, true ); }
    18011782        | '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements
    1802                 { $$ = new DesignatorNode( new CompositeExprNode( build_range( $3, $5 ) ), true ); }
     1783                { $$ = new DesignatorNode( new CompositeExprNode2( build_opr2( OperatorNode::Range, $3, $5 ) ), true ); }
    18031784        | '.' '[' push field_list pop ']'                                       // CFA, tuple field selector
    18041785                { $$ = new DesignatorNode( $4 ); }
     
    21292110subrange:
    21302111        constant_expression '~' constant_expression                     // CFA, integer subrange
    2131                 { $$ = new CompositeExprNode( build_range( $1, $3 ) ); }
     2112                { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Range, $1, $3 ) ); }
    21322113        ;
    21332114
Note: See TracChangeset for help on using the changeset viewer.