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
)[=46 指定值,我需要如何修改规则语法以提供默认值=]解析器?
诀窍是重新考虑 "optional" 的概念...
optional_x(-(qi::int_ >> ':')),
optional_z(-('@' >> qi::int_)),
我们知道,-
前缀表示此规则可以指定 0 次或 1 次,因此它是可选的。
但是,我们实际上并不想要 "optional" 值。我们想要已解析的值或默认值。这不是可选的,它只是一个或另一个。
通过修改规则语法,何时能更好地描述我们的意图。
optional_x((qi::int_ >> ':') | qi::attr(0)),
optional_z(('@' >> qi::int_) | qi::attr(1000)),
现在,当处理该选项时,如果您没有为 x
或 z
提供值,则 qi:attr(...)
将代表您提供一个值。
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
)[=46 指定值,我需要如何修改规则语法以提供默认值=]解析器?
诀窍是重新考虑 "optional" 的概念...
optional_x(-(qi::int_ >> ':')),
optional_z(-('@' >> qi::int_)),
我们知道,-
前缀表示此规则可以指定 0 次或 1 次,因此它是可选的。
但是,我们实际上并不想要 "optional" 值。我们想要已解析的值或默认值。这不是可选的,它只是一个或另一个。
通过修改规则语法,何时能更好地描述我们的意图。
optional_x((qi::int_ >> ':') | qi::attr(0)),
optional_z(('@' >> qi::int_) | qi::attr(1000)),
现在,当处理该选项时,如果您没有为 x
或 z
提供值,则 qi:attr(...)
将代表您提供一个值。