You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Spirit::Qi解析时如何将所有参数存入结果vector?

问题根因说明

问题1:仅第一个参数存入vector的原因

你通过BOOST_FUSION_ADAPT_STRUCT把Command适配成了(TYPE, std::vector<std::string>)的二元Fusion序列。而你的cmd2规则输出的属性序列是三元组:(TYPE, std::string, std::string)。Spirit做属性匹配时,只会把第一个字符串赋值给args容器,第二个字符串找不到对应的适配成员就被直接丢弃了。

问题2:必须加qi::as_string的原因

lexeme[+~char_]这类字符匹配规则的默认输出属性是std::vector<char>,和你要存储的std::string类型不匹配,所以必须用as_string显式把字符序列转为字符串类型,才能编译通过。

修复方案

你只需要把同一个命令的所有参数部分用qi::as_vector包裹,把多个字符串属性合并为单个std::vector<std::string>属性,和Command的args成员类型完全匹配即可。

修改后的核心规则代码

cmd1 = lit("CMD1") >> '('
    >> attr(TYPE::CMD1)
    // 单参数用as_vector包裹,合并为vector<string>
    >> as_vector[ as_string[lexeme[+~char_(")\r\n")]] ] >> ')';

cmd2 = lit("CMD2") >> '('
    >> attr(TYPE::CMD2)
    // 双参数合并为单个vector<string>
    >> as_vector[ as_string[lexeme[+~char_(",)\r\n")]] >> ',' >> as_string[raw[double_]] ] >> ')';

注:这里修改了CMD1的字符匹配规则,去掉了排除空格的限制,否则你的测试用例中CMD1(some ad hoc text)只会读到some就停止匹配参数。

运行结果

修改后运行输出完全符合预期:

elements: 2
CMD1 args: 1
CMD2 args: 2
可选优化

如果你不想每次写as_string,可以单独定义一个通用的字符串参数规则,简化后续代码:

// 类内新增规则定义
qi::rule<It, std::string(), qi::blank_type> str_arg;
// 构造函数中初始化
str_arg = as_string[lexeme[+~char_(", )\r\n")]];

内容的提问来源于stack exchange,提问作者Pablo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:57:07