提升::精神 使用相同的符号两次
boost::spirit use same symbol twice
我有一个类似于那个的语法:
template <class ITER>
struct MessageParser
: public boost::spirit::qi::grammar<ITER, Message(), boost::spirit::ascii::space_type>
{
MessageParser()
: MessageParser::base_type(start_)
{
string_ = +(char_("a-zA-Z_") >> *char_("a-zA-Z_0-9"));
quoted_string_ = lexeme['"' >> +(char_ - '"') >> '"'];
signal_ %= lit("SG_") // type is Signal
>> string_ >> ':'; // Signal name
message_ %= lit("BO_") // type is Message
>> int_
>> string_ >> ':'
>> +signal_; // std::map<std::string, Signal> (here is my problem)
start_ %= message_;
}
boost::spirit::qi::rule<ITER, Message(), boost::spirit::ascii::space_type> start_;
boost::spirit::qi::rule<ITER, Message(), boost::spirit::ascii::space_type> message_;
boost::spirit::qi::rule<ITER, Signal(), boost::spirit::ascii::space_type> signal_;
boost::spirit::qi::rule<ITER, std::string()> string_;
boost::spirit::qi::rule<ITER, std::string(), boost::spirit::ascii::space_type> quoted_string_;
};
问题是,我需要Signal
的名称来创建Signal
对象(因为它具有name
属性(,但我也希望将使用规则解析的信号映射到消息std::map<std::string, Signal>
映射中的信号名称signal_
,但我不知道如何接收信号的名称, 或者如何为boost::spirit
创建所需的对,以便它可以将配对插入到映射中。我想我必须以某种方式复制保存信号名称的字符串。
我该怎么做?
我用attr_cast
解决了它:
namespace boost
{
namespace spirit
{
namespace traits
{
template <>
struct transform_attribute<std::pair<std::string, Signal>, Signal, boost::spirit::qi::domain>
{
using type = Signal&;
using pair_t = std::pair<std::string, Signal>;
static Signal& pre(pair_t& pair)
{
return pair.second;
}
static void post(pair_t& pair, const Signal& sig)
{
pair.first = sig.name;
pair.second = sig;
}
static void fail(pair_t& pair)
{
}
};
}
}
}
然后:
message_ %= lit("BO_")
>> int_
>> string_ >> ':'
>> int_
>> string_
>> +attr_cast(signal_);
我希望我正确使用了所有内容(不保证(。
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- 提升::精神 使用相同的符号两次
- 符号从 ifstream 读取两次
- 为什么我必须将一个字节强制转换为无符号两次才能看到十六进制输出