Boost.Spirit.Qi 语法,用于 Boost.Fusion 自适应结构中的默认值
Boost.Spirit.Qi grammar for default values in Boost.Fusion adapt struct
struct coordinate {
int x;
int y;
int z;
};
BOOST_FUSION_ADAPT_STRUCT(
coordinate,
(int, x)
(int, y)
(int, z)
)
template <typename Iterator>
struct coordinate_grammar : qi::grammar<Iterator, coordinate(), ascii::space_type>
{
coordinate_grammar()
:
coordinate_grammar::base_type(start),
optional_x(-(qi::int_ >> ':')),
optional_z(-('@' >> qi::int_)),
start(optional_x >> qi::int_ >> optional_z)
{
}
qi::rule<Iterator, int, ascii::space_type> optional_x;
qi::rule<Iterator, int, ascii::space_type> optional_z;
qi::rule<Iterator, coordinate(), ascii::space_type> start;
};
我想将0
设置为x
的默认值,1000
设置为z
的默认值。
输入 --> 期望输出:
200:400@300
-->[200,400,300]
200:400
-->[200,400,1000]
400@300
-->[0,400,300]
400
-->[0,400,1000]
当尚未为可选(optional_x
和optional_z
(解析器指定值时,我需要如何修改规则语法以提供默认值?
诀窍是重新考虑"可选"的概念......
optional_x(-(qi::int_ >> ':')),
optional_z(-('@' >> qi::int_)),
众所周知,-
前缀表示此规则可以指定 0 或 1 次,因此使其成为可选规则。
但是,我们实际上并不希望有一个"可选"值。我们想要已解析的值或默认值。这不是可选的,它很简单
。通过修改规则语法,什么时候可以更好地描述我们的意图。
optional_x((qi::int_ >> ':') | qi::attr(0)),
optional_z(('@' >> qi::int_) | qi::attr(1000)),
现在,当处理该选项时,如果您尚未提供x
或z
的值,则qi:attr(...)
将代表您提供一个值。
相关文章:
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 为什么 boost::comb 对结构化绑定的支持缺少结构化绑定机制对 boost::tuples::cons 的适应?
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- 使用 Boost::Hana 中的 BOOST_HANA_DEFINE_STRUCT 定义具有 40 个以上字段的结构
- 如何实现 Boost.Hana 结构的相等比较运算符?
- Boost.Spirit.Qi 语法,用于 Boost.Fusion 自适应结构中的默认值
- boost::任何带有结构体和无符号整数
- 在 boost::heap::p riority_queue 中推送结构对象时出错
- 如何将 JSON 键值(我使用 cpp boost 解析)存储在相关数据结构中?
- 包含字符串的结构的 Boost 进程间向量是否需要特殊的分配器?
- 通过引用将自定义结构的向量传递给 boost::compute 闭包或函数
- 如何在结构中使用Boost库中的矩阵
- 首选数据结构,如果您有两个键并且无法使用Boost
- 与 Boost.Asio 同步和并发的数据结构模式
- boost :: Spirit :: Karma语法:逗号从结构上划定了带有选件属性的输出
- 跳过层次结构中的中间类,并使用boost ::序列化
- Boost Intervocess:通过迭代通过从结构引用对象的映射进行迭代时
- 无法使用 Boost Spirit X3 解析空的 C++ 结构
- Boost::序列化存储结构时的堆栈溢出错误
- 如何使用 boost 连接映射的键和值,特别是如果值是结构