7 #include <stdair/basic/BasFileMgr.hpp> 8 #include <stdair/bom/BomRoot.hpp> 9 #include <stdair/service/Logger.hpp> 19 namespace ScheduleParserHelper {
27 : _flightPeriod (ioFlightPeriod) {
39 const stdair::AirlineCode_T lAirlineCode (iStr, iStrEnd);
87 const stdair::DateOffset_T oneDay (1);
110 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) {
315 stdair::AirportCode_T lBoardingPoint (iStr, iStrEnd);
328 stdair::AirportCode_T lOffPoint (iStr, iStrEnd);
352 std::string lClasses (iStr, iStrEnd);
376 std::ostringstream ostr;
390 const std::string lKey (iStr, iStrEnd);
404 const std::string lKey (iStr, iStrEnd);
417 std::string lClasses (iStr, iStrEnd);
443 _bomRoot (ioBomRoot) {
540 template<
typename ScannerT>
544 flight_period_list = *(not_to_be_parsed
548 not_to_be_parsed =bsc::
549 lexeme_d[bsc::comment_p(
"//") |bsc::comment_p(
"/*",
"*/")
552 flight_period = flight_key
554 >>
';' >> segment_section
562 flight_key = airline_code
563 >>
';' >> flight_number
586 dow =bsc::lexeme_d[
dow_p ]
589 leg = !( operating_leg_details >>
';' )
591 >>
';' >> leg_details
592 >> +(
';' >> leg_cabin_details )
600 operating_leg_details =
625 date_offset =bsc::ch_p(
'/')
640 generic_segment | specific_segment_list
643 generic_segment =bsc::
645 >> +(
';' >> segment_cabin_details)
648 specific_segment_list =bsc::
650 >> +(
';' >> segment_key >> full_segment_cabin_details)
653 full_segment_cabin_details =
654 +(
';' >> segment_cabin_details)
657 segment_cabin_details =
660 >> *(
';' >> family_cabin_details)
663 family_cabin_details =
674 BOOST_SPIRIT_DEBUG_NODE (flight_period_list);
675 BOOST_SPIRIT_DEBUG_NODE (flight_period);
676 BOOST_SPIRIT_DEBUG_NODE (not_to_be_parsed);
677 BOOST_SPIRIT_DEBUG_NODE (flight_period_end);
678 BOOST_SPIRIT_DEBUG_NODE (flight_key);
679 BOOST_SPIRIT_DEBUG_NODE (airline_code);
680 BOOST_SPIRIT_DEBUG_NODE (flight_number);
681 BOOST_SPIRIT_DEBUG_NODE (date);
682 BOOST_SPIRIT_DEBUG_NODE (dow);
683 BOOST_SPIRIT_DEBUG_NODE (leg);
684 BOOST_SPIRIT_DEBUG_NODE (leg_key);
685 BOOST_SPIRIT_DEBUG_NODE (leg_details);
686 BOOST_SPIRIT_DEBUG_NODE (time);
687 BOOST_SPIRIT_DEBUG_NODE (date_offset);
688 BOOST_SPIRIT_DEBUG_NODE (leg_cabin_details);
689 BOOST_SPIRIT_DEBUG_NODE (segment_section);
690 BOOST_SPIRIT_DEBUG_NODE (segment_key);
691 BOOST_SPIRIT_DEBUG_NODE (generic_segment);
692 BOOST_SPIRIT_DEBUG_NODE (specific_segment_list);
693 BOOST_SPIRIT_DEBUG_NODE (full_segment_cabin_details);
694 BOOST_SPIRIT_DEBUG_NODE (segment_cabin_details);
695 BOOST_SPIRIT_DEBUG_NODE (family_cabin_details);
699 template<
typename ScannerT>
700 bsc::rule<ScannerT>
const&
702 return flight_period_list;
717 const stdair::Filename_T& iFilename)
718 : _filename (iFilename),
_bomRoot (ioBomRoot) {
723 void FlightPeriodFileParser::init() {
725 const bool doesExistAndIsReadable =
726 stdair::BasFileMgr::doesExistAndIsReadable (_filename);
728 if (doesExistAndIsReadable ==
false) {
729 STDAIR_LOG_ERROR (
"The schedule file " << _filename
730 <<
" does not exist or can not be read.");
733 +
" does not exist or can not be read");
740 if (!_startIterator) {
741 STDAIR_LOG_ERROR (
"The schedule file " << _filename <<
" can not be open." 745 +
" does not exist or can not be read");
749 _endIterator = _startIterator.make_end();
754 bool oResult =
false;
756 STDAIR_LOG_DEBUG (
"Parsing schedule input file: " << _filename);
765 bsc::parse_info<iterator_t> info =
766 bsc::parse (_startIterator, _endIterator, lFPParser,
767 bsc::space_p - bsc::eol_p);
772 const std::string hasBeenFullyReadStr = (info.full ==
true)?
"":
"not ";
773 if (oResult ==
true) {
774 STDAIR_LOG_DEBUG (
"Parsing of schedule input file: " << _filename
775 <<
" succeeded: read " << info.length
776 <<
" characters. The input file has " 777 << hasBeenFullyReadStr
778 <<
"been fully read. Stop point: " << info.stop);
782 STDAIR_LOG_ERROR (
"Parsing of schedule input file: " << _filename
783 <<
" failed: read " << info.length
784 <<
" characters. The input file has " 785 << hasBeenFullyReadStr
786 <<
"been fully read. Stop point: " << info.stop);
stdair::CabinCode_T _cabinCode
storeFRAT5CurveKey(FlightPeriodStruct &)
stdair::CurveKey_T _itFRAT5CurveKey
FlightPeriodParser(stdair::BomRoot &, FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
repeat_p_t key_p(chset_t("0-9A-Z").derived(), 1, 10)
storeElapsedTime(FlightPeriodStruct &)
stdair::BomRoot & _bomRoot
boost::spirit::classic::uint_parser< unsigned int, 10, 1, 4 > uint1_4_p_t
void operator()(double iReal) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(char iChar) const
LegCabinStructList_T _cabinList
void operator()(iterator_t iStr, iterator_t iStrEnd) const
stdair::Duration_T _boardingTime
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeDateRangeEnd(FlightPeriodStruct &)
boost::spirit::classic::chset< char_t > chset_t
storeBoardingTime(FlightPeriodStruct &)
storeSegmentBoardingPoint(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
LegCabinStruct _itLegCabin
storeDow(FlightPeriodStruct &)
repeat_p_t airport_p(chset_t("0-9A-Z").derived(), 3, 3)
boost::spirit::classic::uint_parser< unsigned int, 10, 2, 2 > uint2_p_t
void addFareFamily(const SegmentStruct &, const SegmentCabinStruct &, const FareFamilyStruct &)
stdair::DatePeriod_T _dateRange
storeFamilyCode(FlightPeriodStruct &)
bool generateInventories()
FlightPeriodStruct & _flightPeriod
FlightPeriodFileParser(stdair::BomRoot &ioBomRoot, const stdair::Filename_T &iFilename)
stdair::AirportCode_T _offPoint
stdair::Date_T _dateRangeStart
FlightPeriodStruct & _flightPeriod
storeAirlineCode(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeCapacity(FlightPeriodStruct &)
storeOperatingFlightNumber(FlightPeriodStruct &)
chset_t cabin_code_p("A-Z")
boost::spirit::classic::file_iterator< char_t > iterator_t
stdair::Duration_T _elapsed
storeSegmentOffPoint(FlightPeriodStruct &)
SegmentCabinStruct _itSegmentCabin
AirportList_T _airportList
boost::spirit::classic::bounded< uint1_4_p_t, unsigned int > bounded1_4_p_t
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void addAirport(const stdair::AirportCode_T &)
storeLegOffPoint(FlightPeriodStruct &)
void operator()(char iChar) const
stdair::CabinCapacity_T _capacity
storeFlightNumber(FlightPeriodStruct &)
stdair::FlightNumber_T _flightNumber
stdair::AirlineCode_T _airlineCode
storeOperatingAirlineCode(FlightPeriodStruct &)
const std::string describe() const
bounded2_p_t hours_p(uint2_p.derived(), 0u, 23u)
stdair::Date_T getDate() const
stdair::AirportCode_T _boardingPoint
definition(FlightPeriodParser const &self)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
bounded2_p_t minutes_p(uint2_p.derived(), 0u, 59u)
doEndFlight(stdair::BomRoot &, FlightPeriodStruct &)
stdair::ClassList_String_T _classes
stdair::CurveKey_T _itFFDisutilityCurveKey
boost::spirit::classic::rule< ScannerT > const & start() const
bounded2_p_t seconds_p(uint2_p.derived(), 0u, 59u)
void operator()(unsigned int iNumber) const
storeOffTime(FlightPeriodStruct &)
stdair::Duration_T getTime() const
bounded1_4_p_t flight_number_p(uint1_4_p.derived(), 0u, 9999u)
ParserSemanticAction(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeLegCabinCode(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
bounded2_p_t month_p(uint2_p.derived(), 1u, 12u)
AirportOrderedList_T _airportOrderedList
stdair::Date_T _dateRangeEnd
storeFFDisutilityCurveKey(FlightPeriodStruct &)
bool _areSegmentDefinitionsSpecific
void operator()(char iChar) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
void operator()(iterator_t iStr, iterator_t iStrEnd) const
storeSegmentSpecificity(FlightPeriodStruct &)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
repeat_p_t airline_code_p(chset_t("0-9A-Z").derived(), 2, 3)
void operator()(iterator_t iStr, iterator_t iStrEnd) const
boost::spirit::classic::impl::loop_traits< chset_t, unsigned int, unsigned int >::type repeat_p_t
repeat_p_t dow_p(chset_t("0-1").derived().derived(), 7, 7)
void operator()(unsigned int iNumber) const
storeClasses(FlightPeriodStruct &)
boost::spirit::classic::bounded< uint2_p_t, unsigned int > bounded2_p_t
stdair::AirlineCode_T _airlineCode
stdair::FamilyCode_T _itFamilyCode
storeSegmentCabinCode(FlightPeriodStruct &)
stdair::AirportCode_T _offPoint
repeat_p_t class_code_list_p(chset_t("A-Z").derived(), 1, 26)
storeLegBoardingPoint(FlightPeriodStruct &)
bounded4_p_t year_p(uint4_p.derived(), 2000u, 2099u)
stdair::Duration_T _offTime
boost::spirit::classic::uint_parser< unsigned int, 10, 4, 4 > uint4_p_t
void operator()(iterator_t iStr, iterator_t iStrEnd) const
boost::spirit::classic::int_parser< unsigned int, 10, 1, 1 > int1_p_t
stdair::AirportCode_T _boardingPoint
stdair::FlightNumber_T _flightNumber
storeFClasses(FlightPeriodStruct &)
storeDateRangeStart(FlightPeriodStruct &)
void operator()(int iCode) const
bounded2_p_t day_p(uint2_p.derived(), 1u, 31u)
stdair::BomRoot & _bomRoot
stdair::DateOffset_T _boardingDateOffset
void operator()(iterator_t iStr, iterator_t iStrEnd) const
stdair::CabinCode_T _cabinCode
void addSegmentCabin(const SegmentStruct &, const SegmentCabinStruct &)
stdair::DateOffset_T _offDateOffset
boost::spirit::classic::bounded< uint4_p_t, unsigned int > bounded4_p_t