Beispiel #1
0
        private IParseResult <ExpressionMetaData> TryGetConcatenationExpression(ITokenStream tokenStream, out IExpression expression)
        {
            expression = null;
            var concatExpression = new ConcatenationExpression(_random);

            var elementaryExpressionResult = TryGetElementaryExpression(tokenStream, out var elementaryExpression);

            if (!elementaryExpressionResult.IsSuccess)
            {
                return(elementaryExpressionResult);
            }

            var metaData = elementaryExpressionResult.Value;

            elementaryExpression.RepeatRange = GetRepeatConcatenationInterval(tokenStream);
            concatExpression.Append(elementaryExpression);

            var result = TryGetElementaryExpression(tokenStream, out elementaryExpression);

            while (result.IsSuccess)
            {
                metaData.UpdateWith(result.Value);
                elementaryExpression.RepeatRange = GetRepeatConcatenationInterval(tokenStream);
                concatExpression.Append(elementaryExpression);
                result = TryGetElementaryExpression(tokenStream, out elementaryExpression);
            }

            if (result.ErrorType != RegSeedErrorType.None)
            {
                return(result);
            }

            expression = concatExpression;
            return(new SuccessParseResult <ExpressionMetaData>(tokenStream.CurrentPosition, metaData));
        }
Beispiel #2
0
        public override IExpression Clone()
        {
            var clone = new ConcatenationExpression(_random)
            {
                RepeatRange     = RepeatRange?.Clone(),
                ExpansionLength = ExpansionLength
            };

            clone.AppendRange(_elementaryExpressions.Select(x => x.Clone()));

            return(clone);
        }
Beispiel #3
0
        private ConcatenationExpression GetInverseOfExpandedConcatForPosition(List <IExpression> expandedConcatRepresentation, int i)
        {
            var predecessorRange = expandedConcatRepresentation.GetRange(0, i);
            var inverse          = expandedConcatRepresentation[i].GetInverse();
            var successorRange   = expandedConcatRepresentation.GetRange(i + 1, expandedConcatRepresentation.Count - i - 1);

            var concatExpression = new ConcatenationExpression(_random);

            concatExpression.AppendRange(predecessorRange)
            .Append(inverse)
            .AppendRange(successorRange);
            return(concatExpression);
        }