7 #include <stdair/stdair_exceptions.hpp>
8 #include <stdair/bom/BomRoot.hpp>
9 #include <stdair/service/Logger.hpp>
16 namespace bsc = boost::spirit::classic;
20 namespace ScheduleParserHelper {
28 : _flightPeriod (ioFlightPeriod) {
40 const stdair::AirlineCode_T lAirlineCode (iStr, iStrEnd);
86 const stdair::DateOffset_T oneDay (1);
105 stdair::DOW_String_T lDow (iStr, iStrEnd);
118 stdair::AirportCode_T lBoardingPoint (iStr, iStrEnd);
147 stdair::AirportCode_T lOffPoint (iStr, iStrEnd);
280 stdair::AirportCode_T lBoardingPoint (iStr, iStrEnd);
293 stdair::AirportCode_T lOffPoint (iStr, iStrEnd);
317 std::string lClasses (iStr, iStrEnd);
341 std::ostringstream ostr;
355 std::string lClasses (iStr, iStrEnd);
379 _bomRoot (ioBomRoot) {
468 : _bomRoot (ioBomRoot),
469 _flightPeriod (ioFlightPeriod) {
473 template<
typename ScannerT>
477 flight_period_list = *( not_to_be_parsed | flight_period )
481 bsc::lexeme_d[ bsc::comment_p(
"//") | bsc::comment_p(
"/*",
"*/")
485 flight_period = flight_key
487 >>
';' >> segment_section
488 >> flight_period_end[
doEndFlight (
self._bomRoot,
self._flightPeriod)]
491 flight_period_end = bsc::ch_p(
';')
494 flight_key = airline_code
495 >>
';' >> flight_number
498 >>
';' >> dow[
storeDow(
self._flightPeriod)]
510 bsc::lexeme_d[(
year_p)[bsc::assign_a(
self._flightPeriod._itYear)]
511 >>
'-' >> (
month_p)[bsc::assign_a(
self._flightPeriod._itMonth)]
512 >>
'-' >> (
day_p)[bsc::assign_a(
self._flightPeriod._itDay)]]
515 dow = bsc::lexeme_d[
dow_p ]
518 leg = leg_key >>
';' >> leg_details >> +(
';' >> leg_cabin_details )
538 bsc::lexeme_d[(
hours_p)[bsc::assign_a(
self._flightPeriod._itHours)]
539 >>
':' >> (
minutes_p)[bsc::assign_a(
self._flightPeriod._itMinutes)]
540 >> !(
':' >> (
seconds_p)[bsc::assign_a(
self._flightPeriod._itSeconds)])]
545 >> (
int1_p)[bsc::assign_a(
self._flightPeriod._dateOffset)]
560 generic_segment | specific_segment_list
565 >> +(
';' >> segment_cabin_details)
568 specific_segment_list =
570 >> +(
';' >> segment_key >> full_segment_cabin_details)
573 full_segment_cabin_details =
574 +(
';' >> segment_cabin_details)
577 segment_cabin_details =
580 >> +(
';' >> family_cabin_details)
583 family_cabin_details =
590 BOOST_SPIRIT_DEBUG_NODE (flight_period_list);
591 BOOST_SPIRIT_DEBUG_NODE (not_to_be_parsed);
592 BOOST_SPIRIT_DEBUG_NODE (flight_period);
593 BOOST_SPIRIT_DEBUG_NODE (flight_period_end);
594 BOOST_SPIRIT_DEBUG_NODE (flight_key);
595 BOOST_SPIRIT_DEBUG_NODE (airline_code);
596 BOOST_SPIRIT_DEBUG_NODE (flight_number);
597 BOOST_SPIRIT_DEBUG_NODE (date);
598 BOOST_SPIRIT_DEBUG_NODE (dow);
599 BOOST_SPIRIT_DEBUG_NODE (leg);
600 BOOST_SPIRIT_DEBUG_NODE (leg_key);
601 BOOST_SPIRIT_DEBUG_NODE (leg_details);
602 BOOST_SPIRIT_DEBUG_NODE (time);
603 BOOST_SPIRIT_DEBUG_NODE (date_offset);
604 BOOST_SPIRIT_DEBUG_NODE (leg_cabin_details);
605 BOOST_SPIRIT_DEBUG_NODE (segment_section);
606 BOOST_SPIRIT_DEBUG_NODE (segment_key);
607 BOOST_SPIRIT_DEBUG_NODE (generic_segment);
608 BOOST_SPIRIT_DEBUG_NODE (specific_segment_list);
609 BOOST_SPIRIT_DEBUG_NODE (full_segment_cabin_details);
610 BOOST_SPIRIT_DEBUG_NODE (segment_cabin_details);
611 BOOST_SPIRIT_DEBUG_NODE (family_cabin_details);
615 template<
typename ScannerT>
616 bsc::rule<ScannerT>
const&
618 return flight_period_list;
632 const stdair::Filename_T& iFilename)
633 : _filename (iFilename), _bomRoot (ioBomRoot) {
638 void FlightPeriodFileParser::init() {
643 if (!_startIterator) {
644 std::ostringstream oMessage;
645 oMessage <<
"The file " << _filename <<
" can not be open." << std::endl;
646 STDAIR_LOG_ERROR (oMessage.str());
651 _endIterator = _startIterator.make_end();
656 bool oResult =
false;
658 STDAIR_LOG_DEBUG (
"Parsing schedule input file: " << _filename);
666 bsc::parse_info<iterator_t> info = bsc::parse (_startIterator, _endIterator,
668 bsc::space_p - bsc::eol_p);
673 const bool isFull = info.full;
675 const std::string hasBeenFullyReadStr = (isFull ==
true)?
"":
"not ";
676 if (oResult ==
true && isFull ==
true) {
677 STDAIR_LOG_DEBUG (
"Parsing of schedule input file: " << _filename
678 <<
" succeeded: read " << info.length
679 <<
" characters. The input file has "
680 << hasBeenFullyReadStr
681 <<
"been fully read. Stop point: " << info.stop);
684 STDAIR_LOG_ERROR (
"Parsing of schedule input file: " << _filename
685 <<
" failed: read " << info.length
686 <<
" characters. The input file has "
687 << hasBeenFullyReadStr
688 <<
"been fully read. Stop point: " << info.stop);
690 + _filename +
" failed.");