2013-12-11 6 views
2

그래서이 파일의 문자를 입력 할 때 구문을 분석하려고합니다. 가능하다면 전체 문자열을 메모리로 읽지 않을 것입니다.false spirit istream iterator 가양 성을 제공합니다.

이것은 현재 관련 코드입니다. Rosters_Grammar는 원하는 문법을 지정하기 위해 사용하는 문법 파일입니다.

#include "StdAfx.h" 
#include "Interpreter.h" 
#include "Rosters_Grammar.h" 
#include <boost\spirit\include\qi.hpp> 
#include <fstream> 

bool Interpreter::invoke(std::string path) 
{ 
    //Define our parser type and iterator types. 
    typedef boost::spirit::istream_iterator iter_type; 
    typedef Rosters_Grammar<iter_type> parser_type; 

    //Create an instance of our grammar parser and pass it an appropriate project. 
    parser_type grammar_parser(project); 

    //Open the target file and wrap ifstream into the iterator. 
    std::ifstream in = std::ifstream(path); 
    if(in.is_open()){ 

    //Disable Whitespace Skipping 
    in.unsetf(std::ios::skipws); 

    iter_type begin(in); 
    iter_type end; 

    //Phrase parse the grammar 
    return boost::spirit::qi::phrase_parse(begin, 
              end, 
             qi::int_ , 
             boost::spirit::qi::space); 
    } 
    else{ 
    return false; 
    } 
} 

문제는 필자의 구문 분석이 항상 성공하는 것입니다. 명부 문법을 감안할 때 필자는 입력에 따라 작업을 수행하고 올바른 입력에 대해 예상대로 작동하기 때문에 입력의 일부분을 읽는다고 말할 수 있습니다. 그러나 파서는 잘못된 입력에서 실패하지 않으며 파일을 통해 부분적으로 멈추고 true를 반환합니다.

나의 현재 파일 내용

45 브리 23 butter_scotch

이 잘 읽고이를 수락해야한다는 등의 int 문자열의 반복이다. 문자열은

"45 사과 사과 사과"

과 같지 않아야합니다. 그러나이 스팅을 받으면 파서가 실패해야합니다. 대신 "45 Apple"에 대한 작업을 수행 한 다음 구문 분석에 대해 true를 반환합니다. 제 반복기에서는 뭔가있는 것 같지만 확신 할 수 없습니다. 위의 게시 된 코드에서 qi :: int_가 파서로 사용되며 입력 데이터에 관계없이 항상 성공합니다. 따라서 문법 파일이 여기있는 문제와 관련이 없어야한다고 생각하지 않습니다. 지금까지 데이터가 실패하는 유일한 방법은 내 파서 입력으로! qi :: eps를 사용하는 것입니다.

아무도 도와 주셔서 감사합니다.

편집 : 조금 더 살펴보면, 내 선장이 어떤 이유로 문제가된다고 생각합니다. 필자가 이해하는 방식으로, phrase_parse는 2 개의 반복자, 어떤 종류의 문법, 건너 뜀 파서를 전달한다. 스킵 파서에 근거 해 입력을 토큰 화 해, 그 토큰을 문법에 사용합니다.

반복기 유형에 대한 공백 건너 뛰기를 사용하지 않으면 내 결과는 "45 appleappleapple"을 구문 분석하고 "45 apple"만 성공합니다.

답변

2

게시하지 않았기 때문에 문법을 볼 수 없습니다.

I 입력이 완전히 소모 된 처리 여부는 확인이 donot 것을 볼 수 있습니다

return boost::spirit::qi::phrase_parse(
      begin, end, 
      grammar_parser >> qi::eoi, 
      qi::space); 

아니면 반복자를 확인할 수 있습니다

return boost::spirit::qi::phrase_parse(
      begin, end, 
      grammar_parser , 
      qi::space); 

당신이 중 하나에 의해 qi::eoi을 필요로하는 것으로 해결할 수 있습니다 :

bool ok = boost::spirit::qi::phrase_parse(
      begin, end, 
      grammar_parser , 
      qi::space); 

    if (begin != end) 
     std::cerr << "Remaining unparsed: '" << std::string(begin, end) << "'\n"; 

    return ok && (begin == end); 

Finall y, 의 의미 론적 동작의 부작용은 역 추적의 경우 취소 할 수 없습니다.참조 :

+0

와우. 나는 근본적으로 여기에서 틀리다. 나는 전체 입력이 소모 된 경우에만 구문 분석이 성공한 것으로 간주한다고 생각했습니다. 이 모든 시간을 생각하고있었습니다. 현실 확인 주셔서 감사합니다. 이것은 많은 도움이 될 것입니다! – Rabidsheep