diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2012-02-06 21:06:13 -0700 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2012-02-06 21:06:13 -0700 |
| commit | 9665eda348e3e2fa8ac32fdc26d1c0b0eb65b432 (patch) | |
| tree | ffd83759a9a1bfe1091944927150a901301c224b | |
| parent | 6a7a6d31870e4542f84fc01eaf777794296a0ebe (diff) | |
| download | stage-9665eda348e3e2fa8ac32fdc26d1c0b0eb65b432.tar.gz stage-9665eda348e3e2fa8ac32fdc26d1c0b0eb65b432.tar.bz2 stage-9665eda348e3e2fa8ac32fdc26d1c0b0eb65b432.tar.xz stage-9665eda348e3e2fa8ac32fdc26d1c0b0eb65b432.zip | |
exists() and delete() are now operators.
| -rw-r--r-- | src/astnode.cpp | 2 | ||||
| -rw-r--r-- | src/astnode.h | 2 | ||||
| -rw-r--r-- | src/functiondelete.cpp | 20 | ||||
| -rw-r--r-- | src/functiondelete.h | 16 | ||||
| -rw-r--r-- | src/functionexists.cpp | 19 | ||||
| -rw-r--r-- | src/functionexists.h | 16 | ||||
| -rw-r--r-- | src/game.cpp | 4 | ||||
| -rw-r--r-- | src/gamebuilder.cpp | 3 | ||||
| -rw-r--r-- | src/gamestate.cpp | 17 | ||||
| -rw-r--r-- | src/parser.l | 2 | ||||
| -rw-r--r-- | src/parser.y | 4 |
11 files changed, 30 insertions, 75 deletions
diff --git a/src/astnode.cpp b/src/astnode.cpp index 9a16f43..54e567d 100644 --- a/src/astnode.cpp +++ b/src/astnode.cpp | |||
| @@ -48,6 +48,8 @@ Bu::Formatter &operator<<( Bu::Formatter &f, AstNode::Type t ) | |||
| 48 | case AstNode::tIndex: return f << "tIndex"; | 48 | case AstNode::tIndex: return f << "tIndex"; |
| 49 | case AstNode::tPop: return f << "tPop"; | 49 | case AstNode::tPop: return f << "tPop"; |
| 50 | case AstNode::tDeref: return f << "tDeref"; | 50 | case AstNode::tDeref: return f << "tDeref"; |
| 51 | case AstNode::tExists: return f << "tExists"; | ||
| 52 | case AstNode::tDelete: return f << "tDelete"; | ||
| 51 | 53 | ||
| 52 | case AstNode::tLeafLiteral: return f << "!tLeafLiteral!"; | 54 | case AstNode::tLeafLiteral: return f << "!tLeafLiteral!"; |
| 53 | case AstNode::tVarName: return f << "tVarName"; | 55 | case AstNode::tVarName: return f << "tVarName"; |
diff --git a/src/astnode.h b/src/astnode.h index e2629cc..73be338 100644 --- a/src/astnode.h +++ b/src/astnode.h | |||
| @@ -38,6 +38,8 @@ public: | |||
| 38 | tIndex = 0x0100001A, | 38 | tIndex = 0x0100001A, |
| 39 | tPop = 0x0100001B, | 39 | tPop = 0x0100001B, |
| 40 | tDeref = 0x0100001C, | 40 | tDeref = 0x0100001C, |
| 41 | tExists = 0x0100001D, | ||
| 42 | tDelete = 0x0100001E, | ||
| 41 | 43 | ||
| 42 | tLeafLiteral = 0x02000000, | 44 | tLeafLiteral = 0x02000000, |
| 43 | tVarName = 0x02000001, | 45 | tVarName = 0x02000001, |
diff --git a/src/functiondelete.cpp b/src/functiondelete.cpp deleted file mode 100644 index 070ffd4..0000000 --- a/src/functiondelete.cpp +++ /dev/null | |||
| @@ -1,20 +0,0 @@ | |||
| 1 | #include "functiondelete.h" | ||
| 2 | |||
| 3 | #include "gamestate.h" | ||
| 4 | |||
| 5 | FunctionDelete::FunctionDelete() | ||
| 6 | { | ||
| 7 | } | ||
| 8 | |||
| 9 | FunctionDelete::~FunctionDelete() | ||
| 10 | { | ||
| 11 | } | ||
| 12 | |||
| 13 | void FunctionDelete::call( class GameState &gState ) | ||
| 14 | { | ||
| 15 | Variable v = gState.pop(); | ||
| 16 | VariableRef r = v.getVariableRef(); | ||
| 17 | gState.delVariable( r.sName, r.sid ); | ||
| 18 | gState.push( Variable( Variable::tNull ) ); | ||
| 19 | } | ||
| 20 | |||
diff --git a/src/functiondelete.h b/src/functiondelete.h deleted file mode 100644 index 3545343..0000000 --- a/src/functiondelete.h +++ /dev/null | |||
| @@ -1,16 +0,0 @@ | |||
| 1 | #ifndef FUNCTION_DELETE_H | ||
| 2 | #define FUNCTION_DELETE_H | ||
| 3 | |||
| 4 | #include "function.h" | ||
| 5 | |||
| 6 | class FunctionDelete : public Function | ||
| 7 | { | ||
| 8 | public: | ||
| 9 | FunctionDelete(); | ||
| 10 | virtual ~FunctionDelete(); | ||
| 11 | |||
| 12 | virtual Bu::String getName() const { return "delete"; } | ||
| 13 | virtual void call( class GameState &gState ); | ||
| 14 | }; | ||
| 15 | |||
| 16 | #endif | ||
diff --git a/src/functionexists.cpp b/src/functionexists.cpp deleted file mode 100644 index 71e03f6..0000000 --- a/src/functionexists.cpp +++ /dev/null | |||
| @@ -1,19 +0,0 @@ | |||
| 1 | #include "functionexists.h" | ||
| 2 | |||
| 3 | #include "gamestate.h" | ||
| 4 | |||
| 5 | FunctionExists::FunctionExists() | ||
| 6 | { | ||
| 7 | } | ||
| 8 | |||
| 9 | FunctionExists::~FunctionExists() | ||
| 10 | { | ||
| 11 | } | ||
| 12 | |||
| 13 | void FunctionExists::call( class GameState &gState ) | ||
| 14 | { | ||
| 15 | Variable v = gState.pop(); | ||
| 16 | VariableRef r = v.getVariableRef(); | ||
| 17 | gState.push( Variable( gState.hasVariable( r.sName, r.sid ) ) ); | ||
| 18 | } | ||
| 19 | |||
diff --git a/src/functionexists.h b/src/functionexists.h deleted file mode 100644 index 5313331..0000000 --- a/src/functionexists.h +++ /dev/null | |||
| @@ -1,16 +0,0 @@ | |||
| 1 | #ifndef FUNCTION_EXISTS_H | ||
| 2 | #define FUNCTION_EXISTS_H | ||
| 3 | |||
| 4 | #include "function.h" | ||
| 5 | |||
| 6 | class FunctionExists : public Function | ||
| 7 | { | ||
| 8 | public: | ||
| 9 | FunctionExists(); | ||
| 10 | virtual ~FunctionExists(); | ||
| 11 | |||
| 12 | virtual Bu::String getName() const { return "exists"; } | ||
| 13 | virtual void call( class GameState &gState ); | ||
| 14 | }; | ||
| 15 | |||
| 16 | #endif | ||
diff --git a/src/game.cpp b/src/game.cpp index 37989bd..753f83b 100644 --- a/src/game.cpp +++ b/src/game.cpp | |||
| @@ -1,8 +1,6 @@ | |||
| 1 | #include "game.h" | 1 | #include "game.h" |
| 2 | 2 | ||
| 3 | #include "functiondisplay.h" | 3 | #include "functiondisplay.h" |
| 4 | #include "functionexists.h" | ||
| 5 | #include "functiondelete.h" | ||
| 6 | #include "functionexit.h" | 4 | #include "functionexit.h" |
| 7 | #include "functionrandom.h" | 5 | #include "functionrandom.h" |
| 8 | #include "functioninteger.h" | 6 | #include "functioninteger.h" |
| @@ -16,8 +14,6 @@ Game::Game() | |||
| 16 | { | 14 | { |
| 17 | hGlobalParam.insert("start", Variable::newSituationName("start") ); | 15 | hGlobalParam.insert("start", Variable::newSituationName("start") ); |
| 18 | addFunction( new FunctionDisplay() ); | 16 | addFunction( new FunctionDisplay() ); |
| 19 | addFunction( new FunctionExists() ); | ||
| 20 | addFunction( new FunctionDelete() ); | ||
| 21 | addFunction( new FunctionExit() ); | 17 | addFunction( new FunctionExit() ); |
| 22 | addFunction( new FunctionRandom() ); | 18 | addFunction( new FunctionRandom() ); |
| 23 | addFunction( new FunctionInteger() ); | 19 | addFunction( new FunctionInteger() ); |
diff --git a/src/gamebuilder.cpp b/src/gamebuilder.cpp index 857c348..e8ecf63 100644 --- a/src/gamebuilder.cpp +++ b/src/gamebuilder.cpp | |||
| @@ -189,6 +189,9 @@ void GameBuilder::stackMod( AstNode::Type iType ) | |||
| 189 | case AstNode::tNot: | 189 | case AstNode::tNot: |
| 190 | case AstNode::tNegate: | 190 | case AstNode::tNegate: |
| 191 | case AstNode::tSwap: | 191 | case AstNode::tSwap: |
| 192 | case AstNode::tDeref: | ||
| 193 | case AstNode::tExists: | ||
| 194 | case AstNode::tDelete: | ||
| 192 | break; | 195 | break; |
| 193 | 196 | ||
| 194 | case AstNode::tComp: | 197 | case AstNode::tComp: |
diff --git a/src/gamestate.cpp b/src/gamestate.cpp index 7b2d228..041af86 100644 --- a/src/gamestate.cpp +++ b/src/gamestate.cpp | |||
| @@ -756,6 +756,23 @@ void GameState::parse( const AstBranch::NodeList &lCode ) | |||
| 756 | push( popDeref() ); | 756 | push( popDeref() ); |
| 757 | break; | 757 | break; |
| 758 | 758 | ||
| 759 | case AstNode::tExists: | ||
| 760 | { | ||
| 761 | Variable v = pop(); | ||
| 762 | VariableRef r = v.getVariableRef(); | ||
| 763 | push( Variable( hasVariable( r.sName, r.sid ) ) ); | ||
| 764 | } | ||
| 765 | break; | ||
| 766 | |||
| 767 | case AstNode::tDelete: | ||
| 768 | { | ||
| 769 | Variable v = pop(); | ||
| 770 | VariableRef r = v.getVariableRef(); | ||
| 771 | delVariable( r.sName, r.sid ); | ||
| 772 | push( Variable( Variable::tNull ) ); | ||
| 773 | } | ||
| 774 | break; | ||
| 775 | |||
| 759 | // tLeafLiteral | 776 | // tLeafLiteral |
| 760 | case AstNode::tVarName: | 777 | case AstNode::tVarName: |
| 761 | case AstNode::tLiteral: | 778 | case AstNode::tLiteral: |
diff --git a/src/parser.l b/src/parser.l index 7ceee0a..70704b8 100644 --- a/src/parser.l +++ b/src/parser.l | |||
| @@ -51,6 +51,8 @@ and { return tokAnd; } | |||
| 51 | or { return tokOr; } | 51 | or { return tokOr; } |
| 52 | return { return tokReturn; } | 52 | return { return tokReturn; } |
| 53 | ignore { return tokIgnore; } | 53 | ignore { return tokIgnore; } |
| 54 | exists { return tokExists; } | ||
| 55 | delete { return tokDelete; } | ||
| 54 | 56 | ||
| 55 | true { yylval->bValue = true; return tokBool; } | 57 | true { yylval->bValue = true; return tokBool; } |
| 56 | false { yylval->bValue = false; return tokBool; } | 58 | false { yylval->bValue = false; return tokBool; } |
diff --git a/src/parser.y b/src/parser.y index 024d61a..c5b86ea 100644 --- a/src/parser.y +++ b/src/parser.y | |||
| @@ -69,6 +69,8 @@ void yyerror( YYLTYPE *llocp, yyscan_t yyscanner, GameBuilder &, const char *err | |||
| 69 | %token tokMinusAssign | 69 | %token tokMinusAssign |
| 70 | %token tokTimesAssign | 70 | %token tokTimesAssign |
| 71 | %token tokDivideAssign | 71 | %token tokDivideAssign |
| 72 | %token tokExists | ||
| 73 | %token tokDelete | ||
| 72 | %token <sValue> tokSituationName | 74 | %token <sValue> tokSituationName |
| 73 | %token <sValue> tokIdent | 75 | %token <sValue> tokIdent |
| 74 | %token tokGoto | 76 | %token tokGoto |
| @@ -234,6 +236,8 @@ literal: tokInt { bld.addLiteral( Variable( $1 ) ); } | |||
| 234 | ; | 236 | ; |
| 235 | 237 | ||
| 236 | expr: literal | 238 | expr: literal |
| 239 | | tokExists '(' varRef ')' { bld.addNode( AstNode::tExists ); } | ||
| 240 | | tokDelete '(' varRef ')' { bld.addNode( AstNode::tDelete ); } | ||
| 237 | | tokIdent '(' funcCallParams ')' { bld.addFuncCall( *($1) ); } | 241 | | tokIdent '(' funcCallParams ')' { bld.addFuncCall( *($1) ); } |
| 238 | | varRef | 242 | | varRef |
| 239 | | varRef '=' expr { bld.addNode( AstNode::tStore ); } | 243 | | varRef '=' expr { bld.addNode( AstNode::tStore ); } |
