我尝试使用由以下规则构造的语法来解析字符串“1-2”:
spirit::qi::rule<Iterator, spirit::utf8_symbol_type()> op1 = "-";
spirit::qi::rule<Iterator, spirit::utf8_symbol_type()> op2 = "+";
spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> numberParser = boost::spirit::qi::double_;
spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> expressionParser;
expressionParser = numberParser >> -( (op1 >> expressionParser) | (op2 >> expressionParser));
start = expressionParser.alias();
其中start是我的语法类的成员:
spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> start;
这里有规则,我想为每个二进制操作+和 - 从左到右创建一个节点。
当我现在使用以下方法解析字符串“1-2”时:
void Parse(const std::string& testString, const CDynamicExpressionSyntaxParser<const char*>& parser)
{
char const* first = testString.c_str();
char const* last = &first[testString.size()];
boost::spirit::utree tree;
bool success = boost::spirit::qi::phrase_parse(first,last,parser, boost::spirit::qi::space,tree);
std::cout << "tree: " << tree << '\n';
}
我在rule.hpp中遇到了访问冲突。我做错了什么?
答案 0 :(得分:2)
我认为原因可以在这里找到:Copy or reference semantics of boost::spirit's rule<>? - 特别是:
当在EBNF表达式右侧的任何位置引用规则时,该规则由引用表达式保存。客户有责任确保引用的规则保留在范围内,并且在引用时不会被破坏。
情况并非如此。
答案 1 :(得分:0)
而不是......
char const* last = &first[testString.size()];
试试这个......
char const* last = &first[testString.size()-1];