Я хотел бы разобрать следующую возвратные степенные правило, которое разбирает простой идентификатор шаблона Classe как foo<bar> foo<bar,baz> foo<bar<baz>>
здесь простая грамматика:Разбор рекурсивных правил с духом x3
identifier := A-Z | a-z | _
class_identifier = identifier ?("<" identifier|class_identifier
("," identifier|class_identifier)*
">")
Я пытался написать парсер с х3, как это:
auto const identifier = x3::rule<class identifier_id, std::string>{"identifier"}
= +x3::char_("A-Za-z");
x3::rule<class class_identifier, std::string> class_identifier = "class_identifier";
auto const class_identifier_def = identifier //classname
>> -(x3::string("<")
>> (identifier | class_identifier)
>> *(x3::string(",")
>> (identifier | class_identifier))
>> x3::string(">"));
BOOST_SPIRIT_DEFINE(class_identifier)
но эта попытка не удается разобрать вещи, как этот foo<bar<baz>>
но Foo прекрасно. Есть ли какая-то логическая ошибка в моей грамматике, или я использую boost дух неправильно, поскольку это рекурсивное правило?
Чтобы сделать вашу жизнь проще, я считаю, '(идентификатор | class_identifier) >> * (x3 :: строка («») > > (идентификатор | class_identifier)) 'можно заменить на' (идентификатор | class_identifier)% x3 :: string (",") '. Я не удивлюсь, если бы это было упрощено до '% ',' ', также, наряду с другими местами, где литерал не мешал бы перегрузке оператора. – chris
Действительно. '% ','' is fine – sehe
, даже если я анализирую строку и хочу, чтобы '', ''находились в строке? – Exagon