我真的放棄了(和以前的許多其他)一樣,自己找到這個仍然非常簡單的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