1

次のルールで構成された文法を使用して、文字列「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;

ここでのルールを使用して、左から右への2項演算+および-ごとにノードを作成します。

次の方法を使用して文字列「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でアクセス違反が発生しました。私は何が間違っているのですか?

4

2 に答える 2

2

その理由はここにあると思います: Boost::spirit's rule<>? のセマンティクスをコピーまたは参照しますか? - 特に:

ルールが EBNF 式の右辺のどこかで参照される場合、そのルールは参照によって式によって保持されます。参照されているルールがスコープ内にとどまり、参照中に破壊されないようにするのは、クライアントの責任です。

そうではありませんでした。

于 2012-12-05T13:11:31.997 に答える
0

これの代わりに....

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

これを試して....

char const* last = &first[testString.size()-1];
于 2012-12-05T11:07:00.247 に答える