Я впервые задаю вопрос здесь. Мне уже потребовалось много времени и исследований, чтобы заставить это работать, и я не могу. Я действительно надеюсь, что вы можете помочь мне с этим. Я новичок, использующий Дух, я не полностью понимаю все термины; однако даже после прочтения множества статей и постов я не знаю, что мне не хватает.
Итак, у меня есть следующая структура и класс в заголовочном файле.
typedef std::string::const_iterator iterator_type;
struct GrammarRules
{
qi::rule<iterator_type, ascii::space_type> create_char;
};
class Parser
{
public:
Parser();
bool parse(std::string const& to_parse);
private:
GrammarRules rules_;
gtor::World * world_;
};
Тогда у меня есть следующее в .cpp файле:
Parser::Parser()
: rules_()
, world_(nullptr)
{
world_ = new gtor::World();
qi::rule<iterator_type, std::string(), ascii::space_type> qg_string;
qg_string %= qi::lexeme[ +(ascii::alnum) ];
rules_.create_char =
(
qi::lit("CreateChar")
>> '('
>> qg_string >> ','
>> qg_string >> ','
>> qi::int_
>> ')'
)
[
phx::bind(>or::World::createCharacter, world_, qi::_1, qi::_2, qi::_3)
]
;
}
...
bool Parser::parse(std::string const& to_parse)
{
iterator_type it = to_parse.begin();
iterator_type end = to_parse.end();
bool success = qi::phrase_parse(it, end, rules_.create_char, ascii::space);
/*qi::rule<iterator_type, std::string(), ascii::space_type> qg_string;
qg_string %= qi::lexeme[ +(ascii::alnum) ];
qi::rule<iterator_type, ascii::space_type> create_char1 =
(
qi::lit("CreateChar")
>> '('
>> qg_string >> ','
>> qg_string >> ','
>> qi::int_
>> ')'
)
[
phx::bind(>or::World::createCharacter, world_, qi::_1, qi::_2, qi::_3)
]
;
bool success = qi::phrase_parse(it, end, create_char1, ascii::space);*/
if (success && it == end)
return true;
return false;
}
Код, который не комментируется методом parse()
, не работает, я получаю Access Violation
, как только синтаксический анализатор получает правило qg_string
. Тем не менее, код, который комментируется, работает отлично. Для меня это выглядит точно так же, за исключением очевидных различий. Может быть, я упускаю что-то очень очевидное, но не могу найти это.
Мне уже потребовалось много времени, чтобы понять, что мой код работает, если я использую все как локальные переменные. И до сих пор не могу найти проблему.
Заранее благодарю за любую помощь.
Извините, если в сообщении есть ошибки (5 утра).