Changeset 3078643 for src/Parser/parser.yy
- Timestamp:
- Aug 10, 2016, 2:29:44 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- be0a9d8, ef42e764
- Parents:
- f18a711 (diff), a563f01 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/Parser/parser.yy (modified) (40 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/parser.yy
rf18a711 r3078643 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Aug 5 08:15:57201613 // Update Count : 1 72112 // Last Modified On : Wed Aug 10 13:09:53 2016 13 // Update Count : 1844 14 14 // 15 15 … … 60 60 std::stack< LinkageSpec::Type > linkageStack; 61 61 TypedefTable 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 62 67 %} 63 68 … … 116 121 DeclarationNode::TypeClass tclass; 117 122 StatementNode *sn; 118 ConstantNode *constant; 123 ConstantExpr *constant; 124 ForCtl *fctl; 119 125 LabelNode *label; 120 126 InitializerNode *in; 121 Oper atorNode::Typeop;127 OperKinds op; 122 128 bool flag; 123 129 } … … 128 134 129 135 // expressions 130 %type< constant> constant136 %type<en> constant 131 137 %type<en> tuple tuple_expression_list 132 %type<op> ptrref_operator 133 %type<en> unary_operator assignment_operator 138 %type<op> ptrref_operator unary_operator assignment_operator 134 139 %type<en> primary_expression postfix_expression unary_expression 135 140 %type<en> cast_expression multiplicative_expression additive_expression shift_expression … … 138 143 %type<en> constant_expression assignment_expression assignment_expression_opt 139 144 %type<en> comma_expression comma_expression_opt 140 %type<en> argument_expression_list argument_expression for_control_expression assignment_opt 145 //%type<en> argument_expression_list argument_expression for_control_expression assignment_opt 146 %type<en> argument_expression_list argument_expression assignment_opt 147 %type<fctl> for_control_expression 141 148 %type<en> subrange 142 149 %type<en> asm_operands_opt asm_operands_list asm_operand 143 150 %type<label> label_list 144 %type< constant> asm_clobbers_list_opt151 %type<en> asm_clobbers_list_opt 145 152 %type<flag> asm_volatile_opt 146 153 … … 305 312 constant: 306 313 // ENUMERATIONconstant is not included here; it is treated as a variable with type "enumeration constant". 307 INTEGERconstant { $$ = makeConstantInteger( *$1); }308 | FLOATINGconstant { $$ = makeConstantFloat( *$1); }309 | CHARACTERconstant { $$ = makeConstantChar( *$1); }314 INTEGERconstant { $$ = new ExpressionNode( build_constantInteger( *$1 ) ); } 315 | FLOATINGconstant { $$ = new ExpressionNode( build_constantFloat( *$1 ) ); } 316 | CHARACTERconstant { $$ = new ExpressionNode( build_constantChar( *$1 ) ); } 310 317 ; 311 318 … … 332 339 333 340 string_literal_list: // juxtaposed strings are concatenated 334 STRINGliteral { $$ = makeConstantStr( *$1 ); } 335 | string_literal_list STRINGliteral { $$ = $1->appendstr( $2 ); } 341 STRINGliteral { $$ = build_constantStr( *$1 ); } 342 | string_literal_list STRINGliteral 343 { 344 appendStr( $1->get_constant()->get_value(), $2 ); 345 delete $2; // allocated by lexer 346 $$ = $1; 347 } 336 348 ; 337 349 … … 340 352 primary_expression: 341 353 IDENTIFIER // typedef name cannot be used as a variable name 342 { $$ = new VarRefNode( $1); }354 { $$ = new ExpressionNode( build_varref( $1 ) ); } 343 355 | zero_one 344 { $$ = new VarRefNode( $1); }356 { $$ = new ExpressionNode( build_varref( $1 ) ); } 345 357 | '(' comma_expression ')' 346 358 { $$ = $2; } 347 359 | '(' compound_statement ')' // GCC, lambda expression 348 { $$ = new ValofExprNode( $2); }360 { $$ = new ExpressionNode( build_valexpr( $2 ) ); } 349 361 ; 350 362 … … 356 368 // little advantage to this feature and many disadvantages. It is possible to write x[(i,j)] in CFA, which is 357 369 // equivalent to the old x[i,j]. 358 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Index, $1, $4 ) ); }370 { $$ = new ExpressionNode( build_binary_val( OperKinds::Index, $1, $4 ) ); } 359 371 | postfix_expression '(' argument_expression_list ')' 360 { $$ = new CompositeExprNode( $1, $3); }372 { $$ = new ExpressionNode( build_func( $1, $3 ) ); } 361 373 // ambiguity with .0 so space required after field-selection, e.g. 362 374 // struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1; 363 375 | postfix_expression '.' no_attr_identifier 364 { $$ = new CompositeExprNode2( build_fieldSel( $1, new VarRefNode( $3 ) ) ); }376 { $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); } 365 377 | postfix_expression '.' '[' push field_list pop ']' // CFA, tuple field selector 366 378 | postfix_expression ARROW no_attr_identifier 367 { $$ = new CompositeExprNode2( build_pfieldSel( $1, new VarRefNode( $3 ) ) ); }379 { $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); } 368 380 | postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector 369 381 | postfix_expression ICR 370 { $$ = new CompositeExprNode2( build_opr1( OperatorNode::IncrPost, $1 ) ); }382 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); } 371 383 | postfix_expression DECR 372 { $$ = new CompositeExprNode2( build_opr1( OperatorNode::DecrPost, $1 ) ); }384 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, $1 ) ); } 373 385 | '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99 374 { $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true) ); }386 { $$ = new ExpressionNode( build_compoundLiteral( $2, new InitializerNode( $5, true ) ) ); } 375 387 | postfix_expression '{' argument_expression_list '}' // CFA 376 388 { 377 Token fn; fn.str = new std::string( "?{}" ); // location undefined 378 $$ = new CompositeExprNode( new VarRefNode( fn ), (ExpressionNode *)( $1 )->set_link( $3 ) ); 389 Token fn; 390 fn.str = new std::string( "?{}" ); // location undefined 391 $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $1 )->set_link( $3 ) ) ); 379 392 } 380 393 ; … … 390 403 { $$ = 0; } // use default argument 391 404 | assignment_expression 392 | no_attr_identifier ':' assignment_expression393 { $$ = $3->set_argName( $1 ); }394 // Only a list of no_attr_identifier_or_type_name is allowed in this context. However, there is insufficient395 // look ahead to distinguish between this list of parameter names and a tuple, so the tuple form must be used396 // with an appropriate semantic check.397 | '[' push assignment_expression pop ']' ':' assignment_expression398 { $$ = $7->set_argName( $3 ); }399 | '[' push assignment_expression ',' tuple_expression_list pop ']' ':' assignment_expression400 { $$ = $9->set_argName( new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)$3->set_link( flattenCommas( $5 )))); }401 405 ; 402 406 … … 408 412 field: // CFA, tuple field selector 409 413 no_attr_identifier 410 { $$ = new VarRefNode( $1); }414 { $$ = new ExpressionNode( build_varref( $1 ) ); } 411 415 // ambiguity with .0 so space required after field-selection, e.g. 412 416 // struct S { int 0, 1; } s; s. 0 = 0; s. 1 = 1; 413 417 | no_attr_identifier '.' field 414 { $$ = new CompositeExprNode2( build_fieldSel( $3, new VarRefNode( $1 ) ) ); }418 { $$ = new ExpressionNode( build_fieldSel( $3, build_varref( $1 ) ) ); } 415 419 | no_attr_identifier '.' '[' push field_list pop ']' 416 { $$ = new CompositeExprNode2( build_fieldSel( $5, new VarRefNode( $1 ) ) ); }420 { $$ = new ExpressionNode( build_fieldSel( $5, build_varref( $1 ) ) ); } 417 421 | no_attr_identifier ARROW field 418 { $$ = new CompositeExprNode2( build_pfieldSel( $3, new VarRefNode( $1 ) ) ); }422 { $$ = new ExpressionNode( build_pfieldSel( $3, build_varref( $1 ) ) ); } 419 423 | no_attr_identifier ARROW '[' push field_list pop ']' 420 { $$ = new CompositeExprNode2( build_pfieldSel( $5, new VarRefNode( $1 ) ) ); }424 { $$ = new ExpressionNode( build_pfieldSel( $5, build_varref( $1 ) ) ); } 421 425 ; 422 426 … … 428 432 { $$ = $1; } 429 433 | string_literal_list 430 { $$ = $1; }434 { $$ = new ExpressionNode( $1 ); } 431 435 | EXTENSION cast_expression // GCC 432 436 { $$ = $2->set_extension( true ); } … … 435 439 // { * int X; } // CFA declaration of pointer to int 436 440 | ptrref_operator cast_expression // CFA 437 { $$ = $1 == OperatorNode::AddressOf ? (ExpressionNode*) new CompositeExprNode2( build_addressOf( $2 ) ) 438 : (ExpressionNode*)new CompositeExprNode( new OperatorNode ( $1 ), $2 ); } 441 { 442 switch ( $1 ) { 443 case OperKinds::AddressOf: 444 $$ = new ExpressionNode( build_addressOf( $2 ) ); 445 break; 446 case OperKinds::PointTo: 447 $$ = new ExpressionNode( build_unary_val( $1, $2 ) ); 448 break; 449 default: 450 assert( false ); 451 } 452 } 439 453 | unary_operator cast_expression 440 { $$ = new CompositeExprNode( $1, $2); }454 { $$ = new ExpressionNode( build_unary_val( $1, $2 ) ); } 441 455 | ICR unary_expression 442 { $$ = new CompositeExprNode2( build_opr1( OperatorNode::Incr, $2 ) ); }456 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::Incr, $2 ) ); } 443 457 | DECR unary_expression 444 { $$ = new CompositeExprNode2( build_opr1( OperatorNode::Decr, $2 ) ); }458 { $$ = new ExpressionNode( build_unary_ptr( OperKinds::Decr, $2 ) ); } 445 459 | SIZEOF unary_expression 446 { $$ = new CompositeExprNode2( build_sizeOf( $2 ) ); }460 { $$ = new ExpressionNode( build_sizeOfexpr( $2 ) ); } 447 461 | SIZEOF '(' type_name_no_function ')' 448 { $$ = new CompositeExprNode2( build_sizeOf( new TypeValueNode( $3 ) ) ); } 462 { $$ = new ExpressionNode( build_sizeOftype( $3 ) ); } 463 | ALIGNOF unary_expression // GCC, variable alignment 464 { $$ = new ExpressionNode( build_alignOfexpr( $2 ) ); } 465 | ALIGNOF '(' type_name_no_function ')' // GCC, type alignment 466 { $$ = new ExpressionNode( build_alignOftype( $3 ) ); } 449 467 | OFFSETOF '(' type_name_no_function ',' no_attr_identifier ')' 450 { $$ = new CompositeExprNode2( build_offsetOf( new TypeValueNode( $3 ), new VarRefNode( $5 ) ) ); }468 { $$ = new ExpressionNode( build_offsetOf( $3, build_varref( $5 ) ) ); } 451 469 | ATTR_IDENTIFIER 452 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ) ); } 470 { $$ = new ExpressionNode( build_attrexpr( build_varref( $1 ), nullptr ) ); } 471 | ATTR_IDENTIFIER '(' argument_expression ')' 472 { $$ = new ExpressionNode( build_attrexpr( build_varref( $1 ), $3 ) ); } 453 473 | ATTR_IDENTIFIER '(' type_name ')' 454 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), new TypeValueNode( $3 ) ); } 455 | ATTR_IDENTIFIER '(' argument_expression ')' 456 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), $3 ); } 457 | ALIGNOF unary_expression // GCC, variable alignment 458 { $$ = new CompositeExprNode2( build_alignOf( $2 ) ); } 459 | ALIGNOF '(' type_name_no_function ')' // GCC, type alignment 460 { $$ = new CompositeExprNode2( build_alignOf( new TypeValueNode( $3 ) ) ); } 474 { $$ = new ExpressionNode( build_attrtype( build_varref( $1 ), $3 ) ); } 461 475 // | ANDAND IDENTIFIER // GCC, address of label 462 // { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LabelAddress ), new VarRefNode( $2, true ) ); }476 // { $$ = new ExpressionNode( new OperatorNode( OperKinds::LabelAddress ), new ExpressionNode( build_varref( $2, true ) ); } 463 477 ; 464 478 465 479 ptrref_operator: 466 '*' { $$ = Oper atorNode::PointTo; }467 | '&' { $$ = Oper atorNode::AddressOf; }480 '*' { $$ = OperKinds::PointTo; } 481 | '&' { $$ = OperKinds::AddressOf; } 468 482 // GCC, address of label must be handled by semantic check for ref,ref,label 469 | ANDAND { $$ = OperatorNode::And; }483 // | ANDAND { $$ = OperKinds::And; } 470 484 ; 471 485 472 486 unary_operator: 473 '+' { $$ = new OperatorNode( OperatorNode::UnPlus ); }474 | '-' { $$ = new OperatorNode( OperatorNode::UnMinus ); }475 | '!' { $$ = new OperatorNode( OperatorNode::Neg ); }476 | '~' { $$ = new OperatorNode( OperatorNode::BitNeg ); }487 '+' { $$ = OperKinds::UnPlus; } 488 | '-' { $$ = OperKinds::UnMinus; } 489 | '!' { $$ = OperKinds::Neg; } 490 | '~' { $$ = OperKinds::BitNeg; } 477 491 ; 478 492 … … 480 494 unary_expression 481 495 | '(' type_name_no_function ')' cast_expression 482 { $$ = new CompositeExprNode2( build_cast( new TypeValueNode( $2 ), $4 ) ); }496 { $$ = new ExpressionNode( build_cast( $2, $4 ) ); } 483 497 | '(' type_name_no_function ')' tuple 484 { $$ = new CompositeExprNode2( build_cast( new TypeValueNode( $2 ), $4 ) ); }498 { $$ = new ExpressionNode( build_cast( $2, $4 ) ); } 485 499 ; 486 500 … … 488 502 cast_expression 489 503 | multiplicative_expression '*' cast_expression 490 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Mul, $1, $3 ) ); }504 { $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); } 491 505 | multiplicative_expression '/' cast_expression 492 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Div, $1, $3 ) ); }506 { $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); } 493 507 | multiplicative_expression '%' cast_expression 494 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Mod, $1, $3 ) ); }508 { $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); } 495 509 ; 496 510 … … 498 512 multiplicative_expression 499 513 | additive_expression '+' multiplicative_expression 500 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Plus, $1, $3 ) ); }514 { $$ = new ExpressionNode( build_binary_val( OperKinds::Plus, $1, $3 ) ); } 501 515 | additive_expression '-' multiplicative_expression 502 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Minus, $1, $3 ) ); }516 { $$ = new ExpressionNode( build_binary_val( OperKinds::Minus, $1, $3 ) ); } 503 517 ; 504 518 … … 506 520 additive_expression 507 521 | shift_expression LS additive_expression 508 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::LShift, $1, $3 ) ); }522 { $$ = new ExpressionNode( build_binary_val( OperKinds::LShift, $1, $3 ) ); } 509 523 | shift_expression RS additive_expression 510 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::RShift, $1, $3 ) ); }524 { $$ = new ExpressionNode( build_binary_val( OperKinds::RShift, $1, $3 ) ); } 511 525 ; 512 526 … … 514 528 shift_expression 515 529 | relational_expression '<' shift_expression 516 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::LThan, $1, $3 ) ); }530 { $$ = new ExpressionNode( build_binary_val( OperKinds::LThan, $1, $3 ) ); } 517 531 | relational_expression '>' shift_expression 518 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::GThan, $1, $3 ) ); }532 { $$ = new ExpressionNode( build_binary_val( OperKinds::GThan, $1, $3 ) ); } 519 533 | relational_expression LE shift_expression 520 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::LEThan, $1, $3 ) ); }534 { $$ = new ExpressionNode( build_binary_val( OperKinds::LEThan, $1, $3 ) ); } 521 535 | relational_expression GE shift_expression 522 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::GEThan, $1, $3 ) ); }536 { $$ = new ExpressionNode( build_binary_val( OperKinds::GEThan, $1, $3 ) ); } 523 537 ; 524 538 … … 526 540 relational_expression 527 541 | equality_expression EQ relational_expression 528 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Eq, $1, $3 ) ); }542 { $$ = new ExpressionNode( build_binary_val( OperKinds::Eq, $1, $3 ) ); } 529 543 | equality_expression NE relational_expression 530 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Neq, $1, $3 ) ); }544 { $$ = new ExpressionNode( build_binary_val( OperKinds::Neq, $1, $3 ) ); } 531 545 ; 532 546 … … 534 548 equality_expression 535 549 | AND_expression '&' equality_expression 536 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::BitAnd, $1, $3 ) ); }550 { $$ = new ExpressionNode( build_binary_val( OperKinds::BitAnd, $1, $3 ) ); } 537 551 ; 538 552 … … 540 554 AND_expression 541 555 | exclusive_OR_expression '^' AND_expression 542 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Xor, $1, $3 ) ); }556 { $$ = new ExpressionNode( build_binary_val( OperKinds::Xor, $1, $3 ) ); } 543 557 ; 544 558 … … 546 560 exclusive_OR_expression 547 561 | inclusive_OR_expression '|' exclusive_OR_expression 548 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::BitOr, $1, $3 ) ); }562 { $$ = new ExpressionNode( build_binary_val( OperKinds::BitOr, $1, $3 ) ); } 549 563 ; 550 564 … … 552 566 inclusive_OR_expression 553 567 | logical_AND_expression ANDAND inclusive_OR_expression 554 { $$ = new CompositeExprNode2( build_and_or( $1, $3, true ) ); }568 { $$ = new ExpressionNode( build_and_or( $1, $3, true ) ); } 555 569 ; 556 570 … … 558 572 logical_AND_expression 559 573 | logical_OR_expression OROR logical_AND_expression 560 { $$ = new CompositeExprNode2( build_and_or( $1, $3, false ) ); }574 { $$ = new ExpressionNode( build_and_or( $1, $3, false ) ); } 561 575 ; 562 576 … … 564 578 logical_OR_expression 565 579 | logical_OR_expression '?' comma_expression ':' conditional_expression 566 { $$ = new CompositeExprNode2( build_cond( $1, $3, $5 ) ); } 580 { $$ = new ExpressionNode( build_cond( $1, $3, $5 ) ); } 581 // FIX ME: this hack computes $1 twice 567 582 | logical_OR_expression '?' /* empty */ ':' conditional_expression // GCC, omitted first operand 568 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), $1, $4); }583 { $$ = new ExpressionNode( build_cond( $1, $1, $4 ) ); } 569 584 | logical_OR_expression '?' comma_expression ':' tuple // CFA, tuple expression 570 { $$ = new CompositeExprNode2( build_cond( $1, $3, $5 ) ); }585 { $$ = new ExpressionNode( build_cond( $1, $3, $5 ) ); } 571 586 ; 572 587 … … 578 593 // CFA, assignment is separated from assignment_operator to ensure no assignment operations for tuples 579 594 conditional_expression 580 | unary_expression '=' assignment_expression581 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $3 ); }582 595 | unary_expression assignment_operator assignment_expression 583 { $$ = new CompositeExprNode( $2, $1, $3); }596 { $$ = new ExpressionNode( build_binary_ptr( $2, $1, $3 ) ); } 584 597 | tuple assignment_opt // CFA, tuple expression 585 { $$ = ( $2 == 0 ) ? $1 : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $2); }598 { $$ = ( $2 == 0 ) ? $1 : new ExpressionNode( build_binary_ptr( OperKinds::Assign, $1, $2 ) ); } 586 599 ; 587 600 588 601 assignment_expression_opt: 589 602 // empty 590 { $$ = n ew NullExprNode; }603 { $$ = nullptr; } 591 604 | assignment_expression 605 ; 606 607 assignment_operator: 608 '=' { $$ = OperKinds::Assign; } 609 | MULTassign { $$ = OperKinds::MulAssn; } 610 | DIVassign { $$ = OperKinds::DivAssn; } 611 | MODassign { $$ = OperKinds::ModAssn; } 612 | PLUSassign { $$ = OperKinds::PlusAssn; } 613 | MINUSassign { $$ = OperKinds::MinusAssn; } 614 | LSassign { $$ = OperKinds::LSAssn; } 615 | RSassign { $$ = OperKinds::RSAssn; } 616 | ANDassign { $$ = OperKinds::AndAssn; } 617 | ERassign { $$ = OperKinds::ERAssn; } 618 | ORassign { $$ = OperKinds::OrAssn; } 592 619 ; 593 620 … … 596 623 // comma_expression in new_identifier_parameter_array and new_abstract_array 597 624 '[' ']' 598 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC) ); }625 { $$ = new ExpressionNode( build_tuple() ); } 599 626 | '[' push assignment_expression pop ']' 600 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), $3); }627 { $$ = new ExpressionNode( build_tuple( $3 ) ); } 601 628 | '[' push ',' tuple_expression_list pop ']' 602 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(new NullExprNode)->set_link( $4) ); }629 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_link( $4 ) ) ); } 603 630 | '[' push assignment_expression ',' tuple_expression_list pop ']' 604 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)$3->set_link( flattenCommas( $5 ) ) ); }631 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_link( $5 ) ) ); } 605 632 ; 606 633 … … 611 638 ; 612 639 613 assignment_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 626 640 comma_expression: 627 641 assignment_expression 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 ) ); } 642 | comma_expression ',' assignment_expression 643 { $$ = new ExpressionNode( build_comma( $1, $3 ) ); } 631 644 ; 632 645 … … 650 663 | '^' postfix_expression '{' argument_expression_list '}' ';' // CFA 651 664 { 652 Token fn; fn.str = new std::string( "^?{}" ); // location undefined653 $$ = new StatementNode( StatementNode::Exp, new CompositeExprNode( new VarRefNode( fn ),654 (ExpressionNode *)( $2 )->set_link( $4) ), 0 );665 Token fn; 666 fn.str = new std::string( "^?{}" ); // location undefined 667 $$ = new StatementNode( StatementNode::Exp, new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $2 )->set_link( $4 ) ) ), 0 ); 655 668 } 656 669 ; … … 710 723 IF '(' comma_expression ')' statement %prec THEN 711 724 // explicitly deal with the shift/reduce conflict on if/else 712 { $$ = new StatementNode( StatementNode::If, $3, $5 ); } 725 //{ $$ = new StatementNode( StatementNode::If, $3, $5 ); } 726 { $$ = new StatementNode2( build_if( $3, $5, nullptr ) ); } 713 727 | IF '(' comma_expression ')' statement ELSE statement 714 { $$ = new StatementNode( StatementNode::If, $3, (StatementNode *)mkList((*$5, *$7 )) ); } 728 //{ $$ = new StatementNode( StatementNode::If, $3, (StatementNode *)mkList((*$5, *$7 )) ); } 729 { $$ = new StatementNode2( build_if( $3, $5, $7 ) ); } 715 730 | SWITCH '(' comma_expression ')' case_clause // CFA 716 { $$ = new StatementNode( StatementNode::Switch, $3, $5 ); } 731 //{ $$ = new StatementNode( StatementNode::Switch, $3, $5 ); } 732 { $$ = new StatementNode2( build_switch( $3, $5 ) ); } 717 733 | SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA 718 734 { 719 StatementNode *sw = new StatementNode ( StatementNode::Switch, $3, $8);735 StatementNode *sw = new StatementNode2( build_switch( $3, $8 ) ); 720 736 // The semantics of the declaration list is changed to include associated initialization, which is performed 721 737 // *before* the transfer to the appropriate case clause by hoisting the declarations into a compound … … 726 742 } 727 743 | CHOOSE '(' comma_expression ')' case_clause // CFA 728 { $$ = new StatementNode( StatementNode::Switch, $3, $5 ); } 744 //{ $$ = new StatementNode( StatementNode::Switch, $3, $5 ); } 745 { $$ = new StatementNode2( build_switch( $3, $5 ) ); } 729 746 | CHOOSE '(' comma_expression ')' '{' push declaration_list_opt choose_clause_list_opt '}' // CFA 730 747 { 731 StatementNode *sw = new StatementNode( StatementNode::Switch, $3, $8 ); 748 //StatementNode *sw = new StatementNode( StatementNode::Switch, $3, $8 ); 749 StatementNode *sw = new StatementNode2( build_switch( $3, $8 ) ); 732 750 $$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode( $7 ))->set_link( sw )) ) : sw; 733 751 } … … 740 758 constant_expression { $$ = $1; } 741 759 | constant_expression ELLIPSIS constant_expression // GCC, subrange 742 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Range,$1, $3 ) ); }760 { $$ = new ExpressionNode( build_range( $1, $3 ) ); } 743 761 | subrange // CFA, subrange 744 762 ; … … 810 828 iteration_statement: 811 829 WHILE '(' comma_expression ')' statement 812 { $$ = new StatementNode ( StatementNode::While, $3, $5); }830 { $$ = new StatementNode2( build_while( $3, $5 ) ); } 813 831 | DO statement WHILE '(' comma_expression ')' ';' 814 { $$ = new StatementNode ( StatementNode::Do, $5, $2); }832 { $$ = new StatementNode2( build_while( $5, $2 ) ); } 815 833 | FOR '(' push for_control_expression ')' statement 816 { $$ = new StatementNode ( StatementNode::For, $4, $6); }834 { $$ = new StatementNode2( build_for( $4, $6 ) ); } 817 835 ; 818 836 819 837 for_control_expression: 820 838 comma_expression_opt pop ';' comma_expression_opt ';' comma_expression_opt 821 { $$ = new ForCtl ExprNode( $1, $4, $6 ); }839 { $$ = new ForCtl( $1, $4, $6 ); } 822 840 | declaration comma_expression_opt ';' comma_expression_opt // C99 823 { $$ = new ForCtl ExprNode( $1, $2, $4 ); }824 ;841 { $$ = new ForCtl( $1, $2, $4 ); } 842 ; 825 843 826 844 jump_statement: … … 936 954 { $$ = new AsmStmtNode( StatementNode::Asm, $2, $4, $6, $8, $10 ); } 937 955 | ASM asm_volatile_opt GOTO '(' string_literal_list ':' ':' asm_operands_opt ':' asm_clobbers_list_opt ':' label_list ')' ';' 938 { $$ = new AsmStmtNode( StatementNode::Asm, $2, $5, 0, $8, $10, $12 ); }956 { $$ = new AsmStmtNode( StatementNode::Asm, $2, $5, 0, $8, $10, $12 ); } 939 957 ; 940 958 … … 960 978 asm_operand: // GCC 961 979 string_literal_list '(' constant_expression ')' 962 { $$ = new AsmExprNode( 0, $1, $3); }980 { $$ = new ExpressionNode( build_asm( 0, $1, $3 ) ); } 963 981 | '[' constant_expression ']' string_literal_list '(' constant_expression ')' 964 { $$ = new AsmExprNode( $2, $4, $6); }982 { $$ = new ExpressionNode( build_asm( $2, $4, $6 ) ); } 965 983 ; 966 984 … … 969 987 { $$ = 0; } // use default argument 970 988 | string_literal_list 971 { $$ = $1; }989 { $$ = new ExpressionNode( $1 ); } 972 990 | asm_clobbers_list_opt ',' string_literal_list 973 { $$ = (ConstantNode *)$1->set_link( $3); }991 { $$ = (ExpressionNode *)$1->set_link( new ExpressionNode( $3 ) ); } 974 992 ; 975 993 … … 1758 1776 designator_list ':' // C99, CFA uses ":" instead of "=" 1759 1777 | no_attr_identifier_or_type_name ':' // GCC, field name 1760 { $$ = new VarRefNode( $1); }1778 { $$ = new ExpressionNode( build_varref( $1 ) ); } 1761 1779 ; 1762 1780 … … 1764 1782 designator 1765 1783 | designator_list designator 1766 { $$ = (ExpressionNode *)( $1->set_link( $2 ) ); }1767 //| designator_list designator { $$ = new CompositeExprNode( $1, $2 ); }1784 { $$ = (ExpressionNode *)( $1->set_link( $2 ) ); } 1785 //| designator_list designator { $$ = new ExpressionNode( $1, $2 ); } 1768 1786 ; 1769 1787 1770 1788 designator: 1771 // lexer ambiguity: designator ".0" is floating-point constant or designator for name 0 only ".0" and ".1" 1772 // allowed => semantic check 1773 FLOATINGconstant 1774 { $$ = new DesignatorNode( new VarRefNode( $1 ) ); } 1775 | '.' no_attr_identifier_or_type_name // C99, field name 1776 { $$ = new DesignatorNode( new VarRefNode( $2 ) ); } 1789 '.' no_attr_identifier_or_type_name // C99, field name 1790 { $$ = new ExpressionNode( build_varref( $2 ) ); } 1777 1791 | '[' push assignment_expression pop ']' // C99, single array element 1778 1792 // assignment_expression used instead of constant_expression because of shift/reduce conflicts with tuple. 1779 { $$ = new DesignatorNode( $3, true ); }1793 { $$ = $3; } 1780 1794 | '[' push subrange pop ']' // CFA, multiple array elements 1781 { $$ = new DesignatorNode( $3, true ); }1795 { $$ = $3; } 1782 1796 | '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements 1783 { $$ = new DesignatorNode( new CompositeExprNode2( build_opr2( OperatorNode::Range, $3, $5 ) ), true); }1797 { $$ = new ExpressionNode( build_range( $3, $5 ) ); } 1784 1798 | '.' '[' push field_list pop ']' // CFA, tuple field selector 1785 { $$ = new DesignatorNode( $4 ); }1799 { $$ = $4; } 1786 1800 ; 1787 1801 … … 1871 1885 type_name_list: // CFA 1872 1886 type_name 1873 { $$ = new TypeValueNode( $1); }1887 { $$ = new ExpressionNode( build_typevalue( $1 ) ); } 1874 1888 | assignment_expression 1875 1889 | type_name_list ',' type_name 1876 { $$ = (ExpressionNode *)( $1->set_link( new TypeValueNode( $3 ))); }1890 { $$ = (ExpressionNode *)( $1->set_link( new ExpressionNode( build_typevalue( $3 ) ) ) ); } 1877 1891 | type_name_list ',' assignment_expression 1878 1892 { $$ = (ExpressionNode *)( $1->set_link( $3 )); } … … 2110 2124 subrange: 2111 2125 constant_expression '~' constant_expression // CFA, integer subrange 2112 { $$ = new CompositeExprNode2( build_opr2( OperatorNode::Range,$1, $3 ) ); }2126 { $$ = new ExpressionNode( build_range( $1, $3 ) ); } 2113 2127 ; 2114 2128
Note:
See TracChangeset
for help on using the changeset viewer.