我很难理解为什么以下解析器无法解析test
。
致电qi::phrase_parse
后,result
为真,it2
指向字符串末尾,但mynr
仍为0:
std::string test = "#define SOMEMACRO 8.0";
auto it2 = test.begin();
auto endIt2 = test.end();
double mynr = 0;
bool result =
qi::phrase_parse(
it2,
endIt2,
("#define" >> (*qi::alnum) >> qi::double_[ref(mynr) = qi::_1]),
qi::space);
我怀疑它与qi::alnum
和空间跳过有关。
我尝试将我的案例简化为单个组件。我分别验证了这三个解析器并发现:
(*qi::alnum)
可以使用SOMEMACRO
qi::double_
可以使用8.0
另外,每个解析器工作正常,但是在上面的表单中拼凑起来很奇怪。进一步的小测试似乎向我表明(*qi::alnum)
当我使用它时,它似乎消耗的不仅仅是SOMEMACRO
,而是字符串的其余部分。
答案 0 :(得分:2)
您的更新实际上让我意识到发生了什么。你是对的,*alnum
吃得比你想要的多。
("#define" >> lexeme[*qi::alnum] >> (qi::double_)[boost::phoenix::ref(mynr) = boost::spirit::_1])
这很有效。
*alnum
正在吃字母数字字符,并在它们之间跳过空格。所以它实际上吃了SOMEMACRO 8
。然后,当我在最后吃8.0
时建议它有效时,那是因为双解析器消耗了.0
。
顶部的新解析器要求*alnum
中间没有空格。
以下是关于语法的新注意事项:
mynr
的双重中。*alnum
包裹在lexeme
中。这会导致解析器在内部不跳过任何字符。"#define SOMEMACRO 8.0"
和"#define SOMEMACRO 8"