summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/astnode.cpp2
-rw-r--r--src/astnode.h2
-rw-r--r--src/functiondelete.cpp20
-rw-r--r--src/functiondelete.h16
-rw-r--r--src/functionexists.cpp19
-rw-r--r--src/functionexists.h16
-rw-r--r--src/game.cpp4
-rw-r--r--src/gamebuilder.cpp3
-rw-r--r--src/gamestate.cpp17
-rw-r--r--src/parser.l2
-rw-r--r--src/parser.y4
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
5FunctionDelete::FunctionDelete()
6{
7}
8
9FunctionDelete::~FunctionDelete()
10{
11}
12
13void 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
6class FunctionDelete : public Function
7{
8public:
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
5FunctionExists::FunctionExists()
6{
7}
8
9FunctionExists::~FunctionExists()
10{
11}
12
13void 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
6class FunctionExists : public Function
7{
8public:
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; }
51or { return tokOr; } 51or { return tokOr; }
52return { return tokReturn; } 52return { return tokReturn; }
53ignore { return tokIgnore; } 53ignore { return tokIgnore; }
54exists { return tokExists; }
55delete { return tokDelete; }
54 56
55true { yylval->bValue = true; return tokBool; } 57true { yylval->bValue = true; return tokBool; }
56false { yylval->bValue = false; return tokBool; } 58false { 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
236expr: literal 238expr: 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 ); }