Differences From Artifact [4856c979362ef435]:
- File
polemy/parse.d
- 2010-11-07 12:46:23 - part of checkin [3f5dc76a75] on branch trunk - Added funcall expression parser and function literal parser. (user: kinaba) [annotate]
To Artifact [1d6de9cb69bbf7d4]:
- File
polemy/parse.d
- 2010-11-07 14:34:29 - part of checkin [0569f7b8c2] on branch trunk - - Added function literal evaluator (i.e., closure). - Workaround for d2stacktrace's infinite-loop bug. (when std.demangle.demangle use exception inside it, it will go into an infinite loop. to avoid this, I choose to unset TraceHandler during stacktrace generation. This is far from the complete solution, but at least it should work as expected under single-thread environment...) (user: kinaba) [annotate]
188 188 return e;
189 189 }
190 190
191 191 if( tryEat("fun") )
192 192 {
193 193 eat("(", "after fun");
194 194 string[] params;
195 - for(;;)
195 + while(!tryEat(")"))
196 196 {
197 197 if( lex.empty ) {
198 198 auto e = ParserException.create(lex,"Unexpected EOF");
199 199 throw e;
200 200 }
201 201 if( lex.front.kind != Token.Kind.identifier ) {
202 202 auto e = ParserException.create(lex,"Identifier Expected for parameters");
................................................................................
306 306 new IntLiteralExpression(null, BigInt(1)),
307 307 new FuncallExpression(null,
308 308 new FunLiteralExpression(null, ["abc"], [
309 309 ]),
310 310 new IntLiteralExpression(null, BigInt(4))
311 311 ))));
312 312 }
313 +unittest
314 +{
315 + auto p = parserFromString(`var x = 1; var f = fun(){x=x+1;}; f(); f(); x;`);
316 + Program prog = p.parseProgram();
317 +}