7 #include <stdair/stdair_exceptions.hpp>
8 #include <stdair/stdair_types.hpp>
9 #include <stdair/bom/BomRoot.hpp>
10 #include <stdair/service/Logger.hpp>
17 namespace bsc = boost::spirit::classic;
21 namespace ScheduleParserHelper {
29 : _flightPeriod (ioFlightPeriod) {
41 const stdair::AirlineCode_T lAirlineCode (iStr, iStrEnd);
87 const stdair::DateOffset_T oneDay (1);
111 stdair::DOW_String_T lDow (iStr, iStrEnd);
124 stdair::AirportCode_T lBoardingPoint (iStr, iStrEnd);
153 stdair::AirportCode_T lOffPoint (iStr, iStrEnd);
169 const stdair::AirlineCode_T lAirlineCode (iStr, iStrEnd);
170 if (lAirlineCode.size() == 2) {
314 stdair::AirportCode_T lBoardingPoint (iStr, iStrEnd);
327 stdair::AirportCode_T lOffPoint (iStr, iStrEnd);
351 std::string lClasses (iStr, iStrEnd);
375 std::ostringstream ostr;
389 const std::string lKey (iStr, iStrEnd);
403 const std::string lKey (iStr, iStrEnd);
416 std::string lClasses (iStr, iStrEnd);
439 _bomRoot (ioBomRoot) {
531 : _bomRoot (ioBomRoot),
532 _flightPeriod (ioFlightPeriod) {
536 template<
typename ScannerT>
540 flight_period_list = *( not_to_be_parsed | flight_period )
544 bsc::lexeme_d[ bsc::comment_p(
"//") | bsc::comment_p(
"/*",
"*/")
548 flight_period = flight_key
550 >>
';' >> segment_section
551 >> flight_period_end[
doEndFlight (
self._bomRoot,
self._flightPeriod)]
554 flight_period_end = bsc::ch_p(
';')
557 flight_key = airline_code
558 >>
';' >> flight_number
561 >>
';' >> dow[
storeDow(
self._flightPeriod)]
573 bsc::lexeme_d[(
year_p)[bsc::assign_a(
self._flightPeriod._itYear)]
574 >>
'-' >> (
month_p)[bsc::assign_a(
self._flightPeriod._itMonth)]
575 >>
'-' >> (
day_p)[bsc::assign_a(
self._flightPeriod._itDay)]]
578 dow = bsc::lexeme_d[
dow_p ]
581 leg = !( operating_leg_details >>
';' )
583 >>
';' >> leg_details
584 >> +(
';' >> leg_cabin_details )
592 operating_leg_details =
609 bsc::lexeme_d[(
hours_p)[bsc::assign_a(
self._flightPeriod._itHours)]
610 >>
':' >> (
minutes_p)[bsc::assign_a(
self._flightPeriod._itMinutes)]
611 >> !(
':' >> (
seconds_p)[bsc::assign_a(
self._flightPeriod._itSeconds)])]
616 >> (
int1_p)[bsc::assign_a(
self._flightPeriod._dateOffset)]
631 generic_segment | specific_segment_list
636 >> +(
';' >> segment_cabin_details)
639 specific_segment_list =
641 >> +(
';' >> segment_key >> full_segment_cabin_details)
644 full_segment_cabin_details =
645 +(
';' >> segment_cabin_details)
648 segment_cabin_details =
651 >> +(
';' >> family_cabin_details)
654 family_cabin_details =
665 BOOST_SPIRIT_DEBUG_NODE (flight_period_list);
666 BOOST_SPIRIT_DEBUG_NODE (not_to_be_parsed);
667 BOOST_SPIRIT_DEBUG_NODE (flight_period);
668 BOOST_SPIRIT_DEBUG_NODE (flight_period_end);
669 BOOST_SPIRIT_DEBUG_NODE (flight_key);
670 BOOST_SPIRIT_DEBUG_NODE (airline_code);
671 BOOST_SPIRIT_DEBUG_NODE (flight_number);
672 BOOST_SPIRIT_DEBUG_NODE (date);
673 BOOST_SPIRIT_DEBUG_NODE (dow);
674 BOOST_SPIRIT_DEBUG_NODE (leg);
675 BOOST_SPIRIT_DEBUG_NODE (leg_key);
676 BOOST_SPIRIT_DEBUG_NODE (leg_details);
677 BOOST_SPIRIT_DEBUG_NODE (time);
678 BOOST_SPIRIT_DEBUG_NODE (date_offset);
679 BOOST_SPIRIT_DEBUG_NODE (leg_cabin_details);
680 BOOST_SPIRIT_DEBUG_NODE (segment_section);
681 BOOST_SPIRIT_DEBUG_NODE (segment_key);
682 BOOST_SPIRIT_DEBUG_NODE (generic_segment);
683 BOOST_SPIRIT_DEBUG_NODE (specific_segment_list);
684 BOOST_SPIRIT_DEBUG_NODE (full_segment_cabin_details);
685 BOOST_SPIRIT_DEBUG_NODE (segment_cabin_details);
686 BOOST_SPIRIT_DEBUG_NODE (family_cabin_details);
690 template<
typename ScannerT>
691 bsc::rule<ScannerT>
const&
693 return flight_period_list;
707 const stdair::Filename_T& iFilename)
708 : _filename (iFilename), _bomRoot (ioBomRoot) {
713 void FlightPeriodFileParser::init() {
718 if (!_startIterator) {
719 std::ostringstream oMessage;
720 oMessage <<
"The file " << _filename <<
" can not be open." << std::endl;
721 STDAIR_LOG_ERROR (oMessage.str());
726 _endIterator = _startIterator.make_end();
731 bool oResult =
false;
733 STDAIR_LOG_DEBUG (
"Parsing schedule input file: " << _filename);
741 bsc::parse_info<iterator_t> info = bsc::parse (_startIterator, _endIterator,
743 bsc::space_p - bsc::eol_p);
748 const bool isFull = info.full;
750 const std::string hasBeenFullyReadStr = (isFull ==
true)?
"":
"not ";
751 if (oResult ==
true && isFull ==
true) {
752 STDAIR_LOG_DEBUG (
"Parsing of schedule input file: " << _filename
753 <<
" succeeded: read " << info.length
754 <<
" characters. The input file has "
755 << hasBeenFullyReadStr
756 <<
"been fully read. Stop point: " << info.stop);
759 STDAIR_LOG_ERROR (
"Parsing of schedule input file: " << _filename
760 <<
" failed: read " << info.length
761 <<
" characters. The input file has "
762 << hasBeenFullyReadStr
763 <<
"been fully read. Stop point: " << info.stop);
765 + _filename +
" failed.");
stdair::CurveKey_T _frat5CurveKey
FlightPeriodFileParser(stdair::BomRoot &ioBomRoot, const stdair::Filename_T &iFilename)
stdair::DateOffset_T _offDateOffset
stdair::AirlineCode_T _airlineCode
stdair::Duration_T _elapsed
void operator()(iterator_t iStr, iterator_t iStrEnd) const
boost::spirit::classic::uint_parser< unsigned int, 10, 1, 4 > uint1_4_p_t
storeElapsedTime(FlightPeriodStruct &)
void operator()(char iChar) const
storeDateRangeStart(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
bounded2_p_t seconds_p(uint2_p.derived(), 0u, 59u)
boost::spirit::classic::rule< ScannerT > const & start() const
bounded2_p_t month_p(uint2_p.derived(), 1u, 12u)
repeat_p_t airline_code_p(chset_t("0-9A-Z").derived(), 2, 3)
boost::spirit::classic::bounded< uint1_4_p_t, unsigned int > bounded1_4_p_t
stdair::BomRoot & _bomRoot
chset_t cabin_code_p("A-Z")
storeFFDisutilityCurveKey(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeDateRangeEnd(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
LegCabinStructList_T _cabinList
boost::spirit::classic::impl::loop_traits< chset_t, unsigned int, unsigned int >::type repeat_p_t
stdair::Duration_T getTime() const
stdair::AirportCode_T _boardingPoint
storeClasses(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
SegmentCabinStruct _itSegmentCabin
boost::spirit::classic::chset< char_t > chset_t
storeSegmentOffPoint(FlightPeriodStruct &)
storeFamilyCode(FlightPeriodStruct &)
const std::string describe() const
void operator()(int iCode) const
void addAirport(const stdair::AirportCode_T &)
stdair::Date_T getDate() const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
AirportOrderedList_T _airportOrderedList
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeAirlineCode(FlightPeriodStruct &)
storeLegCabinCode(FlightPeriodStruct &)
stdair::AirportCode_T _offPoint
repeat_p_t airport_p(chset_t("0-9A-Z").derived(), 3, 3)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
stdair::Date_T _dateRangeStart
storeDow(FlightPeriodStruct &)
stdair::Duration_T _offTime
stdair::CabinCapacity_T _saleableCapacity
FlightPeriodStruct & _flightPeriod
stdair::CurveKey_T _ffDisutilityCurveKey
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(char iChar) const
void operator()(char iChar) const
stdair::FlightNumber_T _flightNumber
stdair::AirportCode_T _boardingPoint
boost::spirit::classic::bounded< uint4_p_t, unsigned int > bounded4_p_t
bounded1_4_p_t flight_number_p(uint1_4_p.derived(), 0u, 9999u)
AirportList_T _airportList
definition(FlightPeriodParser const &self)
stdair::CabinCode_T _cabinCode
stdair::DatePeriod_T _dateRange
stdair::AirlineCode_T _airlineCode
storeBoardingTime(FlightPeriodStruct &)
repeat_p_t key_p(chset_t("0-9A-Z").derived(), 1, 10)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(unsigned int iNumber) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
stdair::Date_T _dateRangeEnd
bounded2_p_t minutes_p(uint2_p.derived(), 0u, 59u)
storeOperatingFlightNumber(FlightPeriodStruct &)
void addFareFamily(const SegmentStruct &, const SegmentCabinStruct &, const FareFamilyStruct &)
boost::spirit::classic::file_iterator< char_t > iterator_t
storeCapacity(FlightPeriodStruct &)
stdair::AirportCode_T _offPoint
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeSegmentSpecificity(FlightPeriodStruct &)
repeat_p_t dow_p(chset_t("0-1").derived().derived(), 7, 7)
boost::spirit::classic::uint_parser< unsigned int, 10, 2, 2 > uint2_p_t
FlightPeriodParser(stdair::BomRoot &, FlightPeriodStruct &)
stdair::Duration_T _boardingTime
void addSegmentCabin(const SegmentStruct &, const SegmentCabinStruct &)
storeLegBoardingPoint(FlightPeriodStruct &)
boost::spirit::classic::bounded< uint2_p_t, unsigned int > bounded2_p_t
stdair::ClassList_String_T _classes
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(double iReal) const
boost::spirit::classic::uint_parser< unsigned int, 10, 4, 4 > uint4_p_t
storeOffTime(FlightPeriodStruct &)
bounded4_p_t year_p(uint4_p.derived(), 2000u, 2099u)
storeFRAT5CurveKey(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeOperatingAirlineCode(FlightPeriodStruct &)
void operator()(unsigned int iNumber) const
storeSegmentBoardingPoint(FlightPeriodStruct &)
bool generateInventories()
storeFClasses(FlightPeriodStruct &)
FareFamilyStruct _itFareFamily
stdair::FlightNumber_T _flightNumber
repeat_p_t class_code_list_p(chset_t("A-Z").derived(), 1, 26)
storeFlightNumber(FlightPeriodStruct &)
doEndFlight(stdair::BomRoot &, FlightPeriodStruct &)
Utility Structure for the parsing of fare family details.
LegCabinStruct _itLegCabin
boost::spirit::classic::int_parser< unsigned int, 10, 1, 1 > int1_p_t
bounded2_p_t day_p(uint2_p.derived(), 1u, 31u)
stdair::CabinCode_T _cabinCode
stdair::DateOffset_T _boardingDateOffset
bounded2_p_t hours_p(uint2_p.derived(), 0u, 23u)
ParserSemanticAction(FlightPeriodStruct &)
storeSegmentCabinCode(FlightPeriodStruct &)
stdair::FamilyCode_T _familyCode
bool _areSegmentDefinitionsSpecific
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeLegOffPoint(FlightPeriodStruct &)