diff options
Diffstat (limited to 'src/parser.y')
-rw-r--r-- | src/parser.y | 48 |
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 | ||
147 | cmpltExpr: expr ';' | 147 | cmpltExpr: 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 | ||
154 | forIterator: tokIdent | 162 | forIterator: tokIdent |
155 | | tokIdent ':' tokIdent | 163 | | tokIdent ':' tokIdent |
156 | 164 | ||
165 | ifbase: 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 | |||
157 | ifnext: | 178 | ifnext: |
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 | ||
162 | varRef: tokIdent { bld.addVarRef( *($1) ); } | 185 | varRef: 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 | | '[' ']' |