summaryrefslogtreecommitdiff
path: root/src/parser.y
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.y')
-rw-r--r--src/parser.y48
1 files changed, 38 insertions, 10 deletions
diff --git a/src/parser.y b/src/parser.y
index 7993927..fbada5a 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -80,10 +80,10 @@ void yyerror( YYLTYPE *llocp, yyscan_t yyscanner, GameBuilder &, const char *err
80 80
81%right tokNot 81%right tokNot
82%right '=' tokPlusAssign tokMinusAssign tokTimesAssign tokDivideAssign 82%right '=' tokPlusAssign tokMinusAssign tokTimesAssign tokDivideAssign
83%right tokLtEq tokGtEq tokCmp
84%left '-' '+' 83%left '-' '+'
85%left '*' '/' 84%left '*' '/'
86%left tokIn tokAnd tokOr 85%left tokIn tokAnd tokOr
86%right '<' '>' tokLtEq tokGtEq tokCmp
87%left '(' ')' '[' ']' 87%left '(' ')' '[' ']'
88 88
89%% 89%%
@@ -146,17 +146,40 @@ cmpltExprList:
146 146
147cmpltExpr: expr ';' 147cmpltExpr: expr ';'
148 | tokGoto '(' expr ')' ';' 148 | tokGoto '(' expr ')' ';'
149 | tokIf expr tokThen '{' cmpltExprList '}' ifnext 149 | ifbase
150 | tokFor tokEach forIterator tokIn expr tokDo '{' cmpltExprList '}' 150 | tokFor tokEach forIterator tokIn expr tokDo '{' cmpltExprList '}'
151 | tokWhile expr tokDo '{' cmpltExprList '}' 151 | tokWhile {
152 bld.addNode( AstNode::tWhile );
153 bld.addNode( AstNode::tScope );
154 } expr {
155 bld.closeNode();
156 bld.addNode( AstNode::tScope );
157 } tokDo '{' cmpltExprList '}' {
158 bld.closeNode(); bld.closeNode();
159 }
152 ; 160 ;
153 161
154forIterator: tokIdent 162forIterator: tokIdent
155 | tokIdent ':' tokIdent 163 | tokIdent ':' tokIdent
156 164
165ifbase: tokIf {
166 bld.addNode( AstNode::tIf );
167 bld.addNode( AstNode::tScope );
168 } expr {
169 bld.closeNode();
170 bld.addNode( AstNode::tScope );
171 } tokThen '{' cmpltExprList '}' {
172 bld.closeNode();
173 } ifnext {
174 bld.closeNode();
175 }
176 ;
177
157ifnext: 178ifnext:
158 | tokElse '{' cmpltExprList '}' 179 | tokElse { bld.addNode( AstNode::tScope ); } '{' cmpltExprList '}' {
159 | tokElse tokIf '{' cmpltExprList '}' ifnext 180 bld.closeNode();
181 }
182 | tokElse { bld.addNode( AstNode::tScope ); } ifbase
160 ; 183 ;
161 184
162varRef: tokIdent { bld.addVarRef( *($1) ); } 185varRef: tokIdent { bld.addVarRef( *($1) ); }
@@ -177,17 +200,22 @@ expr: literal
177 | tokIdent '(' listValues ')' 200 | tokIdent '(' listValues ')'
178 | varRef 201 | varRef
179 | varRef '=' expr { bld.addNode( AstNode::tStore ); } 202 | varRef '=' expr { bld.addNode( AstNode::tStore ); }
180 | varRef tokPlusAssign expr 203 | varRef tokPlusAssign expr
181 | varRef tokMinusAssign expr 204 | varRef tokMinusAssign expr
182 | varRef tokTimesAssign expr 205 | varRef tokTimesAssign expr
183 | varRef tokDivideAssign expr 206 | varRef tokDivideAssign expr
184 | expr '+' expr { printf(" + plus\n"); } 207 | expr '+' expr { bld.addNode( AstNode::tPlus ); }
185 | expr '-' expr { printf(" + minus\n"); } 208 | expr '-' expr { bld.addNode( AstNode::tMinus ); }
186 | expr '/' expr { printf(" + divide\n"); } 209 | expr '/' expr { bld.addNode( AstNode::tDivide ); }
187 | expr '*' expr { printf(" + times\n"); } 210 | expr '*' expr { bld.addNode( AstNode::tMultiply ); }
188 | expr tokAnd expr 211 | expr tokAnd expr
189 | expr tokOr expr 212 | expr tokOr expr
190 | expr tokIn expr 213 | expr tokIn expr
214 | expr tokCmp expr { bld.addNode( AstNode::tComp ); }
215 | expr '<' expr { bld.addNode( AstNode::tCompLt ); }
216 | expr '>' expr { bld.addNode( AstNode::tCompGt ); }
217 | expr tokLtEq expr { bld.addNode( AstNode::tCompLtEq ); }
218 | expr tokGtEq expr { bld.addNode( AstNode::tCompGtEq ); }
191 | '(' expr ')' 219 | '(' expr ')'
192 | expr '[' expr ']' 220 | expr '[' expr ']'
193 | '[' ']' 221 | '[' ']'