C++ 使用boost::qi::rule和boost\u FUSION\u ADAPT\u STRUCT的正确方法是什么?
我试图获得一个qi::rule,以基于BOOST employee示例使用BOOST\u FUSION\u ADAPT\u结构发出一个结构 我有以下结构及其关联的fusion宏:C++ 使用boost::qi::rule和boost\u FUSION\u ADAPT\u STRUCT的正确方法是什么?,c++,boost-spirit,boost-spirit-qi,boost-fusion,C++,Boost Spirit,Boost Spirit Qi,Boost Fusion,我试图获得一个qi::rule,以基于BOOST employee示例使用BOOST\u FUSION\u ADAPT\u结构发出一个结构 我有以下结构及其关联的fusion宏: struct LineOnCommand { int lineNum; std::vector<char> humpType; }; BOOST_FUSION_ADAPT_STRUCT( LineOnCommand, (int, lineNum) (std::vector&l
struct LineOnCommand
{
int lineNum;
std::vector<char> humpType;
};
BOOST_FUSION_ADAPT_STRUCT(
LineOnCommand,
(int, lineNum)
(std::vector<char>, humpType)
)
struct LineOnCommand
{
int-lineNum;
std::矢量驼峰型;
};
增强融合适应结构(
LineOnCommand,
(int,lineNum)
(标准::矢量,驼峰型)
)
关联的解析规则包括:
qi::rule<Iterator, std::vector<char> ascii::space_type> humpIdentifer = qi::lit("BH") | qi::lit("DH");
qi::rule<Iterator, LineOnCommand(), ascii::space_type> Cmd_LNON = qi::int_ >> -humpIdentifier >> qi::lit("LNON");
qi::rule humpIdentifer=qi::lit(“BH”)| qi::lit(“DH”);
qi::rule Cmd_LNON=qi::int_>>-humpIdentifier>>qi::lit(“LNON”);
然后我有一个复合规则,其中所有其他规则(包括这个简单的测试用例)都是传递给解析器的一部分:
qi::rule<Iterator, qi::unused_type, ascii::space_type> commands =
+( /* other rules | */ Cmd_LNON /*| other rules */);
bool success = qi::phrase_parse(StartIterator, EndIterator, commands, ascii::space);
qi::规则命令=
+(/*其他规则|*/Cmd|LNON/*|其他规则*/);
bool success=qi::phrase_parse(StartIterator、EndIterator、commands、ascii::space);
当我试图编译时,问题出现了,我得到了错误:
<boostsource>/spirit/home/qi/detail/assign_to.hpp(152): error: no suitable constructor exists to convert form "const int" to "LineOnCommand"
attr = static_cast<Attribute>(val);
/spirit/home/qi/detail/assign\u to.hpp(152):错误:没有合适的构造函数将“const int”格式转换为“LineOnCommand”
attr=静态(val);
很明显我做错了什么,但我不确定是什么。如果我理解spirit的工作方式,规则模板的第二个参数表示属性(即规则发出的数据类型),BOOST_FUSION_ADAPT_STRUCT宏将调整我的结构,以便BOOST知道如何将“int,std::vector”流转换为它
我在这里所做的与boost employee示例之间的唯一区别是,我没有使用显式语法进行解析。我的理解是,这是没有必要的,规则本身就足够了
我做错了什么?我不确定。我想我忽略了这个问题。也许,我“自然”回避了这个问题,因为你的样品不是独立的 因此,以下是我对它的看法:看看它,希望通过比较可以帮助你:
- 我修正了你规则声明中的明显错误
- 我提出了一些不同于
的建议;如果没有属性,就没有必要声明它;除了迭代器类型之外,qi::unused_type
和qi::rule
的模板参数不是位置参数。所以qi::grammar
如果你的问题本质上是不相关的,通常更倾向于发布单独的问题。在本例中,它们是独立的。请尝试使示例独立。这使得人们可以更容易地提供帮助(我认为那些非常精通精神的常客可以用一只手的手指数出这些代码)。谢谢你的回答,这确实让我从困境中走了出来。但是,我发现LineOnCommand结构中的驼峰变量没有填充(它只是一个空向量)。如果我理解复合规则的工作方式,在您的示例中,它应该用“DH”、“BH”或“INVALID”填充。这对吗?@stix Ah。对不起,我错过了<代码>点亮不显示任何属性。使用
:字符串
qi::rule<It, qi::unused_type(), ascii::space_type> r; qi::rule<It, ascii::space_type, qi::unused_type()> r; qi::rule<It, ascii::space_type> r;
#include <boost/fusion/adapted/struct.hpp> #include <boost/spirit/include/qi.hpp> namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; struct LineOnCommand { int lineNum; std::vector<char> humpType; }; BOOST_FUSION_ADAPT_STRUCT( LineOnCommand, (int, lineNum) (std::vector<char>, humpType) ) template <typename It, typename Skipper = ascii::space_type> struct parser : qi::grammar<It, std::vector<LineOnCommand>(), Skipper> { parser() : parser::base_type(commands) { using namespace qi; humpIdentifier = string("BH") | string("DH"); Cmd_LNON = int_ >> -humpIdentifier >> "LNON"; commands = +( /* other rules | */ Cmd_LNON /*| other rules */ ); } private: qi::rule<It, std::vector<char>(), Skipper> humpIdentifier; qi::rule<It, LineOnCommand(), Skipper> Cmd_LNON; qi::rule<It, std::vector<LineOnCommand>(), Skipper> commands; }; int main() { typedef std::string::const_iterator Iterator; parser<Iterator> p; std::string const input = "123 BH LNON\n" "124 LNON\t\t\t" "125 DH LNON\n" "126 INVALID LNON"; auto f(input.begin()), l(input.end()); std::vector<LineOnCommand> data; bool success = qi::phrase_parse(f, l, p, ascii::space, data); std::cout << "success:" << std::boolalpha << success << ", " << "elements: " << data.size() << "\n"; if (success) { for (auto& el : data) { std::cout << "Item: " << el.lineNum << ", humpType '" << std::string(el.humpType.begin(), el.humpType.end()) << "'\n"; } } if (f!=l) std::cout << "Trailing unparsed: '" << std::string(f,l) << "'\n"; return success? 0 : 1; }
success:true, elements: 3 Item: 123, humpType 'BH' Item: 124, humpType '' Item: 125, humpType 'DH' Trailing unparsed: '126 INVALID LNON'