Нет, это не просто исправленная ошибка.
Независимо от этого, грамматическая конструкция, такая как x3::alpha | '_'
, не будет отображать то, что вам нужно, потому что литерал '_'
не предоставляет никаких атрибутов.
Таким образом, на практике вы можете просто захотеть упростить использование raw[]
:
auto ident = x3::raw [ x3::lexeme [ (x3::alpha | '_') >> *(x3::alnum | '_') ]
Далее вы можете сопоставить несколько идентификаторов, квалифицированных с помощью ::
:
x3::raw [ ident >> * ("::" >> ident) ]
Что, кстати, полностью эквивалентно просто
x3::raw [ ident % "::") ]
См.
Бонус:
Назначение атрибутам
Live On Coliru
#include <boost/spirit/home/x3.hpp>
#include <iostream>
#include <iomanip>
#include <string>
namespace x3 = boost::spirit::x3;
int main() {
std::string str = "foo::_bar::qux_1";
auto begin = str.begin(), end = str.end();
auto ident = x3::raw [ x3::lexeme [ (x3::alpha | '_') >> *(x3::alnum | '_') ] ];
std::vector<std::string> qualified;
bool r = x3::parse(begin, end, ident % "::", qualified);
if (r && begin==end) {
std::cout << "Parsing succeeded\n";
for (auto& el : qualified) {
std::cout << " element " << std::quoted(el) << "\n";
}
} else {
std::cout << "Parsing FAILED\n";
}
std::cout << std::boolalpha << r << " " << std::quoted(std::string(begin, end)) << "\n";
}
Отпечатки:
Parsing succeeded
element "foo"
element "_bar"
element "qux_1"
true ""
И грамматика упростилась до
std::vector<std::string> qualified;
bool r = x3::parse(begin, end, ident % "::", qualified);
Обычно это хороший знак.