2012-03-01 4 views
1

여기 처음 질문하는 곳입니다. 이 작업을 수행하기 위해 이미 많은 시간과 연구가 필요했습니다. 당신이 저를 도울 수 있기를 바랍니다. 나는 성령을 사용하는 초보자 다. 나는 모든 용어를 완전히 이해하지 못한다. 그러나, 심지어 기사와 게시물의 톤을 읽은 후에도 내가 뭘 놓치고 있는지 모른다.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(&gtor::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(&gtor::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시).

+0

구조체에'qg_string' 규칙을 추가하여 해결했습니다. 비록 내가 그것을 해결 한 이유를 완전히 이해하지는 못했지만. 어떤 힌트도 크게 감사하겠습니다. – FannyVH

답변

2

나는 성령의 깊이를 완전히 이해하지 못했다. 그러나 qg_string 파서를 생성자에 선언하면 parse 메서드를 호출 할 때 존재하지 않습니다. 내가 아는 한 계층 구조의 규칙은 여전히 ​​서로 의존합니다. 그것들은 "부모"규칙에 복사되지 않습니다.

1

Smittii와 마찬가지로, 문제는 구문 분석기가 구문 분석기가 생성자에서 로컬로 선언되므로 구문 분석이 호출 될 때 규칙이 더 이상 존재하지 않는다는 것입니다 (구문 분석이 호출 될 때 실행 됨). 주석에있는 구문은 전체 구문 분석에 대해 여전히 존재하므로 작동합니다.

은 기본적으로 문제가 당신이 쓸 때이다 : 단지 참조 (정말 정신 내부 그래서이 날을 인용하지 않는 모른다)

rules_.create_char = 
     (
      qi::lit("CreateChar") 
      >> '(' 
      >> qg_string >> ',' 
      >> qg_string >> ',' 
      >> qi::int_ 
      >> ')' 
     ) 

을 qg_string 일종의 (즉 복사 해왔다되지 않음) rules_.create_char 규칙에서, qg_string 규칙이 생성자를 떠날 때 파괴 될 때, 그것에 대한 매달린 참조가 남게되어, 여러분이 경험하는 충돌로 이어집니다.

copy() 함수를 사용하면 문제가 해결 될 수 있지만 실제로 말한 것처럼 구조체의 규칙이 될 수 있습니다 (대부분의 예제에서는 어떻게 수행되는지보십시오) .

(단지 경우에 따라 this example에서 copy() 함수를 사용하는 예를 확인할 수 있지만이 경우에는 필요하지 않습니다.)

관련 문제