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); }
private void StructField(ScriptLoadingContext lcontext) { Expression key = new LiteralExpression(lcontext, DynValue.NewString(lcontext.Lexer.Current.Text)); lcontext.Lexer.Next(); CheckTokenType(lcontext, TokenType.Op_Assignment); var value = Expr(lcontext); m_CtorArgs.Add(new KeyValuePair<Expression, Expression>(key, value)); }
public FunctionCallExpression(ScriptLoadingContext lcontext, Expression function, Token thisCallName) : base(lcontext) { Token callToken = thisCallName ?? lcontext.Lexer.Current; m_Name = thisCallName != null ? thisCallName.Text : null; m_DebugErr = function.GetFriendlyDebugName(); m_Function = function; switch (lcontext.Lexer.Current.Type) { case TokenType.Brk_Open_Round: Token openBrk = lcontext.Lexer.Current; lcontext.Lexer.Next(); Token t = lcontext.Lexer.Current; if (t.Type == TokenType.Brk_Close_Round) { m_Arguments = new List<Expression>(); SourceRef = callToken.GetSourceRef(t); lcontext.Lexer.Next(); } else { m_Arguments = ExprList(lcontext); SourceRef = callToken.GetSourceRef(CheckMatch(lcontext, openBrk, TokenType.Brk_Close_Round, ")")); } break; case TokenType.String: case TokenType.String_Long: { m_Arguments = new List<Expression>(); Expression le = new LiteralExpression(lcontext, lcontext.Lexer.Current); m_Arguments.Add(le); SourceRef = callToken.GetSourceRef(lcontext.Lexer.Current); } break; case TokenType.Brk_Open_Curly: case TokenType.Brk_Open_Curly_Shared: { m_Arguments = new List<Expression>(); m_Arguments.Add(new TableConstructor(lcontext, lcontext.Lexer.Current.Type == TokenType.Brk_Open_Curly_Shared)); SourceRef = callToken.GetSourceRefUpTo(lcontext.Lexer.Current); } break; default: throw new SyntaxErrorException(lcontext.Lexer.Current, "function arguments expected") { IsPrematureStreamTermination = (lcontext.Lexer.Current.Type == TokenType.Eof) }; } }