Sto passando attraverso le esercitazioni Boost Spirit (e Boost Fusion) (versione 1.48.0). Ho giocato con l'esempio di impiegato giocattolo. Il link alla fonte è qui:Boost :: Esempio di grammatica semplice di Spirit
http://www.boost.org/doc/libs/1_48_0/libs/spirit/example/qi/employee.cpp
Ecco la grammatica della esempio:
employee_parser() : employee_parser::base_type(start)
{
using qi::int_;
using qi::lit;
using qi::double_;
using qi::lexeme;
using ascii::char_;
quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> '}'
;
}
qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
qi::rule<Iterator, employee(), ascii::space_type> start;
E le mie modifiche togliere il trattamento delle citazioni e solo analizza qualsiasi carattere tra il delimitatore e assegna che alla struttura su cui è mappato il parser.
//quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> +(char_) >> ','
>> +(char_) >> ','
>> double_
>> '}'
;
La mia ipotesi è che char_ include tutti i caratteri finché non viene raggiunta una virgola. Tuttavia, la compilazione e l'esecuzione con la seguente stringa restituiscono un errore di analisi.
./employee
employee{10,my,name,20.0}
-------------------------
Parsing failed
-------------------------
Sto anche cercando di scrivere un parser simile per lanciare automaticamente ai tipi appropriati di mio tipo struct. Sono sicuro che mi manca qualcosa di fondamentalmente sbagliato per quanto riguarda la definizione della grammatica corretta per una stringa di input come sopra, quindi qualsiasi aiuto è molto apprezzato!
Grazie!
... che sarebbe solo lettere ASCII, quindi ... José non è divertito. ;-) – DevSolar