我的语法类似于以下内容:
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
匹配整数时,规则具有该属性,而该属性又被赋予向量。
问题是ruleComment
在ruleFormat
中匹配时,因为数据设置为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>
虽然我想获得的是当@
匹配
<attributes>[[0, 12, 3, 4, 56]]</attributes>