private static IStep ParseStep(LineReader reader, IStep previousStep) { var stepTitle = reader.CurrentLineTrimmed; if (reader.IsGivenLine) { return(ParseStep(reader, (table, multiLineString) => new GivenStep(stepTitle, table, multiLineString))); } if (reader.IsWhenLine) { return(ParseStep(reader, (table, multiLineString) => new WhenStep(stepTitle, table, multiLineString))); } if (reader.IsThenLine) { return(ParseStep(reader, (table, multiLineString) => new ThenStep(stepTitle, table, multiLineString))); } if (!reader.IsAndLine && !reader.IsButLine) { throw new NotSupportedException( $"Unrecognised step type in line '{reader.CurrentLineTrimmed}'."); } if (previousStep == null) { throw new InvalidGherkinSyntaxException( $"The first step in a scenario cannot start with 'And'. Expected Given, When or Then", reader.CurrentLineNumber); } return(ParseStep(reader, (table, multiLineString) => previousStep.CreateAnother(stepTitle, table, multiLineString))); }