public override Verb Parse() { var block = new Block(); var index = position; prefixOperatorParser = new PrefixOperatorParser(); valueParser = new ValueParser(); postfixOperatorParser = new PostfixOperatorParser(asStatement); infixOperatorParser = new InfixOperatorParser(); andOrParser = new AndOrParser(Stop.PassAlong(stop, Structures)); ignoreReturnsParser = new IgnoreReturnsParser(); ifExpressionParser = new IfExpressionParser(); IMaybe <int> newIndex; if (index < source.Length) { newIndex = isStopping(index); if (newIndex.IsSome) { return(returnBlock(block, newIndex.Value)); } newIndex = getTerm(block, index); if (newIndex.IsNone || newIndex.Value == index) { return(null); } index = newIndex.Value; } while (index < source.Length) { newIndex = isStopping(index); if (newIndex.IsSome) { return(returnBlock(block, newIndex.Value)); } if (infixOperatorParser.Scan(source, index)) { block.Add(infixOperatorParser.Verb); index = infixOperatorParser.Position; } else { break; } newIndex = getTerm(block, index); if (newIndex.IsNone || newIndex.Value == index) { return(null); } index = newIndex.Value; } if (index < source.Length) { newIndex = isStopping(index); if (newIndex.IsSome) { return(returnBlock(block, newIndex.Value)); } if (andOrParser.Scan(source, index)) { block.Add(andOrParser.Verb); index = andOrParser.Position; } } return(returnBlock(block, index)); }
public static IMaybe <(Block, Block, int)> GetExpressionThenBlock(string source, int index) { return(GetExpression(source, index, Stop.ExpressionThenBlock()) .Map(t => GetOneOrMultipleBlock(source, t.Item2).Map(t2 => (t.Item1, t2.Item1, t2.Item2)))); }
public static IMaybe <(Block, Block, int)> GetComparisand(string source, int index, Stop stop) { if (ExpressionParser.GetExpression(source, index, stop).If(out var expression, out var i)) { (var comparisand, var condition) = GetComparisand(expression); return((comparisand, condition, i).Some()); } return(MaybeFunctions.none <(Block, Block, int)>()); }
public static IMaybe <(Block, int)> GetExpression(string source, int index, Stop stop, bool asStatement = false) { var parser = new ExpressionParser(stop, asStatement); return(when(parser.Scan(source, index), () => (parser.Block, parser.Position))); }
public static Stop PassAlong(Stop stop, EntityType color) => new Stop(stop.Pattern, stop.Consume, color);