private int CountStrings(RegexExpression exp, int seed = 1)
        {
            var x = seed;

            if (exp.Quantifier == RegexTokenType.ZeroOrOneQuantifier)
            {
                x++;
            }

            if (exp is BinaryExpression)
            {
                var binExp = (exp as BinaryExpression);

                if (binExp.Operator == RegexTokenType.OrOperator)
                {
                    x++;
                }

                x += CountStrings(binExp.Left, 0) + CountStrings(binExp.Right, 0);
            }
            else if (exp is GroupExpression)
            {
                var groupExp = (exp as GroupExpression);
                x += CountStrings(groupExp.Expression, 0);
            }

            return(x);
        }
        private RegexExpression Expression()
        {
            RegexExpression exp = null;

            switch (_currentToken.TokenType)
            {
            case RegexTokenType.LeftParenthesis:
                Match(RegexTokenType.LeftParenthesis);
                var statement = ExpressionSeq();
                Match(RegexTokenType.RightParenthesis);
                exp = new GroupExpression(statement);
                break;

            default:
                exp = Char();
                break;
            }

            exp.Quantifier = Quantifier();

            return(exp);
        }
        private string[] CompileToLiterals(RegexExpression exp, string seed = "")
        {
            if (exp is BinaryExpression)
            {
                var binExp = exp as BinaryExpression;

                string[] leftLiterals = CompileToLiterals(binExp.Left),
                rightLiterals = CompileToLiterals(binExp.Right);

                if (rightLiterals != null)
                {
                    var combinedStrings = leftLiterals.SelectMany(x => rightLiterals.Select(y => x + y));

                    if (binExp.Operator == RegexTokenType.OrOperator)
                    {
                        return(leftLiterals.Concat(rightLiterals).ToArray());
                    }
                    else
                    {
                        return(combinedStrings.ToArray());
                    }
                }
                else
                {
                    return(leftLiterals);
                }
            }
            else if (exp is GroupExpression)
            {
                var groupExp = exp as GroupExpression;

                var literals = CompileToLiterals(groupExp.Expression, seed);

                if (groupExp.Quantifier == RegexTokenType.ZeroOrOneQuantifier)
                {
                    return(literals.Concat(new[] { "" }).ToArray());
                }
                else if (groupExp.Quantifier != RegexTokenType.None)
                {
                    throw new InvalidOperationException(
                              string.Format("Unsupported quantifier: {0}", groupExp.Quantifier));
                }

                return(literals);
            }
            else if (exp is CharExpression)
            {
                var charExp = exp as CharExpression;

                if (charExp.Quantifier == RegexTokenType.None)
                {
                    return(new string[] { seed + charExp.Char });
                }
                else
                {
                    throw new InvalidOperationException(
                              string.Format("Unsupported quantifier: {0}", charExp.Quantifier));
                }
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
 public RegexCompiler(RegexExpression expression)
 {
     _expression = expression;
 }
 public BinaryExpression(RegexExpression left, RegexTokenType op, RegexExpression right)
 {
     Left     = left;
     Operator = op;
     Right    = right;
 }
Exemple #6
0
 public GroupExpression(RegexExpression expression)
 {
     Expression = expression;
 }