Я честно сдаюсь (как и многие другие передо мной), чтобы найти сам синтаксис этого еще довольно простого генератора boost-spirit- карма библиотека. Я хотел бы показать, до строки, так как многие белые пробелы как символов в строке:Как отображать столько пробелов, сколько символов в отображаемом значении символа перед ним
typedef enum {A, B, C} E;
class EName : public ka::symbols<E, std::string>
{
public:
EName() {add (A,"A") (B,"the B") (C,"a C");}
};
class grm: public ka::grammar<iterator, E()>
{
public:
grm():grm::base_type(start)
{
namespace phx = boost::phoenix;
namespace ka = boost::spirit::karma;
start = ka::duplicate[ka::repeat(phx::bind(&std::string::size,b))[ka::lit(' ')] << b];
}
private:
ka::rule<iterator,E()> start;
EName b;
};
int main(int argc, char * argv[])
{
grm g;
E e = A;
std::string generated;
std::back_insert_iterator<std::string> sink(generated);
ka::generate(sink,g,e);
std::cout << generated << "\n";
generated.clear();
e = B;
ka::generate(sink,g,e);
std::cout << generated << "\n";
return 0;
}
Ожидаемый выход, таким образом, один пробел, затем «А» и на следующей строке 5 белых пространств с последующим «B» (так как «B» - строка из 5 символов).
Я понимаю, что, возможно, переменная «b» недоступна в контексте аргумента генератора ka::repeat()[]
... Я попробовал ka::_val
вместо этого без успеха. На самом деле у меня недостаточно опыта работы с кармой, фениксом и слиянием, чтобы построить путь к ответу, хотя я, вероятно, имею доступ ко всей необходимой информации в документации. Поэтому я также хотел бы получить несколько намеков на то, как я могу прийти к ответу только по документации (или по вычету), а не по опыту.
UPDATE:
Я попытался с помощью атрибута ввергнуть без успеха:
namespace boost {
namespace spirit {
namespace traits {
template <>
struct transform_attribute<const E, std::string, ka::domain>
{
typedef std::string type;
static type pre(const E & e) {
EName s;
int num = s.find(e)->size();
return std::string(num, ' ');
}
};
} } }
следуют:
start = ka::attr_cast<std::string>(ka::string) << b;
Но при этом это не компилировать.
Вы заставить сделать это с помощью подталкивание? – Angelos
Это мой вопрос. Я знаю, как это сделать без ускорения. – Heyji