Sie können einfach
auslassen [ eol >> *char_ - ("\nlabel A:") ] >> eol
Beispiel: Live auf Coliru
Es gibt auch die seek[]
Direktive im Repository. Das Folgende ist äquivalent zu dem obigen:
repo::seek [ eol >> &lit("int main") ]
Hier ist eine Beispielanalyse Ihres Originalmusters:
*repo::seek [ eol >> "label" >> char_("A-Z") >> ':' >> int_ ],
Dies wird ohne weitere Modifikationen in std::vector >
analysiert.
Auch auf Coliru:
#if 0
label A: 34
label B: 45
...
#endif
#include
#include
#include
#include
#include
namespace qi = boost::spirit::qi;
namespace repo = boost::spirit::repository::qi;
int main()
{
std::ifstream ifs("main.cpp");
ifs >> std::noskipws;
boost::spirit::istream_iterator f(ifs), l;
std::vector > parsed;
using namespace qi;
bool ok = phrase_parse(
f, l,
*repo::seek [ eol >> "label" >> char_("A-Z") >> ':' >> int_ ],
blank,
parsed
);
if (ok)
{
std::cout << "Gefunden:\n";
for (auto& p : parsed)
std::cout << "'" << p.first << "' hat den Wert " << p.second << "\n";
}
else
std::cout << "Fehler bei: '" << std::string(f,l) << "'\n";
}
Notizen:
Output ist
Gefunden:
'A' hat den Wert 34
'B' hat den Wert 45