示例#1
0
        public void Case1()
        {
            var r1 = Separator.Parse("->");

            var r2 = Operator.Parse("%");
            var r3 = Operator.Parse("=");

            var r4 = SimpleRule.Parse("Description % allegro -> Z_ALLEGRO");

            var r5 = SimpleRules.Parse("Description % allegro -> Z_ALLEGRO\r\nAmount = 100 -> STOWA");
        }
示例#2
0
        private object ParseWithContains(string source, ParsingContext ctx)
        {
            object result = new ExpandoObject();

            object _this        = null;
            bool   overrideThis = false;
            int    startIndex   = ctx.Index;

            for (var i = 0; i < Contains.Length; i++)
            {
                var comp       = Contains[i];
                var itemResult = comp.Parse(source, ctx);
                if (ctx.Success && comp.IsThis)
                {
                    overrideThis = true;
                    _this        = itemResult;
                }
                if (comp.Name != null)
                {
                    ((IDictionary <string, object>)result)[comp.Name] = itemResult;
                }
                if (!ctx.Success)
                {
                    break;
                }
                if (i < Contains.Length - 1)
                {
                    Separator?.Parse(source, ctx);
                    if (!ctx.Success)
                    {
                        break;
                    }
                }
            }

            if (ctx.Success && overrideThis)
            {
                result = _this;
            }
            if (!ctx.Success && !Required)
            {
                result      = Default;
                ctx.Success = true;
                ctx.Index   = startIndex;
            }
            return(result);
        }
示例#3
0
        private object[] ParseWithRepeats(string source, ParsingContext ctx)
        {
            var result = new List <object>();

            int    activeIndex   = ctx.Index;
            object failureResult = null;

            while (result.Count < Max && ctx.Success)
            {
                var itemResult = Repeated.Parse(source, ctx);
                if (ctx.Success)
                {
                    result.Add(itemResult);
                    activeIndex = ctx.Index;
                    if (Separator != null)
                    {
                        Separator.Parse(source, ctx);
                        if (ctx.Success)
                        {
                            activeIndex = ctx.Index;
                        }
                    }
                }
                else
                {
                    failureResult = itemResult;
                }
            }

            ctx.Success = result.Count >= Min;
            if (ctx.Success)
            {
                ctx.Index = activeIndex;
            }
            else if (failureResult != null)
            {
                result.Add(failureResult);
            }

            return(result.ToArray());
        }
        /// <summary>
        /// Attempts to match an input string starting at the given index.
        /// </summary>
        /// <param name="input">String to match.</param>
        /// <param name="index">Index to begin matching at.</param>
        /// <returns>An <see cref="IParseResult{T}"/> containing the parsed value.</returns>
        public override IParseResult <IReadOnlyList <TResult> > Parse(string input, int index)
        {
            var results = new List <TResult>();
            var i       = index;
            var sb      = new StringBuilder();

            while (results.Count <= MaxRepetitions)
            {
                if (Separator != null && results.Count > 0)
                {
                    var separatorResult = Separator.Parse(input, i);
                    if (!separatorResult.Success)
                    {
                        break;
                    }
                    sb.Append(separatorResult.Text);
                    i += separatorResult.Text.Length;
                }

                var result = Parser.Parse(input, i);
                if (!result.Success)
                {
                    break;
                }
                results.Add(result.Value);
                sb.Append(result.Text);
                i += result.Text.Length;
            }

            if (results.Count >= MinRepetitions)
            {
                return(new ParseSuccess <IReadOnlyList <TResult> >(sb.ToString(), results, index));
            }

            return(new ParseFail <IReadOnlyList <TResult> >(
                       FailureType.Parsing,
                       index,
                       string.Concat("Expected to match ", Parser, " at least ", MinRepetitions, " times. Actually matched ", results.Count, " times")));
        }