未使用(但匹配)规则的零填充结果

时间:2014-01-31 15:51:10

标签: c++ boost boost-spirit boost-spirit-qi

我的语法类似于以下内容:

ruleFormat %= ruleComment | ruleSpec;
ruleFile %= ruleFormat % ruleNewline;

规则如此宣布:

rule<Iterator, void()> ruleComment;
rule<Iterator, int()> ruleSpec, ruleFormat;
rule<Iterator, std::vector<int>()> ruleFile;

(我实际上并没有使用int,而是使用了一些int s的结构。

好吧,语法似乎正常工作:当ruleSpec匹配整数时,规则具有该属性,而该属性又被赋予向量。

问题是ruleCommentruleFormat中匹配时,因为数据设置为null,并且在矢量中放置了一个空值。结果是向量填充了“正确”值和“错误”零的混合。

如何防止这种情况发生?

编辑: 根据要求,这里有一个示例代码:

template <typename Iterator>
struct MyGrammar: public qi::grammar<Iterator, std::vector<int>()> {
    MyGrammar(): MyGrammar::base_type(ruleFile) {
        ruleComment = qi::lit('@');
        ruleSpec %= qi::int_;

        ruleFormat %= ruleComment | ruleSpec;
        ruleFile %= ruleFormat % ' ';

        ruleComment.name("COMMENT");
        ruleSpec.name("SPEC");
        ruleFormat.name("FORMAT");
        ruleFile.name("FILE");

        qi::debug(ruleComment);
        qi::debug(ruleSpec);
        qi::debug(ruleFormat);
        qi::debug(ruleFile);
    }
    qi::rule<Iterator, void()> ruleComment;
    qi::rule<Iterator, int()> ruleSpec, ruleFormat;
    qi::rule<Iterator, std::vector<int>()> ruleFile;
};

int main() {
    typedef std::string::const_iterator Iter;
    std::string subj = "0 @ @ 12 3 @ 4 @ 56 @ ";

    MyGrammar<Iter> gram;
    qi::parse(subj.cbegin(), subj.cend(), gram);
    return 0;
}

从调试信息中,我得到:

<attributes>[[0, 0, 0, 12, 3, 0, 4, 0, 56, 0]]</attributes>

虽然我想获得的是当@匹配

时避免在向量中放置0
<attributes>[[0, 12, 3, 4, 56]]</attributes>

0 个答案:

没有答案