public Expr OnParseFor() { var tokenIt = _parser.TokenIt; var initiatorToken = tokenIt.NextToken; // <codeFor> if (initiatorToken.Token == Tokens.For) { tokenIt.ExpectMany(Tokens.For, Tokens.LeftParenthesis); var ahead = tokenIt.Peek(1); if (ahead.Token == Tokens.In) { return(OnParseForEach()); } } var start = _parser.ParseStatement(); var condition = _parser.ParseExpression(Terminators.ExpSemicolonEnd); tokenIt.Advance(); var name = tokenIt.ExpectId(); var increment = _parser.ParseUnary(name, false); tokenIt.Expect(Tokens.RightParenthesis); var expr = Exprs.For(start, condition, increment, initiatorToken) as BlockExpr; ParseBlock(expr); // </codeFor> _parser.SetupContext(expr, initiatorToken); return(expr); }
public Expr OnParseForEach() { var tokenIt = _parser.TokenIt; var initiatorToken = tokenIt.NextToken; // <codeForEach> if (initiatorToken.Token == Tokens.For) { tokenIt.ExpectMany(Tokens.For, Tokens.LeftParenthesis); var ahead = tokenIt.Peek(1); if (ahead.Token != Tokens.In) { return(OnParseFor()); } } var varname = tokenIt.ExpectId(); tokenIt.Expect(Tokens.In); var sourceExpr = _parser.ParseExpression(Terminators.ExpParenthesisNewLineEnd, true, false, true, false, false); tokenIt.Expect(Tokens.RightParenthesis); var expr = Exprs.ForEach(varname, sourceExpr, initiatorToken) as BlockExpr; ParseBlock(expr); // </codeForEach> _parser.SetupContext(expr, initiatorToken); return(expr); }
/// <summary> /// Parses a block by first pushing symbol scope and then popping after completion. /// </summary> public void ParseBlock(IBlockExpr expr) { _parser.Context.Symbols.Push(new SymbolsNested(string.Empty), true); expr.SymScope = _parser.Context.Symbols.Current; var withPush = false; if (expr is ForEachExpr) { var foreachExpr = expr as ForEachExpr; if (foreachExpr.EnableAutoVariable) { var name = foreachExpr.VarName; Exprs.WithPush(name); withPush = true; } } _parser.ParseBlock(expr); _parser.Context.Symbols.Pop(); if (withPush) { Exprs.WithPop(); } }