public ForLoopStatement(ScriptLoadingContext lcontext, Token nameToken, Token forToken) : base(lcontext) { // for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end | // lexer already at the '=' ! [due to dispatching vs for-each] CheckTokenType(lcontext, TokenType.Op_Assignment); m_Start = Expression.Expr(lcontext); CheckTokenType(lcontext, TokenType.Comma); m_End = Expression.Expr(lcontext); if (lcontext.Lexer.Current.Type == TokenType.Comma) { lcontext.Lexer.Next(); m_Step = Expression.Expr(lcontext); } else { m_Step = new LiteralExpression(lcontext, DynValue.NewNumber(1)); } lcontext.Scope.PushBlock(); m_VarName = lcontext.Scope.DefineLocal(nameToken.Text); m_RefFor = forToken.GetSourceRef(CheckTokenType(lcontext, TokenType.Do)); m_InnerBlock = new CompositeStatement(lcontext); m_RefEnd = CheckTokenType(lcontext, TokenType.End).GetSourceRef(); m_StackFrame = lcontext.Scope.PopBlock(); lcontext.Source.Refs.Add(m_RefFor); lcontext.Source.Refs.Add(m_RefEnd); }
public ScopeBlockStatement(ScriptLoadingContext lcontext) : base(lcontext) { lcontext.Scope.PushBlock(); m_Do = CheckTokenType(lcontext, TokenType.Do).GetSourceRef(); m_Block = new CompositeStatement(lcontext); m_End = CheckTokenType(lcontext, TokenType.End).GetSourceRef(); m_StackFrame = lcontext.Scope.PopBlock(); lcontext.Source.Refs.Add(m_Do); lcontext.Source.Refs.Add(m_End); }
public RepeatStatement(ScriptLoadingContext lcontext) : base(lcontext) { m_Repeat = CheckTokenType(lcontext, TokenType.Repeat).GetSourceRef(); lcontext.Scope.PushBlock(); m_Block = new CompositeStatement(lcontext); var until = CheckTokenType(lcontext, TokenType.Until); m_Condition = Expression.Expr(lcontext); m_Until = until.GetSourceRefUpTo(lcontext.Lexer.Current); m_StackFrame = lcontext.Scope.PopBlock(); lcontext.Source.Refs.Add(m_Repeat); lcontext.Source.Refs.Add(m_Until); }
public ForEachLoopStatement(ScriptLoadingContext lcontext, Token firstNameToken, Token forToken) : base(lcontext) { // for namelist in explist do block end | List<string> names = new List<string>(); names.Add(firstNameToken.Text); while (lcontext.Lexer.Current.Type == TokenType.Comma) { lcontext.Lexer.Next(); Token name = CheckTokenType(lcontext, TokenType.Name); names.Add(name.Text); } CheckTokenType(lcontext, TokenType.In); m_RValues = new ExprListExpression(Expression.ExprList(lcontext), lcontext); lcontext.Scope.PushBlock(); m_Names = names .Select(n => lcontext.Scope.TryDefineLocal(n)) .ToArray(); m_NameExps = m_Names .Select(s => new SymbolRefExpression(lcontext, s)) .Cast<IVariable>() .ToArray(); m_RefFor = forToken.GetSourceRef(CheckTokenType(lcontext, TokenType.Do)); m_Block = new CompositeStatement(lcontext); m_RefEnd = CheckTokenType(lcontext, TokenType.End).GetSourceRef(); m_StackFrame = lcontext.Scope.PopBlock(); lcontext.Source.Refs.Add(m_RefFor); lcontext.Source.Refs.Add(m_RefEnd); }
public WhileStatement(ScriptLoadingContext lcontext) : base(lcontext) { Token whileTk = CheckTokenType(lcontext, TokenType.While); m_Condition = Expression.Expr(lcontext); m_Start = whileTk.GetSourceRefUpTo(lcontext.Lexer.Current); //m_Start = BuildSourceRef(context.Start, exp.Stop); //m_End = BuildSourceRef(context.Stop, context.END()); lcontext.Scope.PushBlock(); CheckTokenType(lcontext, TokenType.Do); m_Block = new CompositeStatement(lcontext); m_End = CheckTokenType(lcontext, TokenType.End).GetSourceRef(); m_StackFrame = lcontext.Scope.PopBlock(); lcontext.Source.Refs.Add(m_Start); lcontext.Source.Refs.Add(m_End); }
internal void SetScope(RuntimeScopeBlock runtimeScopeBlock) { m_StackFrame = runtimeScopeBlock; }