private static IEnumerable <LiteralNode> Expand(INode bracketNode)
        {
            foreach (var childNode in bracketNode.ChildNodes)
            {
                switch (childNode.Token.TokenType)
                {
                case TokenType.Literal:
                    yield return((LiteralNode)childNode);

                    break;

                case TokenType.Range:
                    var min = (int)((LiteralNode)childNode.ChildNodes[0]).Token.Character;
                    var max = (int)((LiteralNode)childNode.ChildNodes[1]).Token.Character;
                    for (var i = min; i <= max; i++)
                    {
                        var c = (char)i;
                        yield return(NodeBuilder.BuildLiteralNode(TokenBuilder.BuildLiteralToken(c)));
                    }
                    break;

                case TokenType.BracketRight:
                    foreach (var node in Expand(childNode))
                    {
                        yield return(node);
                    }
                    break;
                }
            }
        }
        public void Visit(NotNode node)
        {
            var nodes = new LiteralNodeCollection();

            for (var i = 32; i < 126; i++)
            {
                nodes.Add(NodeBuilder.BuildLiteralNode(TokenBuilder.BuildLiteralToken((char)i)));
            }

            INode current = node;

            while (current.ChildNodes[0].Token.TokenType == TokenType.Concatenation)
            {
                current = node.ChildNodes[0];
            }

            foreach (var expandedNode in Expand(current))
            {
                if (nodes.Contains(expandedNode))
                {
                    nodes.Remove(expandedNode);
                }
            }

            var index = RandomNumberProvider.GetRandomNumber(0, nodes.Count);

            nodes[index].Accept(this);
        }
Beispiel #3
0
        public IToken Handle(IContext context)
        {
            context.EndState();
            switch (context.Current)
            {
            case 'd':
                return(TokenBuilder.BuildNumericToken());

            case 'w':
                return(TokenBuilder.BuildWordToken());

            case 's':
                return(TokenBuilder.BuildWhitespaceToken());

            case 'D':
                return(TokenBuilder.BuildNonNumericToken());

            case 'W':
                return(TokenBuilder.BuildNonWordToken());

            case 'S':
                return(TokenBuilder.BuildNonWhitespaceToken());

            default:
                return(TokenBuilder.BuildLiteralToken(context.Current));
            }
        }
        public void Visit(RangeNode node)
        {
            var min     = (int)((LiteralNode)node.ChildNodes[0]).Token.Character;
            var max     = (int)((LiteralNode)node.ChildNodes[1]).Token.Character;
            var index   = RandomNumberProvider.GetRandomNumber(min, max + 1);
            var literal = new LiteralNode(TokenBuilder.BuildLiteralToken((char)index));

            literal.Accept(this);
        }
Beispiel #5
0
        public IToken Handle(IContext context)
        {
            switch (context.Current)
            {
            case '^':
                return(TokenBuilder.BuildNotToken());

            case '\\':
                context.ToState(new SetState());
                context.ToState(new EscapeState());
                break;

            default:
                context.ToState(new SetState());
                return(TokenBuilder.BuildLiteralToken(context.Current));
            }
            return(null);
        }
Beispiel #6
0
        public IToken Handle(IContext context)
        {
            switch (context.Current)
            {
            case '(':
                return(TokenBuilder.BuildParenthesisLeftToken());

            case ')':
                return(TokenBuilder.BuildParenthesisRightToken());

            case '{':
                context.ToState(new RepetitionState());
                break;

            case '\\':
                context.ToState(new EscapeState());
                break;

            case '[':
                context.ToState(new BeginSetState());
                return(TokenBuilder.BuildBracketLeftToken());

            case '*':
                return(TokenBuilder.BuildZeroOrMoreToken());

            case '?':
                return(TokenBuilder.BuildZeroOrOneToken());

            case '+':
                return(TokenBuilder.BuildOneOrMoreToken());

            case '|':
                return(TokenBuilder.BuildAlternationToken());

            case '.':
                return(TokenBuilder.BuildAnyToken());

            default:
                return(TokenBuilder.BuildLiteralToken(context.Current));
            }
            return(null);
        }
Beispiel #7
0
        public IToken Handle(IContext context)
        {
            switch (context.Current)
            {
            case ']':
                context.EndState();
                context.EndState();
                return(TokenBuilder.BuildBracketRightToken());

            case '-':
                return(TokenBuilder.BuildRangeToken());

            case '\\':
                context.ToState(new EscapeState());
                break;

            default:
                return(TokenBuilder.BuildLiteralToken(context.Current));
            }
            return(null);
        }