Boost.Spirit.Qi 语法,用于 Boost.Fusion 自适应结构中的默认值

Boost.Spirit.Qi grammar for default values in Boost.Fusion adapt struct

本文关键字:Boost 结构 默认值 自适应 用于 Spirit Qi 语法 Fusion      更新时间:2023-10-16
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_xoptional_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)),

现在,当处理该选项时,如果您尚未提供xz的值,则qi:attr(...)将代表您提供一个值。