我有以下语法,它按预期工作。Boost中的复合语法:: Spirit
struct query_term {
std::string term;
bool is_tag;
query_term(const std::string &a, bool tag = false): term(a), is_tag(tag) { } };
template<typename Iterator> struct query_grammar: grammar<Iterator, std::vector<query_term>(), space_type> {
query_grammar():
query_grammar::base_type(query) {
word %= +alnum;
tag = (omit[word >> ':'] >> word[_val = phoenix::construct<query_term>(_1, true)]);
non_tag = word[_val = phoenix::construct<query_term>(_1, false)];
query = (
(omit[word >> ':'] >> word[push_back(_val, phoenix::construct<query_term>(_1, true))])
|
word[push_back(_val,
phoenix::construct<query_term>(_1))
]
) % space;
};
qi::rule<Iterator, std::string(), space_type> word;
qi::rule<Iterator, query_term, space_type> tag;
qi::rule<Iterator, query_term, space_type> non_tag;
qi::rule<Iterator, std::vector<query_term>(), space_type> query; };
但是,当我与
query = (
tag[phoenix::push_back(_val, _1)]
|
word[push_back(_val,
phoenix::construct<query_term>(_1))
]
) % space;
代码不编译替代查询。基本上我试图将语法分解成可以在更大的语法中重用的组件。当解析单词或标签时,创建一个带有适当标志的query_term对象,其标签为标签和单词规则。在查询规则中重用这些属性。
在以前的版本中,标记和单词规则在查询语法中内联。
我不知道我在这里错过了什么。任何帮助将不胜感激。
供参考:这不是最终的代码。在生产代码中使用它之前,我正在尝试使用这些规则。
感谢名单, - baliga
IMO,代码不漂亮。尝试整理它,你可能会看到问题出在哪里。 – 2012-03-24 09:57:44
代码本身很漂亮,Boost :: Spirit有这个运算符超负荷的语法,你必须忍受。 – buc 2012-03-24 11:23:12
@AshBurlaczenko Thanx建议。有些提示会对此有所帮助。 – 2012-03-24 19:42:59