2013-05-27 2 views
5

문법이 작동하지 않아 정수 만 분석 할 때까지 단순화했습니다. 아직도 작동시킬 수는 없습니다. 그것은 다음과 같은 문법이다 :간단한 부스트 :: 스피릿 문법 사용하기?

template<typename Iterator> 
struct rangeGrammar : qi::grammar<Iterator, int()> 
{ 
    rangeGrammar() : 
    rangeGrammar::base_type(number) 
    { 
     using qi::int_; 
     using qi::_1; 
     using qi::_val; 

     number = int_[_val = _1]; 
    } 
    qi::rule<Iterator, int()> number; 
}; 
그것은 단지 정수를 (난 그냥 문법으로 int_ 사용하는 구문 분석 함수를 말할 수 알지만,이에 잘못 알고 wan't 구문 분석하도록되어

예).

내 구문 분석 기능은 다음과 같습니다

/* n is a std::string provided by the user */ 
rangeGrammar<std::string::const_iterator> grammar; 
int num = 0; 
qi::phrase_parse(n.start(), n.end(), grammar, num); 
std::cout << "Number: " << num << std::endl; 

나는 다음과 같은 컴파일러 오류 얻을 :

/boost/spirit/home/qi/reference.hpp: In member function ‘bool boost::spirit::qi::reference::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator >, Context = boost::spirit::context, boost::spirit::locals<> >, Skipper = boost::spirit::unused_type, Attribute = int, Subject = const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator >, int(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>]’: /boost/spirit/home/qi/parse.hpp:89:82: instantiated from ‘bool boost::spirit::qi::parse(Iterator&, Iterator, const Expr&, Attr&) [with Iterator = __gnu_cxx::__normal_iterator >, Expr = rangeGrammar<__gnu_cxx::__normal_iterator > >, Attr = int]’ ../parameter_parser.h:95:46: instantiated from here boost/spirit/home/qi/reference.hpp:43:71: error: no matching function for call to ‘boost::spirit::qi::rule<__gnu_cxx::__normal_iterator >, int(), boost::spirit::unused_type, boost::spirit::unused_type, boost::spirit::unused_type>::parse(__gnu_cxx::__normal_iterator >&, const __gnu_cxx::__normal_iterator >&, boost::spirit::context, boost::spirit::locals<> >&, const boost::spirit::unused_type&, int&) const’ cc1plus: warnings being treated as errors /boost/spirit/home/qi/reference.hpp:44:9: error: control reaches end of non-void function * exit status 1 *

은 문제가 무엇인지 알아낼 수 있습니다. 어떤 도움이라도 대단히 감사하겠습니다.

+7

롤 @ "간단한 부스트 :: 정신이 문법은" –

+2

는 간단한 부스트 성령의 문법이 없습니다. 대신 ANTLR을 사용하십시오. –

+0

나는 IRC의 부스트 팀에서 일종의 갈라진 틈을 피우고 스피릿이 왜 그렇게 낮은 기록을 가지고 있는지 물었습니다. 그는 그것의 실제로 아주 잘 문서화 된 것을 외쳤습니다 ... +1 ANTLR을 사용합니다. – Kivin

답변

11

A :이 문법과 아무것도 작은 잘못,하지만 당신은 선장이 필요 qi::phrase_parse을 사용하고 있습니다. qi::parse을 사용하면 문제가 해결됩니다.

주 1 :[_val=_1] 사용이 완전히 중복; 의미 규칙이없는 규칙 자동으로 속성 전파을 즐길 수 있습니다.

주 2 : 당신은 다음과 같이 분석 할 제나라 :: 일치를 사용할 수 있습니다

#include <boost/spirit/include/qi_match.hpp> 

const std::string input = "1234"; 
std::istringstream iss(input); 
iss >> qi::match(qi::int_ [ std::cout << qi::_1 ]); 

마지막으로 관심을가 여기에 해골 쇼 것으로 테스트를 실행하는 'doParse'기능입니다 좋은 제나라 연습 좀 더 요소 : 당신이 발견 한 것처럼

#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/phoenix.hpp> 

namespace qi = boost::spirit::qi; 
namespace phx = boost::phoenix; 

template<typename Iterator> 
struct rangeGrammar : qi::grammar<Iterator, int()> 
{ 
    rangeGrammar() : rangeGrammar::base_type(number) 
    { 
     number = qi::int_; 
    } 
    qi::rule<Iterator, int()> number; 
}; 

bool doParse(const std::string& input) 
{ 
    typedef std::string::const_iterator It; 
    It f(begin(input)), l(end(input)); 

    try 
    { 
     rangeGrammar<It> p; 
     int data; 

     bool ok = qi::parse(f,l,p,data); 
     if (ok) 
     { 
      std::cout << "parse success\n"; 
      std::cout << "data: " << data << "\n"; 
     } 
     else  std::cerr << "parse failed: '" << std::string(f,l) << "'\n"; 

     if (f!=l) std::cerr << "trailing unparsed: '" << std::string(f,l) << "'\n"; 
     return ok; 
    } catch(const qi::expectation_failure<It>& e) 
    { 
     std::string frag(e.first, e.last); 
     std::cerr << e.what() << "'" << frag << "'\n"; 
    } 

    return false; 
} 

int main() 
{ 
    bool ok = doParse("1234"); 
    return ok? 0 : 255; 
} 
+0

답장을 보내 주셔서 감사합니다! 당신 말이 맞아요, parse_phrase()는 선장을 포함해야합니다. 나는 그 사실을 몰랐습니다. 대신 parse()를 사용하도록 코드를 변경했지만 동일한 오류가 계속 발생합니다. 첫 번째 오류를 읽으면 "오류 : 'boost :: spirit :: qi :: rule <...'에 대한 호출과 일치하는 함수가 없습니다. 아마도 내가 가진 유일한 규칙과 관련이 있습니다. 그러나 나는 그것에 문제가있는 것을 보지 못한다. 또한 내가하려는 일을 수행하는 훨씬 더 간단한 방법이 있다는 것을 알고 있지만 실수를 찾을 수 있도록 문법을 단순화했습니다. – jay1189947

+0

마지막으로 해결했습니다. 실수는 문자열에 반복자를 사용하고 const 문자열에 사용하지 않는다는 것이 었습니다 ... 정말 바보 같아요. 귀하의 코드 조각이 나를 실현하게 만들었습니다. 답장을 보내 주셔서 다시 한 번 감사드립니다! – jay1189947

+0

다행 당신이 듣고있어 :) – sehe