Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用'alias()解析spirit规则时发生访问冲突`_C++_Alias_Boost Spirit_Boost Spirit Qi - Fatal编程技术网

C++ 使用'alias()解析spirit规则时发生访问冲突`

C++ 使用'alias()解析spirit规则时发生访问冲突`,c++,alias,boost-spirit,boost-spirit-qi,C++,Alias,Boost Spirit,Boost Spirit Qi,我尝试使用以下规则构造的语法来解析字符串“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> numb

我尝试使用以下规则构造的语法来解析字符串“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();
spirit::qi::rule op1=“-”;
精神::qi::规则op2=“+”;
精灵::qi::规则编号Parser=boost::精灵::qi::双;
spirit::qi::规则表达式解析器;
expressionParser=numberParser>>-((op1>>expressionParser)|(op2>>expressionParser));
start=expressionParser.alias();
其中start是我语法课的一员:

spirit::qi::rule<Iterator, spirit::utree(), spirit::qi::space_type> start;
spirit::qi::规则开始;
根据这里的规则,我想从左到右为每个二进制操作+和-创建一个节点

当我现在使用以下方法解析字符串“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'; 
}
void解析(const std::string和testString,const cdynamicsexpressionsyntaxparser和parser)
{
char const*first=testString.c_str();
char const*last=&first[testString.size()];
精神树;
bool success=boost::spirit::qi::phrase_parse(第一个,最后一个,解析器,boost::spirit::qi::space,tree);
std::cout而不是这个

char const* last = &first[testString.size()];
试试这个

char const* last = &first[testString.size()-1];

我认为原因可以在这里找到:-尤其是:

当规则在EBNF表达式右侧的任何位置被引用时,该规则由表达式通过引用持有。客户端有责任确保被引用的规则保留在范围内,并且在被引用时不会被破坏


事实并非如此。

no-使用此修复程序,其他示例无法正确解析(并且无法修复访问冲突)+1 foor良好信息。这可能会帮助其他人。我将在SEO的标题或标记中偷偷提及
rule::alias()