diff options
-rw-r--r-- | src/astfunction.cpp | 28 | ||||
-rw-r--r-- | src/astfunction.h | 24 | ||||
-rw-r--r-- | src/astnode.cpp | 2 | ||||
-rw-r--r-- | src/astnode.h | 2 | ||||
-rw-r--r-- | src/command.cpp | 46 | ||||
-rw-r--r-- | src/command.h | 38 | ||||
-rw-r--r-- | src/commandset.cpp | 21 | ||||
-rw-r--r-- | src/commandset.h | 20 | ||||
-rw-r--r-- | src/functiondisplay.cpp | 14 | ||||
-rw-r--r-- | src/functiondisplay.h | 16 | ||||
-rw-r--r-- | src/game.cpp | 8 | ||||
-rw-r--r-- | src/game.h | 3 | ||||
-rw-r--r-- | src/gamebuilder.cpp | 73 | ||||
-rw-r--r-- | src/gamebuilder.h | 17 | ||||
-rw-r--r-- | src/parser.y | 27 | ||||
-rw-r--r-- | test.stage | 4 |
16 files changed, 320 insertions, 23 deletions
diff --git a/src/astfunction.cpp b/src/astfunction.cpp new file mode 100644 index 0000000..df183d3 --- /dev/null +++ b/src/astfunction.cpp | |||
@@ -0,0 +1,28 @@ | |||
1 | #include "astfunction.h" | ||
2 | #include "astbranch.h" | ||
3 | |||
4 | AstFunction::AstFunction( const Bu::String &sName ) : | ||
5 | sName( sName ), | ||
6 | pAst( NULL ) | ||
7 | { | ||
8 | } | ||
9 | |||
10 | AstFunction::~AstFunction() | ||
11 | { | ||
12 | delete pAst; | ||
13 | } | ||
14 | |||
15 | Variable AstFunction::call( const VariableList &lParams ) | ||
16 | { | ||
17 | } | ||
18 | |||
19 | void AstFunction::addParam( const Bu::String &sName ) | ||
20 | { | ||
21 | lParam.append( sName ); | ||
22 | } | ||
23 | |||
24 | void AstFunction::setAst( class AstBranch *pAst ) | ||
25 | { | ||
26 | this->pAst = pAst; | ||
27 | } | ||
28 | |||
diff --git a/src/astfunction.h b/src/astfunction.h new file mode 100644 index 0000000..e6470e4 --- /dev/null +++ b/src/astfunction.h | |||
@@ -0,0 +1,24 @@ | |||
1 | #ifndef AST_FUNCTION_H | ||
2 | #define AST_FUNCTION_H | ||
3 | |||
4 | #include "function.h" | ||
5 | |||
6 | class AstFunction : public Function | ||
7 | { | ||
8 | public: | ||
9 | AstFunction( const Bu::String &sName ); | ||
10 | virtual ~AstFunction(); | ||
11 | |||
12 | virtual Bu::String getName() const { return sName; } | ||
13 | virtual Variable call( const VariableList &lParams ); | ||
14 | |||
15 | void addParam( const Bu::String &sName ); | ||
16 | void setAst( class AstBranch *pAst ); | ||
17 | |||
18 | private: | ||
19 | Bu::String sName; | ||
20 | Bu::StringList lParam; | ||
21 | class AstBranch *pAst; | ||
22 | }; | ||
23 | |||
24 | #endif | ||
diff --git a/src/astnode.cpp b/src/astnode.cpp index 6e59ab6..7191292 100644 --- a/src/astnode.cpp +++ b/src/astnode.cpp | |||
@@ -43,7 +43,7 @@ Bu::Formatter &operator<<( Bu::Formatter &f, AstNode::Type t ) | |||
43 | case AstNode::tLeafLiteral: return f << "!tLeafLiteral!"; | 43 | case AstNode::tLeafLiteral: return f << "!tLeafLiteral!"; |
44 | case AstNode::tVarName: return f << "tVarName"; | 44 | case AstNode::tVarName: return f << "tVarName"; |
45 | case AstNode::tLiteral: return f << "tLiteral"; | 45 | case AstNode::tLiteral: return f << "tLiteral"; |
46 | case AstNode::tFuncName: return f << "tFuncName"; | 46 | case AstNode::tFuncCall: return f << "tFuncCall"; |
47 | 47 | ||
48 | case AstNode::tBranch: return f << "!tBranch!"; | 48 | case AstNode::tBranch: return f << "!tBranch!"; |
49 | case AstNode::tScope: return f << "tScope"; | 49 | case AstNode::tScope: return f << "tScope"; |
diff --git a/src/astnode.h b/src/astnode.h index b38b895..28e5336 100644 --- a/src/astnode.h +++ b/src/astnode.h | |||
@@ -33,7 +33,7 @@ public: | |||
33 | tLeafLiteral = 0x02000000, | 33 | tLeafLiteral = 0x02000000, |
34 | tVarName = 0x02000001, | 34 | tVarName = 0x02000001, |
35 | tLiteral = 0x02000002, | 35 | tLiteral = 0x02000002, |
36 | tFuncName = 0x02000003, | 36 | tFuncCall = 0x02000003, |
37 | 37 | ||
38 | tBranch = 0x04000000, | 38 | tBranch = 0x04000000, |
39 | tScope = 0x04000001, | 39 | tScope = 0x04000001, |
diff --git a/src/command.cpp b/src/command.cpp new file mode 100644 index 0000000..5b859f7 --- /dev/null +++ b/src/command.cpp | |||
@@ -0,0 +1,46 @@ | |||
1 | #include "command.h" | ||
2 | |||
3 | #include "astbranch.h" | ||
4 | |||
5 | #include <bu/sio.h> | ||
6 | using namespace Bu; | ||
7 | |||
8 | Command::Command() : | ||
9 | pAst( NULL ) | ||
10 | { | ||
11 | } | ||
12 | |||
13 | Command::~Command() | ||
14 | { | ||
15 | delete pAst; | ||
16 | } | ||
17 | |||
18 | void Command::addLiteral( const Bu::String &sValue ) | ||
19 | { | ||
20 | lChunks.append( Chunk( true, sValue ) ); | ||
21 | } | ||
22 | |||
23 | void Command::addParam( const Bu::String &sValue ) | ||
24 | { | ||
25 | lChunks.append( Chunk( false, sValue ) ); | ||
26 | } | ||
27 | |||
28 | void Command::setAst( class AstBranch *pAst ) | ||
29 | { | ||
30 | this->pAst = pAst; | ||
31 | } | ||
32 | |||
33 | void Command::print() | ||
34 | { | ||
35 | sio << "command:"; | ||
36 | for( ChunkList::iterator i = lChunks.begin(); i; i++ ) | ||
37 | { | ||
38 | if( (*i).bLiteral ) | ||
39 | sio << " \"" << (*i).sValue << "\""; | ||
40 | else | ||
41 | sio << " " << (*i).sValue; | ||
42 | } | ||
43 | |||
44 | sio << sio.nl; | ||
45 | } | ||
46 | |||
diff --git a/src/command.h b/src/command.h new file mode 100644 index 0000000..f36fc14 --- /dev/null +++ b/src/command.h | |||
@@ -0,0 +1,38 @@ | |||
1 | #ifndef COMMAND_H | ||
2 | #define COMMAND_H | ||
3 | |||
4 | #include <bu/string.h> | ||
5 | |||
6 | class Command | ||
7 | { | ||
8 | public: | ||
9 | Command(); | ||
10 | virtual ~Command(); | ||
11 | |||
12 | void addLiteral( const Bu::String &sValue ); | ||
13 | void addParam( const Bu::String &sValue ); | ||
14 | |||
15 | void setAst( class AstBranch *pAst ); | ||
16 | |||
17 | void print(); | ||
18 | |||
19 | private: | ||
20 | class Chunk | ||
21 | { | ||
22 | public: | ||
23 | Chunk( bool bLiteral, const Bu::String &sValue ) : | ||
24 | bLiteral( bLiteral ), sValue( sValue ) | ||
25 | { | ||
26 | } | ||
27 | |||
28 | bool bLiteral; | ||
29 | Bu::String sValue; | ||
30 | }; | ||
31 | |||
32 | typedef Bu::List<Chunk> ChunkList; | ||
33 | ChunkList lChunks; | ||
34 | |||
35 | class AstBranch *pAst; | ||
36 | }; | ||
37 | |||
38 | #endif | ||
diff --git a/src/commandset.cpp b/src/commandset.cpp new file mode 100644 index 0000000..ffd58a5 --- /dev/null +++ b/src/commandset.cpp | |||
@@ -0,0 +1,21 @@ | |||
1 | #include "commandset.h" | ||
2 | |||
3 | #include "command.h" | ||
4 | |||
5 | CommandSet::CommandSet() | ||
6 | { | ||
7 | } | ||
8 | |||
9 | CommandSet::~CommandSet() | ||
10 | { | ||
11 | for( CommandList::iterator i = lCommand.begin(); i; i++ ) | ||
12 | { | ||
13 | delete (*i); | ||
14 | } | ||
15 | } | ||
16 | |||
17 | void CommandSet::addCommand( class Command *pCmd ) | ||
18 | { | ||
19 | lCommand.append( pCmd ); | ||
20 | } | ||
21 | |||
diff --git a/src/commandset.h b/src/commandset.h new file mode 100644 index 0000000..593d529 --- /dev/null +++ b/src/commandset.h | |||
@@ -0,0 +1,20 @@ | |||
1 | #ifndef COMMAND_SET_H | ||
2 | #define COMMAND_SET_H | ||
3 | |||
4 | #include <bu/list.h> | ||
5 | #include <bu/string.h> | ||
6 | |||
7 | class CommandSet | ||
8 | { | ||
9 | public: | ||
10 | CommandSet(); | ||
11 | virtual ~CommandSet(); | ||
12 | |||
13 | void addCommand( class Command *pCmd ); | ||
14 | |||
15 | private: | ||
16 | typedef Bu::List<class Command *> CommandList; | ||
17 | CommandList lCommand; | ||
18 | }; | ||
19 | |||
20 | #endif | ||
diff --git a/src/functiondisplay.cpp b/src/functiondisplay.cpp new file mode 100644 index 0000000..920eefd --- /dev/null +++ b/src/functiondisplay.cpp | |||
@@ -0,0 +1,14 @@ | |||
1 | #include "functiondisplay.h" | ||
2 | |||
3 | FunctionDisplay::FunctionDisplay() | ||
4 | { | ||
5 | } | ||
6 | |||
7 | FunctionDisplay::~FunctionDisplay() | ||
8 | { | ||
9 | } | ||
10 | |||
11 | Variable FunctionDisplay::call( const VariableList &lParams ) | ||
12 | { | ||
13 | } | ||
14 | |||
diff --git a/src/functiondisplay.h b/src/functiondisplay.h new file mode 100644 index 0000000..2f13360 --- /dev/null +++ b/src/functiondisplay.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef FUNCTION_DISPLAY_H | ||
2 | #define FUNCTION_DISPLAY_H | ||
3 | |||
4 | #include "function.h" | ||
5 | |||
6 | class FunctionDisplay | ||
7 | { | ||
8 | public: | ||
9 | FunctionDisplay(); | ||
10 | virtual ~FunctionDisplay(); | ||
11 | |||
12 | virtual Bu::String getName() const { return "display"; } | ||
13 | virtual Variable call( const VariableList &lParams ); | ||
14 | }; | ||
15 | |||
16 | #endif | ||
diff --git a/src/game.cpp b/src/game.cpp index 61fa255..f3b5828 100644 --- a/src/game.cpp +++ b/src/game.cpp | |||
@@ -6,5 +6,13 @@ Game::Game() | |||
6 | 6 | ||
7 | Game::~Game() | 7 | Game::~Game() |
8 | { | 8 | { |
9 | for( FunctionHash::iterator i = hFunction.begin(); i; i++ ) | ||
10 | { | ||
11 | delete (*i); | ||
12 | } | ||
13 | for( SituationHash::iterator i = hSituation.begin(); i; i++ ) | ||
14 | { | ||
15 | delete (*i); | ||
16 | } | ||
9 | } | 17 | } |
10 | 18 | ||
@@ -9,6 +9,7 @@ | |||
9 | 9 | ||
10 | class Game | 10 | class Game |
11 | { | 11 | { |
12 | friend class GameBuilder; | ||
12 | public: | 13 | public: |
13 | Game(); | 14 | Game(); |
14 | virtual ~Game(); | 15 | virtual ~Game(); |
@@ -16,7 +17,7 @@ public: | |||
16 | private: | 17 | private: |
17 | typedef Bu::Hash<Bu::String, Function *> FunctionHash; | 18 | typedef Bu::Hash<Bu::String, Function *> FunctionHash; |
18 | typedef Bu::Hash<Bu::String, Situation *> SituationHash; | 19 | typedef Bu::Hash<Bu::String, Situation *> SituationHash; |
19 | typedef Bu::Hash<Bu::String, Scope *> ScopeHash; | 20 | VariableHash hGlobalParam; |
20 | FunctionHash hFunction; | 21 | FunctionHash hFunction; |
21 | SituationHash hSituation; | 22 | SituationHash hSituation; |
22 | Bu::String sCurSituation; | 23 | Bu::String sCurSituation; |
diff --git a/src/gamebuilder.cpp b/src/gamebuilder.cpp index 47de17d..e6c1f38 100644 --- a/src/gamebuilder.cpp +++ b/src/gamebuilder.cpp | |||
@@ -1,16 +1,24 @@ | |||
1 | #include "gamebuilder.h" | 1 | #include "gamebuilder.h" |
2 | #include <bu/sio.h> | 2 | #include <bu/sio.h> |
3 | 3 | ||
4 | #include "game.h" | ||
4 | #include "astbranch.h" | 5 | #include "astbranch.h" |
5 | #include "astleaf.h" | 6 | #include "astleaf.h" |
6 | #include "astleafliteral.h" | 7 | #include "astleafliteral.h" |
8 | #include "astfunction.h" | ||
9 | #include "command.h" | ||
7 | 10 | ||
8 | using namespace Bu; | 11 | using namespace Bu; |
9 | 12 | ||
10 | GameBuilder::GameBuilder() : | 13 | GameBuilder::GameBuilder() : |
14 | pGame( NULL ), | ||
15 | bGlobal( false ), | ||
11 | pCurNode( NULL ), | 16 | pCurNode( NULL ), |
12 | pCurRoot( NULL ) | 17 | pCurRoot( NULL ), |
18 | pCurCmd( NULL ), | ||
19 | pCurFnc( NULL ) | ||
13 | { | 20 | { |
21 | pGame = new Game(); | ||
14 | } | 22 | } |
15 | 23 | ||
16 | GameBuilder::~GameBuilder() | 24 | GameBuilder::~GameBuilder() |
@@ -24,20 +32,28 @@ void GameBuilder::setLiteral( const Variable &v ) | |||
24 | 32 | ||
25 | void GameBuilder::setGameParam( const Bu::String &sName ) | 33 | void GameBuilder::setGameParam( const Bu::String &sName ) |
26 | { | 34 | { |
27 | sio << "Set game param '" << sName << "' to " << vLiteral << sio.nl; | 35 | pGame->hGlobalParam.insert( sName, vLiteral ); |
28 | hGameParams.insert( sName, vLiteral ); | ||
29 | } | 36 | } |
30 | 37 | ||
31 | void GameBuilder::beginFunction( const Bu::String &sName ) | 38 | void GameBuilder::beginFunction( const Bu::String &sName ) |
32 | { | 39 | { |
33 | pCurNode = pCurRoot = new AstBranch( AstNode::tScope ); | 40 | pCurNode = pCurRoot = new AstBranch( AstNode::tScope ); |
34 | 41 | pCurFnc = new AstFunction( sName ); | |
35 | sio << "New function: " << sName << sio.nl; | 42 | sio << "New function: " << sName << sio.nl; |
36 | } | 43 | } |
37 | 44 | ||
45 | void GameBuilder::addFunctionParam( const Bu::String &sName ) | ||
46 | { | ||
47 | pCurFnc->addParam( sName ); | ||
48 | sio << " - Param added '" << sName << "'" << sio.nl; | ||
49 | } | ||
50 | |||
38 | void GameBuilder::endFunction() | 51 | void GameBuilder::endFunction() |
39 | { | 52 | { |
40 | sio << "Function ended: " << *pCurRoot << sio.nl; | 53 | sio << "Function ended: " << *pCurRoot << sio.nl; |
54 | pCurFnc->setAst( pCurRoot ); | ||
55 | pCurRoot = pCurNode = NULL; | ||
56 | pGame->hFunction.insert( pCurFnc->getName(), pCurFnc ); | ||
41 | } | 57 | } |
42 | 58 | ||
43 | void GameBuilder::beginSituation( const Bu::String &sName ) | 59 | void GameBuilder::beginSituation( const Bu::String &sName ) |
@@ -50,11 +66,6 @@ void GameBuilder::endSituation() | |||
50 | sio << "Situation ended." << sio.nl; | 66 | sio << "Situation ended." << sio.nl; |
51 | } | 67 | } |
52 | 68 | ||
53 | void GameBuilder::addParam( const Bu::String &sName ) | ||
54 | { | ||
55 | sio << " - Param added '" << sName << "'" << sio.nl; | ||
56 | } | ||
57 | |||
58 | void GameBuilder::addNode( AstNode::Type iType ) | 69 | void GameBuilder::addNode( AstNode::Type iType ) |
59 | { | 70 | { |
60 | switch( iType&AstNode::tTypeMask ) | 71 | switch( iType&AstNode::tTypeMask ) |
@@ -91,3 +102,47 @@ void GameBuilder::addVarRef( const Bu::String &sName ) | |||
91 | } | 102 | } |
92 | } | 103 | } |
93 | 104 | ||
105 | void GameBuilder::addFuncCall( const Bu::String &sName ) | ||
106 | { | ||
107 | if( pCurNode ) | ||
108 | { | ||
109 | pCurNode->addNode( new AstLeafLiteral( AstNode::tFuncCall, sName ) ); | ||
110 | } | ||
111 | } | ||
112 | |||
113 | void GameBuilder::beginGlobal() | ||
114 | { | ||
115 | bGlobal = true; | ||
116 | } | ||
117 | |||
118 | void GameBuilder::closeGlobal() | ||
119 | { | ||
120 | bGlobal = false; | ||
121 | } | ||
122 | |||
123 | void GameBuilder::beginCommand( const Bu::String &sValue ) | ||
124 | { | ||
125 | pCurNode = pCurRoot = new AstBranch( AstNode::tScope ); | ||
126 | pCurCmd = new Command(); | ||
127 | pCurCmd->addLiteral( sValue ); | ||
128 | } | ||
129 | |||
130 | void GameBuilder::addCommandLiteral( const Bu::String &sValue ) | ||
131 | { | ||
132 | pCurCmd->addLiteral( sValue ); | ||
133 | } | ||
134 | |||
135 | void GameBuilder::addCommandParam( const Bu::String &sValue ) | ||
136 | { | ||
137 | pCurCmd->addParam( sValue ); | ||
138 | } | ||
139 | |||
140 | void GameBuilder::closeCommand() | ||
141 | { | ||
142 | pCurCmd->print(); | ||
143 | sio << *pCurRoot << sio.nl; | ||
144 | pCurCmd->setAst( pCurRoot ); | ||
145 | delete pCurCmd; | ||
146 | pCurCmd = NULL; | ||
147 | } | ||
148 | |||
diff --git a/src/gamebuilder.h b/src/gamebuilder.h index 2637c37..bc32f55 100644 --- a/src/gamebuilder.h +++ b/src/gamebuilder.h | |||
@@ -16,23 +16,34 @@ public: | |||
16 | void setGameParam( const Bu::String &sName ); | 16 | void setGameParam( const Bu::String &sName ); |
17 | 17 | ||
18 | void beginFunction( const Bu::String &sName ); | 18 | void beginFunction( const Bu::String &sName ); |
19 | void addFunctionParam( const Bu::String &sName ); | ||
19 | void endFunction(); | 20 | void endFunction(); |
20 | 21 | ||
21 | void beginSituation( const Bu::String &sName ); | 22 | void beginSituation( const Bu::String &sName ); |
22 | void endSituation(); | 23 | void endSituation(); |
23 | 24 | ||
24 | void addParam( const Bu::String &sName ); | ||
25 | void addNode( AstNode::Type iType ); | 25 | void addNode( AstNode::Type iType ); |
26 | void closeNode(); | 26 | void closeNode(); |
27 | void addLiteral( const Variable &v ); | 27 | void addLiteral( const Variable &v ); |
28 | void addVarRef( const Bu::String &sName ); | 28 | void addVarRef( const Bu::String &sName ); |
29 | void addFuncCall( const Bu::String &sName ); | ||
30 | |||
31 | void beginGlobal(); | ||
32 | void closeGlobal(); | ||
33 | |||
34 | void beginCommand( const Bu::String &sValue ); | ||
35 | void addCommandLiteral( const Bu::String &sValue ); | ||
36 | void addCommandParam( const Bu::String &sValue ); | ||
37 | void closeCommand(); | ||
29 | 38 | ||
30 | private: | 39 | private: |
40 | class Game *pGame; | ||
41 | bool bGlobal; | ||
31 | Variable vLiteral; | 42 | Variable vLiteral; |
32 | class AstBranch *pCurNode; | 43 | class AstBranch *pCurNode; |
33 | class AstBranch *pCurRoot; | 44 | class AstBranch *pCurRoot; |
34 | 45 | class Command *pCurCmd; | |
35 | VariableHash hGameParams; | 46 | class AstFunction *pCurFnc; |
36 | }; | 47 | }; |
37 | 48 | ||
38 | #endif | 49 | #endif |
diff --git a/src/parser.y b/src/parser.y index 90c771d..e6210d1 100644 --- a/src/parser.y +++ b/src/parser.y | |||
@@ -96,7 +96,8 @@ gameDecls: | |||
96 | ; | 96 | ; |
97 | 97 | ||
98 | globalDecl: | 98 | globalDecl: |
99 | | tokGlobal '{' globalExprList '}' | 99 | | tokGlobal '{' { bld.beginGlobal(); } globalExprList '}' |
100 | { bld.closeGlobal(); } | ||
100 | ; | 101 | ; |
101 | 102 | ||
102 | globalExprList: | 103 | globalExprList: |
@@ -134,11 +135,11 @@ function: tokFunction tokIdent { bld.beginFunction( *($2) ); } '(' funcParamList | |||
134 | ; | 135 | ; |
135 | 136 | ||
136 | funcParamList: | 137 | funcParamList: |
137 | | tokIdent { bld.addParam( *($1) ); } funcParamListEx | 138 | | tokIdent { bld.addFunctionParam( *($1) ); } funcParamListEx |
138 | ; | 139 | ; |
139 | 140 | ||
140 | funcParamListEx: | 141 | funcParamListEx: |
141 | | funcParamListEx ',' tokIdent { bld.addParam( *($3) ); } | 142 | | funcParamListEx ',' tokIdent { bld.addFunctionParam( *($3) ); } |
142 | ; | 143 | ; |
143 | 144 | ||
144 | cmpltExprList: | 145 | cmpltExprList: |
@@ -156,7 +157,8 @@ cmpltExpr: expr ';' | |||
156 | bld.closeNode(); | 157 | bld.closeNode(); |
157 | bld.addNode( AstNode::tScope ); | 158 | bld.addNode( AstNode::tScope ); |
158 | } tokDo '{' cmpltExprList '}' { | 159 | } tokDo '{' cmpltExprList '}' { |
159 | bld.closeNode(); bld.closeNode(); | 160 | bld.closeNode(); |
161 | bld.closeNode(); | ||
160 | } | 162 | } |
161 | ; | 163 | ; |
162 | 164 | ||
@@ -198,7 +200,7 @@ literal: tokInt { bld.addLiteral( Variable( $1 ) ); } | |||
198 | ; | 200 | ; |
199 | 201 | ||
200 | expr: literal | 202 | expr: literal |
201 | | tokIdent '(' listValues ')' | 203 | | tokIdent '(' funcCallParams ')' { bld.addFuncCall( *($1) ); } |
202 | | varRef | 204 | | varRef |
203 | | varRef '=' expr { bld.addNode( AstNode::tStore ); } | 205 | | varRef '=' expr { bld.addNode( AstNode::tStore ); } |
204 | | varRef tokPlusAssign expr { bld.addNode( AstNode::tPlusStore ); } | 206 | | varRef tokPlusAssign expr { bld.addNode( AstNode::tPlusStore ); } |
@@ -227,6 +229,14 @@ expr: literal | |||
227 | | '-' expr %prec NEG { bld.addNode( AstNode::tNegate ); } | 229 | | '-' expr %prec NEG { bld.addNode( AstNode::tNegate ); } |
228 | ; | 230 | ; |
229 | 231 | ||
232 | funcCallParams: | ||
233 | | expr funcCallParamsEx | ||
234 | ; | ||
235 | |||
236 | funcCallParamsEx: | ||
237 | | funcCallParamsEx ',' expr | ||
238 | ; | ||
239 | |||
230 | listValues: expr | 240 | listValues: expr |
231 | | listValues ',' expr | 241 | | listValues ',' expr |
232 | ; | 242 | ; |
@@ -235,12 +245,13 @@ dictValues: expr ':' expr | |||
235 | | dictValues ',' expr ':' expr | 245 | | dictValues ',' expr ':' expr |
236 | ; | 246 | ; |
237 | 247 | ||
238 | commandDecl: tokCommand ':' tokString commandParamList '{' cmpltExprList '}' | 248 | commandDecl: tokCommand ':' tokString { bld.beginCommand( *$3 ); } |
249 | commandParamList '{' cmpltExprList '}' { bld.closeCommand(); } | ||
239 | ; | 250 | ; |
240 | 251 | ||
241 | commandParamList: | 252 | commandParamList: |
242 | | commandParamList tokString | 253 | | commandParamList tokString { bld.addCommandLiteral( *$2 ); } |
243 | | commandParamList tokIdent | 254 | | commandParamList tokIdent { bld.addCommandParam( *$2 ); } |
244 | ; | 255 | ; |
245 | %% | 256 | %% |
246 | /* | 257 | /* |
@@ -7,6 +7,10 @@ game.start = <<start>>; | |||
7 | 7 | ||
8 | global | 8 | global |
9 | { | 9 | { |
10 | command: "eat" object | ||
11 | { | ||
12 | pow(5, x*2); | ||
13 | } | ||
10 | } | 14 | } |
11 | 15 | ||
12 | function hello( a, b, c ) | 16 | function hello( a, b, c ) |