2011-12-15 2 views
15

표준 ascii::space_type skipper는 물론 내 의견을 건너 뛰지 않습니다. 문서에는 독자가 건너 뛰기 구문 분석기를 만들 수 있다고 언급되어 있지만 실제로 수행하는 방법에 대한 예는 없습니다.Boost :: Spirit이있는 사용자 정의 스킵 파서

난 그냥 예제 코드가 필요하거나, 나는 지금 2 시간 동안 인터넷 검색을 해왔다.

나를 정확히 가리 키지 마십시오. examples, 몇 가지 링크가 절망적으로 오래되어 Spirit 1.6을 처리합니다.

+0

Boost 배포와 함께 제공되는 예제를 보았습니까? –

답변

27

몇 가지 실험 후, 나는 사용자 정의 선장을 지정하는 방법을 발견하고 여기 개설 할 것이다 :

template<typename Iterator> 
struct pl0_skipper : public qi::grammar<Iterator> { 

    pl0_skipper() : pl0_skipper::base_type(skip, "PL/0") { 
     skip = ascii::space | ('{' >> *(qi::char_ - '}') >> '}'); 
    } 
    qi::rule<Iterator> skip; 
}; 

template<typename Iterator, typename Skipper = pl0_skipper<Iterator>> 
struct pl0_grammar : public qi::grammar<Iterator, Skipper> { 

    /* The rules use our skipper */ 
    qi::rule<Iterator, Skipper> start; 
    qi::rule<Iterator, Skipper> block; 
    qi::rule<Iterator, Skipper> statement; 

}; 

비밀 거짓말을 파서의 호출. 웬일인지 parse_phrase을 사용하여 구문 분석을 수행하려면 선장 문법 개체를 제공해야합니다. 나는 이것을 알지 못했습니다 :

typedef std::string::const_iterator iterator_t; 
typedef parser::pl0_grammar<iterator_t> grammar; 
typedef parser::pl0_skipper<iterator_t> skipper; 

grammar g; 
skipper ws; 

iterator_t iter = str.begin(); 
iterator_t end = str.end(); 
bool r = phrase_parse(iter, end, g, ws); 

이것은 작동합니다.

+1

감사합니다. 오늘 나 한테 많은 시간을 절약 해 줬어! – Dilawar

관련 문제