/// <summary> /// Parses a for loop. /// </summary> /// <remarks> /// Assumes the 'for' keyword has already been consumed. /// </remarks> internal static ExpressionBase Parse(PositionalTokenizer tokenizer, int line = 0, int column = 0) { ExpressionBase.SkipWhitespace(tokenizer); var keywordFor = new KeywordExpression("for", line, column); line = tokenizer.Line; column = tokenizer.Column; var iteratorName = tokenizer.ReadIdentifier(); if (iteratorName.IsEmpty) { return(ParseError(tokenizer, "Invalid function name", line, column)); } var iterator = new VariableDefinitionExpression(iteratorName.ToString(), line, column); ExpressionBase.SkipWhitespace(tokenizer); line = tokenizer.Line; column = tokenizer.Column; if (!tokenizer.Match("in")) { return(ParseError(tokenizer, "Expected 'in' after loop variable")); } var keywordIn = new KeywordExpression("in", line, column); var range = ExpressionBase.Parse(tokenizer); if (range.Type == ExpressionType.ParseError) { return(range); } var loop = new ForExpression(iterator, range); var error = ExpressionBase.ParseStatementBlock(tokenizer, loop.Expressions); if (error != null) { return(error); } loop._keywordFor = keywordFor; loop._keywordIn = keywordIn; loop.Line = keywordFor.Line; loop.Column = keywordFor.Column; loop.EndLine = tokenizer.Line; loop.EndColumn = tokenizer.Column; return(loop); }
/// <summary> /// Parses a if definition. /// </summary> /// <remarks> /// Assumes the 'if' keyword has already been consumed. /// </remarks> internal static ExpressionBase Parse(PositionalTokenizer tokenizer, int line = 0, int column = 0) { ExpressionBase.SkipWhitespace(tokenizer); var condition = ExpressionBase.Parse(tokenizer); if (condition.Type == ExpressionType.ParseError) { return(condition); } if (condition.Type != ExpressionType.Conditional && condition.Type != ExpressionType.Comparison) { return(ParseError(tokenizer, "Expected conditional statement following if", condition)); } var ifExpression = new IfExpression(condition); ifExpression._keyword = new KeywordExpression("if", line, column); var error = ExpressionBase.ParseStatementBlock(tokenizer, ifExpression.Expressions); if (error != null) { return(error); } ExpressionBase.SkipWhitespace(tokenizer); if (tokenizer.Match("else")) { error = ExpressionBase.ParseStatementBlock(tokenizer, ifExpression.ElseExpressions); if (error != null) { return(error); } } return(ifExpression); }
/// <summary> /// Parses a if definition. /// </summary> /// <remarks> /// Assumes the 'if' keyword has already been consumed. /// </remarks> internal static ExpressionBase Parse(PositionalTokenizer tokenizer, int line = 0, int column = 0) { ExpressionBase.SkipWhitespace(tokenizer); var condition = ExpressionBase.Parse(tokenizer); if (condition.Type == ExpressionType.ParseError) { return(condition); } var ifExpression = new IfExpression(condition); ifExpression._keyword = new KeywordExpression("if", line, column); var error = ExpressionBase.ParseStatementBlock(tokenizer, ifExpression.Expressions); if (error != null) { return(error); } ExpressionBase.SkipWhitespace(tokenizer); line = tokenizer.Line; column = tokenizer.Column; if (tokenizer.Match("else")) { ifExpression._elseKeyword = new KeywordExpression("else", line, column); error = ExpressionBase.ParseStatementBlock(tokenizer, ifExpression.ElseExpressions); if (error != null) { return(error); } } return(ifExpression); }