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) {
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
554 flight_period_end = bsc::ch_p(
';')
557 flight_key = airline_code
558 >>
';' >> flight_number
578 dow = bsc::lexeme_d[
dow_p ]
581 leg = !( operating_leg_details >>
';' )
583 >>
';' >> leg_details
584 >> +(
';' >> leg_cabin_details )
592 operating_leg_details =
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
boost::spirit::classic::uint_parser< unsigned int, 10, 1, 4 > uint1_4_p_t
storeElapsedTime(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
stdair::Duration_T getTime() const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(unsigned int iNumber) const
storeDateRangeStart(FlightPeriodStruct &)
bounded2_p_t seconds_p(uint2_p.derived(), 0u, 59u)
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
void operator()(char iChar) const
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
FlightPeriodStruct & _flightPeriod
void operator()(char iChar) const
stdair::BomRoot & _bomRoot
stdair::AirportCode_T _boardingPoint
storeClasses(FlightPeriodStruct &)
SegmentCabinStruct _itSegmentCabin
void operator()(iterator_t iStr, iterator_t iStrEnd) const
boost::spirit::classic::chset< char_t > chset_t
storeSegmentOffPoint(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeFamilyCode(FlightPeriodStruct &)
void addAirport(const stdair::AirportCode_T &)
AirportOrderedList_T _airportOrderedList
storeAirlineCode(FlightPeriodStruct &)
storeLegCabinCode(FlightPeriodStruct &)
stdair::AirportCode_T _offPoint
repeat_p_t airport_p(chset_t("0-9A-Z").derived(), 3, 3)
stdair::Date_T _dateRangeStart
storeDow(FlightPeriodStruct &)
stdair::Duration_T _offTime
void operator()(double iReal) const
stdair::CabinCapacity_T _saleableCapacity
FlightPeriodStruct & _flightPeriod
stdair::CurveKey_T _ffDisutilityCurveKey
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)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
AirportList_T _airportList
definition(FlightPeriodParser const &self)
stdair::CabinCode_T _cabinCode
void operator()(iterator_t iStr, iterator_t iStrEnd) const
stdair::DatePeriod_T _dateRange
stdair::AirlineCode_T _airlineCode
storeBoardingTime(FlightPeriodStruct &)
repeat_p_t key_p(chset_t("0-9A-Z").derived(), 1, 10)
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
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 &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
stdair::Duration_T _boardingTime
void addSegmentCabin(const SegmentStruct &, const SegmentCabinStruct &)
boost::spirit::classic::rule< ScannerT > const & start() const
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
boost::spirit::classic::uint_parser< unsigned int, 10, 4, 4 > uint4_p_t
storeOffTime(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
bounded4_p_t year_p(uint4_p.derived(), 2000u, 2099u)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeFRAT5CurveKey(FlightPeriodStruct &)
const std::string describe() const
void operator()(char iChar) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeOperatingAirlineCode(FlightPeriodStruct &)
storeSegmentBoardingPoint(FlightPeriodStruct &)
bool generateInventories()
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeFClasses(FlightPeriodStruct &)
FareFamilyStruct _itFareFamily
stdair::FlightNumber_T _flightNumber
repeat_p_t class_code_list_p(chset_t("A-Z").derived(), 1, 26)
storeFlightNumber(FlightPeriodStruct &)
void operator()(unsigned int iNumber) const
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
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
bounded2_p_t day_p(uint2_p.derived(), 1u, 31u)
stdair::CabinCode_T _cabinCode
stdair::Date_T getDate() const
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()(int iCode) const
storeLegOffPoint(FlightPeriodStruct &)