コード例 #1
0
ファイル: CollectionTest.cs プロジェクト: toddcoder/Core-code
        public void MaybeStackItemTest()
        {
            var stack = new MaybeStack <string>();

            stack.Push("alpha");
            stack.Push("bravo");
            stack.Push("charlie");

            if (stack.Item(0).If(out var item, out var exception))
            {
                Console.WriteLine(item);
            }
            else
            {
                Console.WriteLine(exception.Message);
            }

            if (stack.Item(-1).If(out item, out exception))
            {
                Console.WriteLine(item);
            }
            else
            {
                Console.WriteLine(exception.Message);
            }
        }
コード例 #2
0
 static Scraper()
 {
     scraperStack = new MaybeStack <Scraper>();
 }
コード例 #3
0
ファイル: Parser.cs プロジェクト: toddcoder/Core-code
        public Result <Configuration> Parse()
        {
            var rootGroup = new Group("_$root");
            var stack     = new MaybeStack <IConfigurationItem>();

            stack.Push(rootGroup);

            Maybe <Group> peekGroup()
            {
                return
                    (from parentItem in stack.Peek()
                     from parentGroup in parentItem.IfCast <Group>()
                     select parentGroup);
            }

            Maybe <Group> popGroup()
            {
                return
                    (from parentItem in stack.Pop()
                     from parentGroup in parentItem.IfCast <Group>()
                     select parentGroup);
            }

            Result <(string newSource, string str)> getString(string source)
            {
                if (source.Matches("^ /s* /[quote]; f").If(out var result))
                {
                    var quote = result.FirstGroup[0];
                    return(getQuotedString(source.Drop(result.Length), quote));
                }
                else if (source.Matches("^ /s* /(-[/r /n]*) ('/r/n')?; f").If(out result))
                {
                    var foundReturn = false;
                    var builder     = new StringBuilder();
                    for (var i = 0; i < source.Length; i++)
                    {
                        var current = source[i];
                        switch (current)
                        {
                        case ';':
                            return((source.Drop(i + 1), builder.ToString()).Success());

                        case ']' or '#':
                            return((source.Drop(i), builder.ToString()).Success());

                        case '\r' or '\n':
                            foundReturn = true;
                            break;

                        default:
                            if (foundReturn)
                            {
                                return((source.Drop(i - 1), builder.ToString()).Success());
                            }
                            else
                            {
                                builder.Append(current);
                            }

                            break;
                        }
                    }

                    return((string.Empty, builder.ToString()).Success());
                }
                else
                {
                    return("Couldn't determine string".Failure <(string, string)>());
                }
            }
コード例 #4
0
        public override bool Evaluate(string input)
        {
            index = State.Position;
            var current = input.Skip(index);

            if (!current.IsMatch("['()[]{}']"))
            {
                length = current.Length;
                return(true);
            }

            if (!current.IsMatch("^ ['([{']"))
            {
                return(false);
            }

            var stack = new MaybeStack <char>();

            for (var i = index; i < input.Length; i++)
            {
                var currentChar = input[i];
                switch (currentChar)
                {
                case '(':
                    stack.Push(')');
                    break;

                case '{':
                    stack.Push('}');
                    break;

                case '[':
                    stack.Push(']');
                    break;

                case ')':
                case '}':
                case ']':
                    var previous = stack.Pop();
                    if (previous.IsSome)
                    {
                        if (previous.Value != currentChar)
                        {
                            return(false);
                        }
                        if (stack.Count == 0)
                        {
                            length = i - index + 1;
                            return(true);
                        }
                    }
                    else
                    {
                        return(false);
                    }
                    break;
                }
            }
            if (stack.Count > 0)
            {
                return(false);
            }
            length = current.Length;
            return(true);
        }