gpt4 book ai didi

boost::spirit::karma Generator 规则中的语义 Action

转载 作者:行者123 更新时间:2023-12-04 04:46:12 29 4
gpt4 key购买 nike

这已经困扰我好几个小时了,我不明白如何让它发挥作用。我只是想在每次使用规则时做一些事情,在这个例子中增加一个计数器。如果我没有明确指定规则,而是在调用 boost::spirit::karma::generate 时使用它,它就可以工作。但是当我尝试将所有内容放入规则时,它不会编译,并且我无法从冗长的错误消息中获得任何见解。

#include <iostream>
#include <string>

#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>

int main()
{
using boost::spirit::karma::eps;
using boost::spirit::karma::int_;
using boost::spirit::karma::lit;
using boost::spirit::karma::eol;
using boost::phoenix::val;
using boost::phoenix::ref;
using boost::spirit::karma::generate;
using boost::spirit::karma::rule;

typedef std::back_insert_iterator<std::string> OutputIteratorType;

std::string s;
std::back_insert_iterator<std::string> sink(s);
int lineNum = 0;

generate(sink, eps[ref(lineNum) += 10] << lit("Line number ") << lit(lineNum) << lit(": ") << int_ << eol, 123);
generate(sink, eps[ref(lineNum) += 10] << lit("Line number ") << lit(lineNum) << lit(": ") << int_ << eol, 123);

// Will not compile
//rule<OutputIteratorType, int()> testRule = eps[ref(lineNum) += 10] << lit("Line number ") << lit(lineNum) << lit(": ") << int_ << eol;
//generate(sink, testRule, 123);
//generate(sink, testRule, 123);

std::cout << s;
return 0;
}

(在上面你可以看到最优雅的 boost::spirit 版本,但是使用 lambda 函数或成员函数都会产生相同的结果,“直接方法”有效,“规则方法”无效。)

不幸的是,我也找不到涵盖此内容的任何文档或示例或其他资源,我也非常感谢您的引用。

最佳答案

这是 boost::phoenix V2 的一个问题(不要问是哪个 ;-))所以,使用 V3 是可行的。

此外,必须将属性赋予 int 生成器并在打印时引用 lineNum。

#include <iostream>
#include <string>

#define BOOST_SPIRIT_USE_PHOENIX_V3

#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>

int main() {
using boost::spirit::karma::eps;
using boost::spirit::karma::int_;
using boost::spirit::karma::lit;
using boost::spirit::karma::eol;
using boost::spirit::karma::_1;
using boost::spirit::karma::_val;
using boost::phoenix::val;
using boost::phoenix::ref;
using boost::spirit::karma::generate;
using boost::spirit::karma::rule;

typedef std::back_insert_iterator<std::string> OutputIteratorType;

std::string s;
std::back_insert_iterator<std::string> sink(s);
int lineNum = 0;

rule<OutputIteratorType, int()> testRule = eps[ref(lineNum) += 10]
<< lit("Line number ") << lit(ref(lineNum)) << lit(": ")
<< int_[_1 = _val] << eol;
generate(sink, testRule, 123);
generate(sink, testRule, 123);

std::cout << s;
return 0;
}

关于boost::spirit::karma Generator 规则中的语义 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18143312/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com