public override Expression Scan(ParseEngine engine) { var kw = new ForKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); var start = engine.Pointer; var index = engine.Advance(Token.Length).Skip().Pointer; var chars = engine.Characters; if (index == chars.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPForArgumentsMissing(engine)); return(kw); } if (chars[index] == '(') { var ln = engine.CurrentLine; var col = engine.CurrentColumn; kw.Initialization = engine.Advance().ParseStatement(); kw.Condition = engine.ParseStatement(); kw.Condition.IsMuted = false; kw.End = engine.ParseStatement(')', e => new YAMPBracketNotClosedError(ln, col)); SetMarker(engine); kw.Body = engine.ParseStatement(); UnsetMarker(engine); } else { engine.AddError(new YAMPForArgumentsMissing(engine)); } kw.Length = engine.Pointer - start; return(kw); }
public override Expression Scan(ParseEngine engine) { var start = engine.Pointer; var kw = new IfKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); var index = engine.Advance(Token.Length).Skip().Pointer; var chars = engine.Characters; if (index == chars.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPIfArgumentsMissing(engine), kw); return(kw); } if (chars[index] == '(') { var ln = engine.CurrentLine; var col = engine.CurrentColumn; kw.Condition = engine.Advance().ParseStatement(')', e => new YAMPBracketNotClosedError(ln, col)); if (kw.Condition.Container == null || !kw.Condition.Container.HasContent) { engine.AddError(new YAMPIfArgumentsMissing(engine), kw); } kw.Body = engine.ParseStatement(); } else { engine.AddError(new YAMPIfArgumentsMissing(engine), kw); } kw.Length = engine.Pointer - start; return(kw); }
public override Expression Scan(ParseEngine engine) { var start = engine.Pointer; var kw = new DoKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); var index = engine.Advance(Token.Length).Pointer; kw.Body = engine.ParseStatement(); kw.Length = engine.Pointer - start; return kw; }
public override Expression Scan(ParseEngine engine) { var start = engine.Pointer; var kw = new DoKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); var index = engine.Advance(Token.Length).Pointer; kw.Body = engine.ParseStatement(); kw.Length = engine.Pointer - start; return(kw); }
public override Expression Scan(ParseEngine engine) { var start = engine.Pointer; var kw = new WhileKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); var index = engine.Advance(Token.Length).Skip().Pointer; var chars = engine.Characters; if (index == chars.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPWhileArgumentsMissing(engine), kw); return(kw); } if (chars[index] == '(') { var ln = engine.CurrentLine; var col = engine.CurrentColumn; kw.Condition = engine.Advance().ParseStatement(')', e => new YAMPBracketNotClosedError(ln, col)); if (kw.Condition.Container == null || !kw.Condition.Container.HasContent) { engine.AddError(new YAMPWhileArgumentsMissing(engine), kw); } SetMarker(engine); kw.Body = engine.ParseStatement(); UnsetMarker(engine); if (engine.LastStatement != null && engine.LastStatement.IsKeyword <DoKeyword>()) { if (kw.Body.IsEmpty) { IsDoWhile = true; engine.LastStatement.GetKeyword <DoKeyword>().While = kw; } else { engine.AddError(new YAMPDoWhileNotEmptyError(engine), kw); } } } else { engine.AddError(new YAMPWhileArgumentsMissing(engine), kw); } kw.Length = engine.Pointer - start; return(kw); }
/// <summary> /// Scans for a function entry. /// </summary> /// <param name="engine">The current parse engine.</param> /// <returns>The created expression.</returns> public override Expression Scan(ParseEngine engine) { var start = engine.Pointer; var kw = new FunctionKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); engine.Advance(Token.Length).Skip(); if (engine.Pointer == engine.Characters.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPFunctionNameMissing(engine), kw); return kw; } kw.name = engine.Elements.FindExpression<SymbolExpression>().Scan(engine) as SymbolExpression; if (kw.name == null) { engine.AddError(new YAMPFunctionNameMissing(engine), kw); return kw; } engine.Skip(); if (engine.Pointer == engine.Characters.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPFunctionArgumentsMissing(engine), kw); return kw; } kw.arguments = engine.Elements.FindExpression<BracketExpression>().Scan(engine) as BracketExpression; if (engine.Pointer == engine.Characters.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPFunctionBodyMissing(engine), kw.arguments); return kw; } kw.Body = engine.ParseStatement(); kw.Length = engine.Pointer - start; if (kw.Body.Container.Expressions.Length == 1 && kw.Body.Container.Expressions[0] is GroupExpression) { var container = (GroupExpression)kw.Body.Container.Expressions[0]; var context = new ParseContext(engine.Context.Parent); var input = container.Scope.Input; container.Scope = new QueryContext(context, input); } else { engine.AddError(new YAMPFunctionBodyMissing(engine), kw.arguments); return kw; } if (kw.arguments == null) { engine.AddError(new YAMPFunctionArgumentsMissing(engine), kw); return kw; } else if (kw.arguments.HasContent && !kw.arguments.IsSymbolList) { engine.AddError(new YAMPFunctionArgumentsSymbols(engine), kw.arguments); return kw; } return kw; }
public override Expression Scan(ParseEngine engine) { var start = engine.Pointer; var kw = new WhileKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); var index = engine.Advance(Token.Length).Skip().Pointer; var chars = engine.Characters; if (index == chars.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPWhileArgumentsMissing(engine), kw); return kw; } if (chars[index] == '(') { var ln = engine.CurrentLine; var col = engine.CurrentColumn; kw.Condition = engine.Advance().ParseStatement(')', e => new YAMPBracketNotClosedError(ln, col)); if (kw.Condition.Container == null || !kw.Condition.Container.HasContent) { engine.AddError(new YAMPWhileArgumentsMissing(engine), kw); } SetMarker(engine); kw.Body = engine.ParseStatement(); UnsetMarker(engine); if (engine.LastStatement != null && engine.LastStatement.IsKeyword<DoKeyword>()) { if (kw.Body.IsEmpty) { IsDoWhile = true; engine.LastStatement.GetKeyword<DoKeyword>().While = kw; } else { engine.AddError(new YAMPDoWhileNotEmptyError(engine), kw); } } } else { engine.AddError(new YAMPWhileArgumentsMissing(engine), kw); } kw.Length = engine.Pointer - start; return kw; }
public override Expression Scan(ParseEngine engine) { var kw = new ForKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); var start = engine.Pointer; var index = engine.Advance(Token.Length).Skip().Pointer; var chars = engine.Characters; if (index == chars.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPForArgumentsMissing(engine)); return kw; } else if (chars[index] == '(') { var ln = engine.CurrentLine; var col = engine.CurrentColumn; kw.Initialization = engine.Advance().ParseStatement(); kw.Condition = engine.ParseStatement(); kw.Condition.IsMuted = false; kw.End = engine.ParseStatement(')', e => new YAMPBracketNotClosedError(ln, col)); SetMarker(engine); kw.Body = engine.ParseStatement(); UnsetMarker(engine); } else { engine.AddError(new YAMPForArgumentsMissing(engine)); } kw.Length = engine.Pointer - start; return kw; }
public override Expression Scan(ParseEngine engine) { var start = engine.Pointer; var kw = new IfKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); var index = engine.Advance(Token.Length).Skip().Pointer; var chars = engine.Characters; if (index == chars.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPIfArgumentsMissing(engine), kw); return kw; } if (chars[index] == '(') { var ln = engine.CurrentLine; var col = engine.CurrentColumn; kw.Condition = engine.Advance().ParseStatement(')', e => new YAMPBracketNotClosedError(ln, col)); if (kw.Condition.Container == null || !kw.Condition.Container.HasContent) { engine.AddError(new YAMPIfArgumentsMissing(engine), kw); } kw.Body = engine.ParseStatement(); } else { engine.AddError(new YAMPIfArgumentsMissing(engine), kw); } kw.Length = engine.Pointer - start; return kw; }
/// <summary> /// Scans for a function entry. /// </summary> /// <param name="engine">The current parse engine.</param> /// <returns>The created expression.</returns> public override Expression Scan(ParseEngine engine) { var start = engine.Pointer; var kw = new FunctionKeyword(engine.CurrentLine, engine.CurrentColumn, engine.Query); engine.Advance(Token.Length).Skip(); if (engine.Pointer == engine.Characters.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPFunctionNameMissing(engine), kw); return(kw); } kw.name = engine.Elements.FindExpression <SymbolExpression>().Scan(engine) as SymbolExpression; if (kw.name == null) { engine.AddError(new YAMPFunctionNameMissing(engine), kw); return(kw); } engine.Skip(); if (engine.Pointer == engine.Characters.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPFunctionArgumentsMissing(engine), kw); return(kw); } kw.arguments = engine.Elements.FindExpression <BracketExpression>().Scan(engine) as BracketExpression; if (engine.Pointer == engine.Characters.Length) { kw.Length = engine.Pointer - start; engine.AddError(new YAMPFunctionBodyMissing(engine), kw.arguments); return(kw); } kw.Body = engine.ParseStatement(); kw.Length = engine.Pointer - start; if (kw.Body.Container.Expressions.Length == 1 && kw.Body.Container.Expressions[0] is GroupExpression) { var container = (GroupExpression)kw.Body.Container.Expressions[0]; var context = new ParseContext(engine.Context.Parent); var input = container.Scope.Input; container.Scope = new QueryContext(context, input); } else { engine.AddError(new YAMPFunctionBodyMissing(engine), kw.arguments); return(kw); } if (kw.arguments == null) { engine.AddError(new YAMPFunctionArgumentsMissing(engine), kw); return(kw); } else if (kw.arguments.HasContent && !kw.arguments.IsSymbolList) { engine.AddError(new YAMPFunctionArgumentsSymbols(engine), kw.arguments); return(kw); } return(kw); }