|
From: <gsa...@us...> - 2010-11-19 10:04:09
|
Revision: 159
http://dsim.svn.sourceforge.net/dsim/?rev=159&view=rev
Author: gsabatier
Date: 2010-11-19 10:04:02 +0000 (Fri, 19 Nov 2010)
Log Message:
-----------
[Test/Boost] Parsed the input file at one stroke with Spirit v2
Modified Paths:
--------------
trunk/dsim/test/boost/spiritQi/schedule_parser.cpp
Modified: trunk/dsim/test/boost/spiritQi/schedule_parser.cpp
===================================================================
--- trunk/dsim/test/boost/spiritQi/schedule_parser.cpp 2010-11-16 16:49:57 UTC (rev 158)
+++ trunk/dsim/test/boost/spiritQi/schedule_parser.cpp 2010-11-19 10:04:02 UTC (rev 159)
@@ -5,6 +5,8 @@
#include <fstream>
#include <set>
#include <vector>
+#include <algorithm>
+#include <string>
// Boost (Extended STL)
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
@@ -13,14 +15,17 @@
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
+#include <boost/spirit/include/support_multi_pass.hpp>
+#include <boost/spirit/include/qi_core.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
-#include <boost/spirit/include/support_multi_pass.hpp>
#include <boost/fusion/include/io.hpp>
+#include <boost/spirit/include/classic_position_iterator.hpp>
#include <boost/lambda/lambda.hpp>
-typedef std::string::const_iterator iterator_t;
+typedef std::string::iterator iterator_t;
+
/** LegCabin-Details. */
struct Cabin_T {
// Attributes
@@ -771,7 +776,7 @@
////////////////////////////////////////////////////////////////////////////
template <typename ITERATOR, typename FLIGHT_PERIOD>
struct FlightPeriodParser :
- boost::spirit::qi::grammar<ITERATOR, boost::spirit::ascii::space_type > {
+ boost::spirit::qi::grammar<ITERATOR, boost::spirit::qi::locals<std::string>, boost::spirit::ascii::space_type> {
typedef store_airline_code<FLIGHT_PERIOD> store_airline_code_t;
typedef store_flight_number<FLIGHT_PERIOD> store_flight_number_t;
@@ -802,12 +807,17 @@
using boost::spirit::qi::lexeme;
using boost::spirit::qi::repeat;
using boost::spirit::qi::double_;
- using boost::spirit::qi::_1;
+ using boost::spirit::qi::on_error;
+ using boost::spirit::qi::fail;
+ using boost::spirit::qi::eol;
using boost::phoenix::ref;
+ using boost::phoenix::construct;
+ using boost::phoenix::val;
+ using namespace boost::spirit::qi::labels;
- start = (comment | flight_period) ;
+ start = *(comment | flight_period);
- comment = lexeme[ (repeat(2)[char_("/")]) ] >> *(char_);
+ comment = lexeme[ (repeat(2)[char_("/")]) >> +(char_ - eol) >> eol ];
flight_period = flight_key
>> +( ';' >> leg )
@@ -897,15 +907,14 @@
segment_cabin_details = char_("A-Z")[store_segment_cabin_code_t(_flightPeriod)]
>> ';' >> (repeat(1,26)[char_("A-Z")])[store_classes_t(_flightPeriod)]
;
-
- }
+ }
- boost::spirit::qi::rule<ITERATOR, boost::spirit::ascii::space_type> start,
- comment, flight_period, flight_key, airline_code, flight_number,
- date, dow, leg, leg_key, leg_details, time, date_offset,
- cabin_details, segment, segment_key, general_segments,
- specific_segments, full_segment_cabin_details,
- segment_cabin_details, flight_period_end;
+ boost::spirit::qi::rule<ITERATOR, boost::spirit::qi::locals<std::string>, boost::spirit::ascii::space_type> start,
+ comment, flight_period, flight_key, airline_code,
+ flight_number, date, dow, leg, leg_key, leg_details,
+ time, date_offset, cabin_details, segment, segment_key,
+ general_segments, specific_segments, full_segment_cabin_details,
+ segment_cabin_details, flight_period_end;
};
@@ -913,9 +922,9 @@
////////////////////////////////////////////////////////////////////////////
// Main program
////////////////////////////////////////////////////////////////////////////
-int main (int argc, char* argv[]) {
-
- try {
+int main () {
+
+ try{
char const* filename = "world_schedule.csv";
std::ifstream in(filename, std::ios_base::in);
@@ -926,34 +935,30 @@
return 1;
}
- typedef FlightPeriodParser<std::string::const_iterator, FlightPeriod_T> lFlightPeriodParser;
- lFlightPeriodParser flightParser; // Our grammar
-
- std::string::const_iterator iter;
- std::string::const_iterator end;
-
- std::string line;
- bool r = true;
- using boost::spirit::ascii::space;
+ typedef std::istreambuf_iterator<char> base_iterator_type;
+ base_iterator_type in_begin(in);
-
- while (r && std::getline(in, line)) {
- iter = line.begin();
- end = line.end();
- r = phrase_parse(iter, end, flightParser, space);
- if (iter != end) {
- r = false;
- }
- }
- std::cout << "-------------------------\n";
- if (r && iter == end) {
+ // Convert input iterator to forward iterator, usable by spirit parser
+ typedef boost::spirit::multi_pass<base_iterator_type> forward_iterator_type;
+ forward_iterator_type fwd_begin = boost::spirit::make_default_multi_pass(in_begin);
+ forward_iterator_type fwd_end;
+
+ // Define our grammar
+ typedef FlightPeriodParser<forward_iterator_type, FlightPeriod_T> lFlightPeriodParser;
+ lFlightPeriodParser flightParser;
+
+ // Parse input file
+ bool r = boost::spirit::qi::phrase_parse(fwd_begin, fwd_end, flightParser, boost::spirit::ascii::space );
+
+ std::cout << "-------------------------------------------------------------------------------\n";
+ if (!r || fwd_begin != fwd_end) {
+ std::cout << "Parsing failed\n";
+ } else {
std::cout << "Parsing succeeded\n";
- } else {
- std::cout << "Parsing failed\n";
}
- std::cout << "-------------------------\n";
- } catch (const std::exception& stde) {
- std::cerr << "Standard exception: " << stde.what() << std::endl;
+ std::cout << "-------------------------------------------------------------------------------\n";
+ } catch (const std::exception& e) {
+ std::cerr << "Exception: " << e.what() << std::endl;
return -1;
}
return 0;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|