AirSched Logo  0.1.4
C++ Simulated Airline Schedule Manager Library
ScheduleParserHelper.hpp
Go to the documentation of this file.
00001 #ifndef __AIRSCHED_CMD_SCHEDULEPARSERHELPER_HPP
00002 #define __AIRSCHED_CMD_SCHEDULEPARSERHELPER_HPP
00003 
00004 // //////////////////////////////////////////////////////////////////////
00005 // Import section
00006 // //////////////////////////////////////////////////////////////////////
00007 // STL
00008 #include <string>
00009 // StdAir
00010 #include <stdair/command/CmdAbstract.hpp>
00011 // AirSched
00012 #include <airsched/AIRSCHED_Types.hpp>
00013 #include <airsched/basic/BasParserTypes.hpp>
00014 #include <airsched/bom/FlightPeriodStruct.hpp>
00015 
00016 // Forward declarations
00017 namespace stdair {
00018   class BomRoot;
00019 }
00020 
00021 namespace AIRSCHED {
00022 
00023   namespace ScheduleParserHelper {
00024     
00025     // ///////////////////////////////////////////////////////////////////
00026     //  Semantic actions
00027     // ///////////////////////////////////////////////////////////////////
00029     struct ParserSemanticAction {
00031       ParserSemanticAction (FlightPeriodStruct&);
00033       FlightPeriodStruct& _flightPeriod;
00034     };
00035       
00037     struct storeAirlineCode : public ParserSemanticAction {
00039       storeAirlineCode (FlightPeriodStruct&);
00041       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00042     };
00043   
00045     struct storeFlightNumber : public ParserSemanticAction {
00047       storeFlightNumber (FlightPeriodStruct&);
00049       void operator() (unsigned int iNumber) const;
00050     };
00051   
00053     struct storeDateRangeStart : public ParserSemanticAction {
00055       storeDateRangeStart (FlightPeriodStruct&);
00057       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00058     };
00059 
00061     struct storeDateRangeEnd : public ParserSemanticAction {
00063       storeDateRangeEnd (FlightPeriodStruct&);
00065       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00066     };
00067 
00069     struct storeDow : public ParserSemanticAction {
00071       storeDow (FlightPeriodStruct&);
00073       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00074     };
00075 
00077     struct storeLegBoardingPoint : public ParserSemanticAction {
00079       storeLegBoardingPoint (FlightPeriodStruct&);
00081       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00082     };
00083   
00085     struct storeLegOffPoint : public ParserSemanticAction {
00087       storeLegOffPoint (FlightPeriodStruct&);
00089       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00090     };
00091 
00093     struct storeBoardingTime : public ParserSemanticAction {
00095       storeBoardingTime (FlightPeriodStruct&);
00097       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00098     };
00099 
00101     struct storeOffTime : public ParserSemanticAction {
00103       storeOffTime (FlightPeriodStruct&);
00105       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00106     };
00107 
00109     struct storeElapsedTime : public ParserSemanticAction {
00111       storeElapsedTime (FlightPeriodStruct&);
00113       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00114     };
00115 
00117     struct storeLegCabinCode : public ParserSemanticAction {
00119       storeLegCabinCode (FlightPeriodStruct&);
00121       void operator() (char iChar) const;
00122     };
00123   
00125     struct storeCapacity : public ParserSemanticAction {
00127       storeCapacity (FlightPeriodStruct&);
00129       void operator() (double iReal) const;
00130     };
00131   
00136     struct storeSegmentSpecificity : public ParserSemanticAction {
00138       storeSegmentSpecificity (FlightPeriodStruct&);
00140       void operator() (char iChar) const;
00141     };
00142   
00144     struct storeSegmentBoardingPoint : public ParserSemanticAction {
00146       storeSegmentBoardingPoint (FlightPeriodStruct&);
00148       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00149     };
00150   
00152     struct storeSegmentOffPoint : public ParserSemanticAction {
00154       storeSegmentOffPoint (FlightPeriodStruct&);
00156       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00157     };
00158 
00160     struct storeSegmentCabinCode : public ParserSemanticAction {
00162       storeSegmentCabinCode (FlightPeriodStruct&);
00164       void operator() (char iChar) const;
00165     };
00166   
00168     struct storeClasses : public ParserSemanticAction {
00170       storeClasses (FlightPeriodStruct&);
00172       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00173     };
00174 
00176     struct storeFamilyCode : public ParserSemanticAction {
00178       storeFamilyCode (FlightPeriodStruct&);
00180       void operator() (int iCode) const;
00181     };
00182 
00184     struct storeFClasses : public ParserSemanticAction {
00186       storeFClasses (FlightPeriodStruct&);
00188       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00189     };
00190       
00192     struct doEndFlight : public ParserSemanticAction {
00194       doEndFlight (stdair::BomRoot&, FlightPeriodStruct&);
00196       void operator() (iterator_t iStr, iterator_t iStrEnd) const;
00198       stdair::BomRoot& _bomRoot;
00199     };
00200   
00201 
00203     //
00204     //  (Boost Spirit) Grammar Definition
00205     //
00207 
00249     struct FlightPeriodParser : 
00250       public boost::spirit::classic::grammar<FlightPeriodParser> {
00251 
00252       FlightPeriodParser (stdair::BomRoot&, FlightPeriodStruct&);
00253 
00254       template <typename ScannerT>
00255       struct definition {
00256         definition (FlightPeriodParser const& self);
00257 
00258         // Instantiation of rules
00259         boost::spirit::classic::rule<ScannerT> flight_period_list, flight_period,
00260           not_to_be_parsed, flight_period_end, flight_key, airline_code,
00261           flight_number, date, dow, time, date_offset,
00262           leg, leg_key, leg_details, leg_cabin_details,
00263           segment_section, segment_key, full_segment_cabin_details,
00264           segment_cabin_details, full_family_cabin_details,
00265           family_cabin_details, generic_segment, specific_segment_list;
00266 
00268         boost::spirit::classic::rule<ScannerT> const& start() const;
00269       };
00270 
00271       // Parser Context
00272       stdair::BomRoot& _bomRoot;
00273       FlightPeriodStruct& _flightPeriod;
00274     };
00275 
00276   }
00281 
00282   //
00283   //  Entry class for the file parser
00284   //
00286 
00291   class FlightPeriodFileParser : public stdair::CmdAbstract {
00292   public:
00294     FlightPeriodFileParser (stdair::BomRoot& ioBomRoot,
00295                             const stdair::Filename_T& iFilename);
00296 
00298     bool generateInventories ();
00299       
00300   private:
00302     void init();
00303       
00304   private:
00305     // Attributes
00307     stdair::Filename_T _filename;
00308 
00310     iterator_t _startIterator;
00311       
00313     iterator_t _endIterator;
00314       
00316     stdair::BomRoot& _bomRoot;
00317 
00319     FlightPeriodStruct _flightPeriod;
00320   };
00321     
00322 }
00323 #endif // __AIRSCHED_CMD_SCHEDULEPARSERHELPER_HPP