我真的放弃了(和以前的许多其他)一样,自己找到这个仍然非常简单的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;
}
预期输出因此一个空白空间,接着由“A”和下一行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;
但它也不编译。
你强制使用boost办呢? – Angelos
这是我的问题。当然,我知道如何做到这一点。 – Heyji