Boost Spirit x3 解析为具有单个字段的结构
Boost Spirit x3 parsing into a struct with single field
我一直在查boost spirit的例子,碰到了下面的问题。 (我认为它在某处被描述为代码中的错误,但我可能是错的)
简单地说:当尝试解析为具有从 x3::variant.
继承的类型的单个字段的结构时,解析器没有构建
这是部分代码
struct operand : x3::variant<
nil
, unsigned int
, std::string
, x3::forward_ast<expression>
>
{
using base_type::base_type;
using base_type::operator=;
};
struct assign_return
{
char sign;
operand var;
};
我将其解析为以下内容(当然它需要正确定义)
auto const areturn_def =
lexeme["return" >> !(alnum | '_')] >> char_(':') >> expression >> ';';
此代码运行正常,
但是如果我不想解析':'并根据(当然我在BOOST_FUSION_ADAPT_STRUCT中为这个结构做了改变)
struct assign_return
{
operand var;
};
auto const areturn_def =
lexeme["return" >> !(alnum | '_')] >> expression >> ';';
这段代码并没有产生愚蠢的错误:
C:\Program Files\boost\boost\boost\spirit\home\x3\nonterminal\rule.hpp:113: undefined reference to `bool client::parser::parse_rule<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::spirit::x3::context<boost::spirit::x3::skipper_tag, boost::spirit::x3::char_class<boost::spirit::char_encoding::ascii, boost::spirit::x3::space_tag> const, boost::spirit::x3::unused_type>, client::ast::assign_return>(boost::spirit::x3::rule<client::parser::expression_class, client::ast::expression, false>, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, boost::spirit::x3::context<boost::spirit::x3::skipper_tag, boost::spirit::x3::char_class<boost::spirit::char_encoding::ascii, boost::spirit::x3::space_tag> const, boost::spirit::x3::unused_type> const&, client::ast::assign_return&)'
如果我们仔细查看错误代码和功能,它会提到
template <typename Iterator, typename Context, typename Attribute_>
bool parse(Iterator& first, Iterator const& last
, Context const& context, unused_type, Attribute_& attr) const
我们可以看到,模板参数是正确的,但是参数列表:
(rule, iterator, iterator, context, Attribute)
好像是未定义引用的问题,但是怎么办呢?
感谢您的帮助!
是的。这看起来与单元素序列无关。链接器错误通常是:)
您或许可以使用演示的技术
- 此处:
- 这里:
找到罪魁祸首。如果您 post 一个完整的、最小的 "working" 示例,我们可以提供帮助。
我一直在查boost spirit的例子,碰到了下面的问题。 (我认为它在某处被描述为代码中的错误,但我可能是错的)
简单地说:当尝试解析为具有从 x3::variant.
继承的类型的单个字段的结构时,解析器没有构建这是部分代码
struct operand : x3::variant<
nil
, unsigned int
, std::string
, x3::forward_ast<expression>
>
{
using base_type::base_type;
using base_type::operator=;
};
struct assign_return
{
char sign;
operand var;
};
我将其解析为以下内容(当然它需要正确定义)
auto const areturn_def =
lexeme["return" >> !(alnum | '_')] >> char_(':') >> expression >> ';';
此代码运行正常,
但是如果我不想解析':'并根据(当然我在BOOST_FUSION_ADAPT_STRUCT中为这个结构做了改变)
struct assign_return
{
operand var;
};
auto const areturn_def =
lexeme["return" >> !(alnum | '_')] >> expression >> ';';
这段代码并没有产生愚蠢的错误:
C:\Program Files\boost\boost\boost\spirit\home\x3\nonterminal\rule.hpp:113: undefined reference to `bool client::parser::parse_rule<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, boost::spirit::x3::context<boost::spirit::x3::skipper_tag, boost::spirit::x3::char_class<boost::spirit::char_encoding::ascii, boost::spirit::x3::space_tag> const, boost::spirit::x3::unused_type>, client::ast::assign_return>(boost::spirit::x3::rule<client::parser::expression_class, client::ast::expression, false>, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, boost::spirit::x3::context<boost::spirit::x3::skipper_tag, boost::spirit::x3::char_class<boost::spirit::char_encoding::ascii, boost::spirit::x3::space_tag> const, boost::spirit::x3::unused_type> const&, client::ast::assign_return&)'
如果我们仔细查看错误代码和功能,它会提到
template <typename Iterator, typename Context, typename Attribute_>
bool parse(Iterator& first, Iterator const& last
, Context const& context, unused_type, Attribute_& attr) const
我们可以看到,模板参数是正确的,但是参数列表:
(rule, iterator, iterator, context, Attribute)
好像是未定义引用的问题,但是怎么办呢?
感谢您的帮助!
是的。这看起来与单元素序列无关。链接器错误通常是:)
您或许可以使用演示的技术
- 此处:
- 这里:
找到罪魁祸首。如果您 post 一个完整的、最小的 "working" 示例,我们可以提供帮助。