그래서이 파일의 문자를 입력 할 때 구문을 분석하려고합니다. 가능하다면 전체 문자열을 메모리로 읽지 않을 것입니다.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"만 성공합니다.
와우. 나는 근본적으로 여기에서 틀리다. 나는 전체 입력이 소모 된 경우에만 구문 분석이 성공한 것으로 간주한다고 생각했습니다. 이 모든 시간을 생각하고있었습니다. 현실 확인 주셔서 감사합니다. 이것은 많은 도움이 될 것입니다! – Rabidsheep