I'm playing around with Spirit for a particular parsing task. I could do this manually, but I figured this was a good chance to learn what Spirit had to offer. The trouble is this. While Spirit offers ready-made semantic actions for parsing primitives, it doesn't seem to offer anything terribly useful for compound statements. As far as I can tell, you can define your own semantic actions but they simply take in the matched string as an argument----there's no way to get at the values parsed on that level. For example, let's say I have a type struct Person { string name; double height; int age; Person(string n, double h, int a) : name(n), height(h), age(a) }; And I have a document containing 5.5 15 Henry 4.6 32 Jane 6.1 21 Bob I could parse this using rule<> personrule = strict_real_p >> int_p >> ~eol_p; parse(str, *(personrule[WhatGoesHere] >> eol_p) >> end_p); But how can I build a vector<Person> out of this? I can write my own functor to do the push_back, but I need to get at the parsed values of name, age, and height for each personrule somehow. I suppose I *could* just run another parse() on the input the semantic action for that specific person....but that really seems like it shouldn't be necessary.