
Ok here is a slightly simplified version of MyGrammar ( MySkipGrammer is simply space_p | comment_p( ';' ) ). But it also generates the same error. The first run works as expected and the second run seems to still hold old references. class MyGrammar : public boost::spirit::grammar<MyGrammar> { public: std::vector<Group>& vGroups; std::vector<std::string>& vLibraries; MyGrammar( std::vector<std::string>& rvLibraries, std::vector<Group>& rvGroups ) : vGroups(rvGroups), vLibraries(rvLibraries) { } template <typename ScannerT> struct definition { // rule deklarations here Group kCurrentGroup; std::vector<Group> vTmpGroups; std::list<Group> vFullGroups; std::vector<std::string vLibs; definition( const MyGrammar& rkSelf ) { startRule = (*group)[ copy_a( rkSelf.vGroups, vFullGroups ) ][ copy_a( rkSelf.vLibraries, vLibs ) ]; group = groupID[ assign_a( kCurrentGroup.id, id ) ] >> ch_p( '{' ) >> groupDefinition >> *( eps_p(as_lower_d[str_p("group")])[ push_back_a( vTmpGroups, kCurrentGroup ) ] >> group[ my_assign_a( kCurrentGroup, vTmpGroups ) ][ pop_back_a( vTmpGroups ) ] ) >> ch_p( '}' )[ push_front_a( vFullGroups, kCurrentGroup ) ]; groupID = as_lower_d[ str_p( "group" ) ] >> confix_p( '(', uid[ assign_uid( id ) ], ')' ); groupDefinition = name[ assign_a( kCurrentGroup.name, strName ) ] >> description[ assign_a( kCurrentGroup.description, desc ) ]; name = as_lower_d[ str_p( "name" ) ] >> ch_p( '=' ) >> identifier[ assign_a( strName ) ]; description = as_lower_d[ str_p( "description" ) ] >> ch_p( '=' ) >> confix_p( '"', (*anychar_p)[ assign_a( desc ) ], '"' ); library = as_lower_d[ str_p( "library" ) ] >> ch_p( '=' ) >> identifier[ assign_a( lib ) ][ push_back_unique_a( vLibs ) ]; identifier = lexeme_d [* ( range_p( 'a', 'z' ) | range_p( 'A', 'Z' ) | ch_p('_') ) ]; uid = lexeme_d [ repeat_p(8)[ range_p( 'A', 'F') | range_p( '0', '9' ) ] >> ch_p( '-' ) >> repeat_p(4)[ range_p( 'A', 'F') | range_p( '0', '9' ) ] >> ch_p( '-' ) >> repeat_p(4)[ range_p( 'a', 'f') | range_p( '0', '9' ) ] >> ch_p( '-' ) >> repeat_p(4)[ range_p( 'A', 'F') | range_p( '0', '9' ) ] >> ch_p( '-' ) >> repeat_p(12)[ range_p( 'A', 'F') | range_p( '0', '9' )] ]; } const rule<ScannerT>& start() const { return startRule; } } }