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)); }
public override IExpression Clone() { var clone = new ConcatenationExpression(_random) { RepeatRange = RepeatRange?.Clone(), ExpansionLength = ExpansionLength }; clone.AppendRange(_elementaryExpressions.Select(x => x.Clone())); return(clone); }
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); }