summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2012-02-07 23:38:14 -0700
committerMike Buland <eichlan@xagasoft.com>2012-02-07 23:38:14 -0700
commit3a1a20a9bc7008abb7de241c44cc0d7a3d4a77d9 (patch)
treed1ae0b637370bc70863ec214e933b1695a47b857
parente9170376ec9d75f65949ac6b61694ddf7ad37897 (diff)
downloadstage-3a1a20a9bc7008abb7de241c44cc0d7a3d4a77d9.tar.gz
stage-3a1a20a9bc7008abb7de241c44cc0d7a3d4a77d9.tar.bz2
stage-3a1a20a9bc7008abb7de241c44cc0d7a3d4a77d9.tar.xz
stage-3a1a20a9bc7008abb7de241c44cc0d7a3d4a77d9.zip
All good except loops & function returns.
-rw-r--r--src/astfunction.cpp2
-rw-r--r--src/command.cpp2
-rw-r--r--src/gamestate.cpp82
-rw-r--r--src/gamestate.h9
-rw-r--r--src/parser.y4
-rw-r--r--src/situation.cpp4
6 files changed, 63 insertions, 40 deletions
diff --git a/src/astfunction.cpp b/src/astfunction.cpp
index c37a70d..894a3a1 100644
--- a/src/astfunction.cpp
+++ b/src/astfunction.cpp
@@ -16,7 +16,7 @@ AstFunction::~AstFunction()
16 16
17void AstFunction::call( class GameState &gState ) 17void AstFunction::call( class GameState &gState )
18{ 18{
19 gState.parse( pAst ); 19 gState.pushScope( pAst );
20} 20}
21 21
22void AstFunction::addParam( const Bu::String &sName ) 22void AstFunction::addParam( const Bu::String &sName )
diff --git a/src/command.cpp b/src/command.cpp
index 2def02f..a114246 100644
--- a/src/command.cpp
+++ b/src/command.cpp
@@ -90,6 +90,6 @@ void Command::exec( class GameState &gState, const Bu::StringList &lCmd )
90 } 90 }
91 } 91 }
92 92
93 gState.parse( pAst ); 93 gState.run( pAst );
94} 94}
95 95
diff --git a/src/gamestate.cpp b/src/gamestate.cpp
index 99cc749..38c6612 100644
--- a/src/gamestate.cpp
+++ b/src/gamestate.cpp
@@ -238,16 +238,23 @@ class Situation *GameState::getCurSituation()
238 return pGame->getSituation( sCurSituation ); 238 return pGame->getSituation( sCurSituation );
239} 239}
240 240
241void GameState::parse( class AstBranch *pAst ) 241void GameState::run( class AstBranch *pAst )
242{ 242{
243 pushScope( pAst );
244 run();
245// if( lsLocal.getSize() == iDepth )
246// delete lsLocal.peekPop();
247}
248
249void GameState::pushScope( class AstBranch *pAst )
250{
251 sio << "--> pushScope: " << pAst->getType() << sio.nl;
243 if( pAst->getType() != AstNode::tScope ) 252 if( pAst->getType() != AstNode::tScope )
244 throw Bu::ExceptionBase("Nope, nothing doing, you can't parse a non-scope AstBranch."); 253 throw Bu::ExceptionBase("Nope, nothing doing, you can't run a non-scope AstBranch.");
245 254
246 lsLocal.push( new Scope() ); 255 lsLocal.push( new Scope() );
247 int iDepth = lsLocal.getSize(); 256// int iDepth = lsLocal.getSize();
248 parse( pAst->getNodeList() ); 257 sProg.push( pAst->getNodeList().begin() );
249 if( lsLocal.getSize() == iDepth )
250 delete lsLocal.peekPop();
251} 258}
252 259
253void GameState::init() 260void GameState::init()
@@ -257,6 +264,7 @@ void GameState::init()
257 throw Bu::ExceptionBase("game.start is not set to a situation name."); 264 throw Bu::ExceptionBase("game.start is not set to a situation name.");
258 265
259 gotoSituation( vStart.getString() ); 266 gotoSituation( vStart.getString() );
267 run();
260} 268}
261 269
262void GameState::gotoSituation( const Bu::String &sName ) 270void GameState::gotoSituation( const Bu::String &sName )
@@ -271,14 +279,14 @@ void GameState::gotoSituation( const Bu::String &sName )
271 if( !hsSituation.has( sName ) ) 279 if( !hsSituation.has( sName ) )
272 { 280 {
273 hsSituation.insert( sName, new Scope() ); 281 hsSituation.insert( sName, new Scope() );
282 pSit->exec( *this, Situation::modeEnter );
274 pSit->exec( *this, Situation::modeSetup ); 283 pSit->exec( *this, Situation::modeSetup );
275 } 284 }
285 else
286 {
287 pSit->exec( *this, Situation::modeEnter );
288 }
276 289
277 // This is here in case you use a goto in a setup mode
278 if( bEscape )
279 return;
280
281 pSit->exec( *this, Situation::modeEnter );
282} 290}
283 291
284void GameState::callFunction( const Bu::String &sName ) 292void GameState::callFunction( const Bu::String &sName )
@@ -515,11 +523,12 @@ Variable GameState::popDeref()
515 return v; 523 return v;
516} 524}
517 525
518void GameState::parse( const AstBranch::NodeList &lCode ) 526void GameState::run()
519{ 527{
520 bEscape = false; 528 bEscape = false;
521 for( AstBranch::NodeList::const_iterator i = lCode.begin(); i; i++ ) 529 while( !sProg.isEmpty() )
522 { 530 {
531 ProgramCounter &i = sProg.peek();
523 sio << "Stack: " << lStack << sio.nl; 532 sio << "Stack: " << lStack << sio.nl;
524 sio << "exec: " << (*i)->getType() << sio.nl; 533 sio << "exec: " << (*i)->getType() << sio.nl;
525 switch( (*i)->getType() ) 534 switch( (*i)->getType() )
@@ -703,11 +712,10 @@ void GameState::parse( const AstBranch::NodeList &lCode )
703 Variable x = popDeref(); 712 Variable x = popDeref();
704 if( x.getType() != Variable::tSituation ) 713 if( x.getType() != Variable::tSituation )
705 throw Bu::ExceptionBase("You cannot goto anything but a situation."); 714 throw Bu::ExceptionBase("You cannot goto anything but a situation.");
715 sProg.clear();
706 gotoSituation( x.getString() ); 716 gotoSituation( x.getString() );
707 bEscape = true; 717 bEscape = true;
708 sio << "Initial return" << sio.nl; 718 continue;
709 push( Variable( Variable::tNull ) );
710 return;
711 } 719 }
712 break; 720 break;
713 721
@@ -721,9 +729,10 @@ void GameState::parse( const AstBranch::NodeList &lCode )
721 break; 729 break;
722 730
723 case AstNode::tReturn: 731 case AstNode::tReturn:
724 bReturnOnly = true; 732 sProg.pop();
725 bEscape = true; 733// bReturnOnly = true;
726 return; 734// bEscape = true;
735// return;
727 break; 736 break;
728 737
729 case AstNode::tAppend: 738 case AstNode::tAppend:
@@ -782,10 +791,16 @@ void GameState::parse( const AstBranch::NodeList &lCode )
782 break; 791 break;
783 792
784 case AstNode::tFuncCall: 793 case AstNode::tFuncCall:
794 sio << "Calling function now: " << sio.nl;
795 {
796 ProgramCounter c = i;
797 i++;
785 callFunction( 798 callFunction(
786 dynamic_cast<const AstLeafLiteral *>(*i) 799 dynamic_cast<const AstLeafLiteral *>(*c)
787 ->getValue().getString() 800 ->getValue().getString()
788 ); 801 );
802 }
803 continue;
789 bReturnOnly = false; 804 bReturnOnly = false;
790 bEscape = false; 805 bEscape = false;
791 break; 806 break;
@@ -799,27 +814,31 @@ void GameState::parse( const AstBranch::NodeList &lCode )
799 { 814 {
800 AstBranch::NodeList lIf = 815 AstBranch::NodeList lIf =
801 dynamic_cast<const AstBranch *>(*i)->getNodeList(); 816 dynamic_cast<const AstBranch *>(*i)->getNodeList();
802 AstBranch::NodeList::const_iterator iIf = lIf.begin();
803 parse( dynamic_cast<const AstBranch *>(*iIf)->getNodeList() );
804 Variable v = popDeref(); 817 Variable v = popDeref();
805 if( v.getType() != Variable::tBool ) 818 if( v.getType() != Variable::tBool )
806 throw Bu::ExceptionBase("conditional did not evaluate to boolean."); 819 throw Bu::ExceptionBase("conditional did not evaluate to boolean.");
807 iIf++; 820 AstBranch::NodeList::const_iterator iIf = lIf.begin();
808 if( v.getBool() ) 821 if( v.getBool() )
809 { 822 {
810 parse( dynamic_cast<const AstBranch *>(*iIf)-> 823 i++;
811 getNodeList() ); 824 sProg.push( dynamic_cast<const AstBranch *>(*iIf)->
825 getNodeList().begin() );
826 continue;
812 } 827 }
813 else 828 else
814 { 829 {
815 iIf++; 830 iIf++;
816 if( iIf ) 831 if( iIf )
817 parse( dynamic_cast<const AstBranch *>(*iIf)-> 832 {
818 getNodeList() ); 833 i++;
834 sProg.push( dynamic_cast<const AstBranch *>(*iIf)->
835 getNodeList().begin() );
836 continue;
837 }
819 } 838 }
820 } 839 }
821 break; 840 break;
822 841/*
823 case AstNode::tForEach: 842 case AstNode::tForEach:
824 { 843 {
825 AstBranch::NodeList lFe = 844 AstBranch::NodeList lFe =
@@ -906,12 +925,13 @@ void GameState::parse( const AstBranch::NodeList &lCode )
906 } 925 }
907 } 926 }
908 break; 927 break;
928 */
909 } 929 }
910 930
911 if( bEscape || !bRunning ) 931 ++sProg.peek();
932 while( !sProg.isEmpty() && !sProg.peek() )
912 { 933 {
913 sio << "Returning from" << sio.nl; 934 sProg.pop();
914 return;
915 } 935 }
916 } 936 }
917} 937}
diff --git a/src/gamestate.h b/src/gamestate.h
index 4209ebf..115892a 100644
--- a/src/gamestate.h
+++ b/src/gamestate.h
@@ -27,7 +27,8 @@ public:
27 27
28 Interface *getInterface() { return pIface; } 28 Interface *getInterface() { return pIface; }
29 29
30 void parse( class AstBranch *pAst ); 30 void run( class AstBranch *pAst );
31 void pushScope( class AstBranch *pAst );
31 32
32 void init(); 33 void init();
33 34
@@ -56,7 +57,7 @@ public:
56 class Situation *getCurSituation(); 57 class Situation *getCurSituation();
57 58
58private: 59private:
59 void parse( const AstBranch::NodeList &lCode ); 60 void run();
60 61
61 Gats::Object *scopeToGats( const Scope *pSrc ) const; 62 Gats::Object *scopeToGats( const Scope *pSrc ) const;
62 Gats::Object *variableToGats( const Variable &rVar ) const; 63 Gats::Object *variableToGats( const Variable &rVar ) const;
@@ -80,6 +81,10 @@ private:
80 Bu::String sPrompt; 81 Bu::String sPrompt;
81 82
82 VariableList lStack; 83 VariableList lStack;
84
85 typedef AstBranch::NodeList::const_iterator ProgramCounter;
86 typedef Bu::List<ProgramCounter> ProgramStack;
87 ProgramStack sProg;
83}; 88};
84 89
85#endif 90#endif
diff --git a/src/parser.y b/src/parser.y
index 383ab28..47c0159 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -200,10 +200,8 @@ forIterator: tokIdent { bld.addVarRef( *($1), sidLocal ); }
200 ; 200 ;
201 201
202ifbase: tokIf { 202ifbase: tokIf {
203 bld.addNode( AstNode::tIf );
204 bld.addNode( AstNode::tScope );
205 } expr { 203 } expr {
206 bld.closeNode(); 204 bld.addNode( AstNode::tIf );
207 bld.addNode( AstNode::tScope ); 205 bld.addNode( AstNode::tScope );
208 } tokThen '{' cmpltExprList '}' { 206 } tokThen '{' cmpltExprList '}' {
209 bld.closeNode(); 207 bld.closeNode();
diff --git a/src/situation.cpp b/src/situation.cpp
index 1d3a853..74875ac 100644
--- a/src/situation.cpp
+++ b/src/situation.cpp
@@ -39,12 +39,12 @@ void Situation::exec( class GameState &gState, Situation::Mode m )
39 { 39 {
40 case modeSetup: 40 case modeSetup:
41 if( pAstSetup ) 41 if( pAstSetup )
42 gState.parse( pAstSetup ); 42 gState.pushScope( pAstSetup );
43 break; 43 break;
44 44
45 case modeEnter: 45 case modeEnter:
46 if( pAstEnter ) 46 if( pAstEnter )
47 gState.parse( pAstEnter ); 47 gState.pushScope( pAstEnter );
48 break; 48 break;
49 } 49 }
50} 50}