여기 처음 질문하는 곳입니다. 이 작업을 수행하기 위해 이미 많은 시간과 연구가 필요했습니다. 당신이 저를 도울 수 있기를 바랍니다. 나는 성령을 사용하는 초보자 다. 나는 모든 용어를 완전히 이해하지 못한다. 그러나, 심지어 기사와 게시물의 톤을 읽은 후에도 내가 뭘 놓치고 있는지 모른다.Boost Spirit Rule의 배정 연산자
그래서, 다음과 같은 구조체와 클래스가 헤더 파일에 있습니다. 그런 다음
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_;
};
i를 .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시).
구조체에'qg_string' 규칙을 추가하여 해결했습니다. 비록 내가 그것을 해결 한 이유를 완전히 이해하지는 못했지만. 어떤 힌트도 크게 감사하겠습니다. – FannyVH