diff options
| -rw-r--r-- | src/gamestate.cpp | 14 | ||||
| -rw-r--r-- | src/variable.cpp | 146 | ||||
| -rw-r--r-- | test.stage | 32 |
3 files changed, 155 insertions, 37 deletions
diff --git a/src/gamestate.cpp b/src/gamestate.cpp index 57dbe2f..285c151 100644 --- a/src/gamestate.cpp +++ b/src/gamestate.cpp | |||
| @@ -427,34 +427,28 @@ void GameState::parse( const AstBranch::NodeList &lCode ) | |||
| 427 | case AstNode::tPlusStore: | 427 | case AstNode::tPlusStore: |
| 428 | { | 428 | { |
| 429 | Variable y = popDeref(); | 429 | Variable y = popDeref(); |
| 430 | Variable x = pop(); | 430 | deref( lStack.peek(), true ) += y; |
| 431 | deref( x ) += y; | ||
| 432 | } | 431 | } |
| 433 | break; | 432 | break; |
| 434 | 433 | ||
| 435 | case AstNode::tMinusStore: | 434 | case AstNode::tMinusStore: |
| 436 | { | 435 | { |
| 437 | Variable y = popDeref(); | 436 | Variable y = popDeref(); |
| 438 | Variable x = pop(); | 437 | deref( lStack.peek(), true ) -= y; |
| 439 | deref( x ) -= y; | ||
| 440 | } | 438 | } |
| 441 | break; | 439 | break; |
| 442 | 440 | ||
| 443 | case AstNode::tDivideStore: | 441 | case AstNode::tDivideStore: |
| 444 | { | 442 | { |
| 445 | Variable y = popDeref(); | 443 | Variable y = popDeref(); |
| 446 | Variable x = pop(); | 444 | deref( lStack.peek(), true ) /= y; |
| 447 | VariableRef r = x.getVariableRef(); | ||
| 448 | setVariable( r.sName, getVariable( r.sName, r.sid ) / y, r.sid ); | ||
| 449 | } | 445 | } |
| 450 | break; | 446 | break; |
| 451 | 447 | ||
| 452 | case AstNode::tMultiplyStore: | 448 | case AstNode::tMultiplyStore: |
| 453 | { | 449 | { |
| 454 | Variable y = popDeref(); | 450 | Variable y = popDeref(); |
| 455 | Variable x = pop(); | 451 | deref( lStack.peek(), true ) *= y; |
| 456 | VariableRef r = x.getVariableRef(); | ||
| 457 | setVariable( r.sName, getVariable( r.sName, r.sid ) * y, r.sid ); | ||
| 458 | } | 452 | } |
| 459 | break; | 453 | break; |
| 460 | 454 | ||
diff --git a/src/variable.cpp b/src/variable.cpp index 2ea8334..68a1778 100644 --- a/src/variable.cpp +++ b/src/variable.cpp | |||
| @@ -417,7 +417,7 @@ Variable &Variable::operator-=( const Variable &rhs ) | |||
| 417 | break; | 417 | break; |
| 418 | 418 | ||
| 419 | default: | 419 | default: |
| 420 | throw VariableException("Int += invalid..."); | 420 | throw VariableException("Int -= invalid..."); |
| 421 | } | 421 | } |
| 422 | break; | 422 | break; |
| 423 | 423 | ||
| @@ -445,10 +445,146 @@ Variable &Variable::operator-=( const Variable &rhs ) | |||
| 445 | return *this; | 445 | return *this; |
| 446 | } | 446 | } |
| 447 | 447 | ||
| 448 | /* | 448 | Variable &Variable::operator*=( const Variable &rhs ) |
| 449 | Variable &Variable::operator*=( const Variable &rhs ); | 449 | { |
| 450 | Variable &Variable::operator/=( const Variable &rhs ); | 450 | switch( eType ) |
| 451 | */ | 451 | { |
| 452 | case tNull: | ||
| 453 | throw VariableException("You cannot multiply nulls."); | ||
| 454 | |||
| 455 | case tBool: | ||
| 456 | throw VariableException("You cannot multiply bools."); | ||
| 457 | |||
| 458 | case tInt: | ||
| 459 | switch( rhs.eType ) | ||
| 460 | { | ||
| 461 | case tInt: | ||
| 462 | iValue *= rhs.iValue; | ||
| 463 | break; | ||
| 464 | |||
| 465 | case tFloat: | ||
| 466 | { | ||
| 467 | double dTmp = iValue; | ||
| 468 | eType = tFloat; | ||
| 469 | fValue = dTmp * rhs.fValue; | ||
| 470 | } | ||
| 471 | break; | ||
| 472 | |||
| 473 | default: | ||
| 474 | throw VariableException("Int *= invalid..."); | ||
| 475 | } | ||
| 476 | break; | ||
| 477 | |||
| 478 | case tFloat: | ||
| 479 | switch( rhs.eType ) | ||
| 480 | { | ||
| 481 | case tInt: | ||
| 482 | fValue *= rhs.iValue; | ||
| 483 | break; | ||
| 484 | |||
| 485 | case tFloat: | ||
| 486 | fValue *= rhs.fValue; | ||
| 487 | break; | ||
| 488 | |||
| 489 | default: | ||
| 490 | throw VariableException("Int *= invalid..."); | ||
| 491 | } | ||
| 492 | break; | ||
| 493 | |||
| 494 | case tString: | ||
| 495 | throw VariableException("You cannot multiply strings."); | ||
| 496 | break; | ||
| 497 | |||
| 498 | case tSituation: | ||
| 499 | throw VariableException("You cannot multiply situations."); | ||
| 500 | break; | ||
| 501 | |||
| 502 | case tVariable: | ||
| 503 | throw VariableException("You cannot multiply variable names."); | ||
| 504 | break; | ||
| 505 | |||
| 506 | case tList: | ||
| 507 | throw VariableException("You cannot multiply lists."); | ||
| 508 | break; | ||
| 509 | |||
| 510 | case tDictionary: | ||
| 511 | throw VariableException("You cannot multiply dictionaries."); | ||
| 512 | break; | ||
| 513 | } | ||
| 514 | |||
| 515 | return *this; | ||
| 516 | } | ||
| 517 | |||
| 518 | Variable &Variable::operator/=( const Variable &rhs ) | ||
| 519 | { | ||
| 520 | switch( eType ) | ||
| 521 | { | ||
| 522 | case tNull: | ||
| 523 | throw VariableException("You cannot divide nulls."); | ||
| 524 | |||
| 525 | case tBool: | ||
| 526 | throw VariableException("You cannot divide bools."); | ||
| 527 | |||
| 528 | case tInt: | ||
| 529 | switch( rhs.eType ) | ||
| 530 | { | ||
| 531 | case tInt: | ||
| 532 | iValue /= rhs.iValue; | ||
| 533 | break; | ||
| 534 | |||
| 535 | case tFloat: | ||
| 536 | { | ||
| 537 | double dTmp = iValue; | ||
| 538 | eType = tFloat; | ||
| 539 | fValue = dTmp / rhs.fValue; | ||
| 540 | } | ||
| 541 | break; | ||
| 542 | |||
| 543 | default: | ||
| 544 | throw VariableException("Int /= invalid..."); | ||
| 545 | } | ||
| 546 | break; | ||
| 547 | |||
| 548 | case tFloat: | ||
| 549 | switch( rhs.eType ) | ||
| 550 | { | ||
| 551 | case tInt: | ||
| 552 | fValue /= rhs.iValue; | ||
| 553 | break; | ||
| 554 | |||
| 555 | case tFloat: | ||
| 556 | fValue /= rhs.fValue; | ||
| 557 | break; | ||
| 558 | |||
| 559 | default: | ||
| 560 | throw VariableException("Int /= invalid..."); | ||
| 561 | } | ||
| 562 | break; | ||
| 563 | |||
| 564 | case tString: | ||
| 565 | throw VariableException("You cannot divide strings."); | ||
| 566 | break; | ||
| 567 | |||
| 568 | case tSituation: | ||
| 569 | throw VariableException("You cannot divide situations."); | ||
| 570 | break; | ||
| 571 | |||
| 572 | case tVariable: | ||
| 573 | throw VariableException("You cannot divide variable names."); | ||
| 574 | break; | ||
| 575 | |||
| 576 | case tList: | ||
| 577 | throw VariableException("You cannot divide lists."); | ||
| 578 | break; | ||
| 579 | |||
| 580 | case tDictionary: | ||
| 581 | throw VariableException("You cannot divide dictionaries."); | ||
| 582 | break; | ||
| 583 | } | ||
| 584 | |||
| 585 | return *this; | ||
| 586 | } | ||
| 587 | |||
| 452 | Variable Variable::operator+( const Variable &rhs ) const | 588 | Variable Variable::operator+( const Variable &rhs ) const |
| 453 | { | 589 | { |
| 454 | if( eType != rhs.eType ) | 590 | if( eType != rhs.eType ) |
| @@ -13,32 +13,20 @@ global | |||
| 13 | } | 13 | } |
| 14 | } | 14 | } |
| 15 | 15 | ||
| 16 | function subfunction() | ||
| 17 | { | ||
| 18 | if true then | ||
| 19 | { | ||
| 20 | return(); | ||
| 21 | } | ||
| 22 | display("subfunction()"); | ||
| 23 | } | ||
| 24 | |||
| 25 | function hello() | ||
| 26 | { | ||
| 27 | if true == true then | ||
| 28 | { | ||
| 29 | subfunction(); | ||
| 30 | display("Yeah!"); | ||
| 31 | return(); | ||
| 32 | } | ||
| 33 | display("hello()"); | ||
| 34 | } | ||
| 35 | |||
| 36 | situation <<start>> | 16 | situation <<start>> |
| 37 | { | 17 | { |
| 38 | setup | 18 | setup |
| 39 | { | 19 | { |
| 40 | hello(); | 20 | x = 10; |
| 41 | display("situation"); | 21 | display( x ); |
| 22 | x /= 2; | ||
| 23 | display( x ); | ||
| 24 | x *= 4; | ||
| 25 | display( x ); | ||
| 26 | x -= 10; | ||
| 27 | display( x ); | ||
| 28 | x += 20; | ||
| 29 | display( x ); | ||
| 42 | exit(); | 30 | exit(); |
| 43 | } | 31 | } |
| 44 | 32 | ||
