У меня есть парсер для синтаксического анализа идентификатора, такого как foo, bar, baz
, и один для синтаксического анализа также вложенных идентификаторов, таких как foo::bar, foo::bar.baz, foo::bar.baz.baham
. Они оба анализируют одну и ту же структуру ast, которая выглядит так:
struct identifier : x3::position_tagged{
std::vector <std::string> namespaces;
std::vector <std::string> classes;
std::string identifier;
};
Парсер для identifier
выглядит так:
#define VEC_ATR x3::attr(std::vector<std::string>({})) //ugly hack
auto const identifier_def =
VEC_ATR
>> VEC_ATR
>> id_string;
а для nested_identifier
вот так:
auto const nested_identifier_def =
x3::lexeme[
(+(id_string >> "::") >> +(id_string >> ".") > id_string)
| (+(id_string >> "::") >> VEC_ATR > id_string)
| (VEC_ATR >> +(id_string >> ".") > id_string)
| identifier
];
Я знаю, что мне стыдно за макрос. Парсер идентификатора работает нормально, но nested_identifier
ведет себя странно, если я пытаюсь проанализировать что-то вроде foo::bar::baz
, объекты ast, которые выпадают из парсера, имеют все пространства имен, в данном случае foo
и bar
дважды в namespaces
векторе. У меня есть небольшой пример этого странного поведения здесь. Кто-нибудь может объяснить мне, почему это происходит и как этого избежать?