2017-02-20 5 views
0

부스트 :: 스피릿을 배우려고 시도하고 있으며 C 스타일 식별자의 간단한 예제를 다루고 싶습니다. 아래의 문법은 'incompatible_start_rule'이라고 주장하여 컴파일하지 않습니다. 목표는이 문법이 기본 속성 전달 규칙처럼 문자열의 벡터 대신 문자열을 반환하는 것입니다.부스트 스피릿 문법 사용자 정의 속성

template <typename IT> 
struct cppIdentifier : qi::grammar<IT, std::string, space_type()> 
{ 

    cppIdentifier() : cppIdentifier::base_type(start) 
    { 
     start = char_("a-zA-Z_")[boost::phoenix::push_back(_val, _1)] 
       >> *(char_("a-zA-Z0-9_")[boost::phoenix::push_back(_val, _1)]); 
    } 

    qi::rule<IT, std::string, space_type> start; 
}; 

이 작업을 수행하려면 어떻게해야합니까?

또한이 특정 문제에 대해 대안적이고 편리한 옵션이 많이 있음을 잘 알고 있지만 맞춤법 문법의 속성 유형을 조작하는 방법에 학문적으로 관심이 있으니 참고하시기 바랍니다. 대답 대신에 주석에 (있는 경우, 상속 속성 유형) 사전에

덕분에,

답변

2

첫째로, 당신은 규칙의 출력 속성 유형을 지정하는 기능 서명 스타일의 템플릿 매개 변수를 사용해야합니다. qi::grammar<IT, std::string, space_type()> 대신 qi::grammar<IT, std::string(), space_type>을 시도하십시오.

둘째, 당신은 정말 여기에 의미 조치가 필요하지 않습니다 -하지만 당신은 구문 분석기를 사용할 계획이라면, 당신은 lexeme[] 지침이 필요합니다 : 당신이 전달되었는지 확인,

template <typename IT> 
struct cppIdentifier : qi::grammar<IT, std::string(), qi::space_type> 
{ 
    cppIdentifier() : cppIdentifier::base_type(start) 
    { 
     start = qi::lexeme[char_("a-zA-Z_") >> *(char_("a-zA-Z0-9_"))]; 
    } 

    qi::rule<IT, std::string(), qi::space_type> start; 
}; 

마지막을 호환 가능한 선장 개체를 phrase_parse에 추가 :

std::string s = "HELLO 123"; 

cppIdentifier < std::string::const_iterator> id; 

std::string ident; 

qi::phrase_parse(s.cbegin(), s.cend(), id, qi::space_type(), ident); 

// without lexeme[], ident becomes "HELLO123", not "HELLO" 
+1

[tag : boost-spirit]의 [SO] 태그에 오신 것을 환영합니다. 귀하의 도움을 많이 주시면 감사하겠습니다! – sehe

+1

정말 고마워요! 귀하의 답변을 포함하여 사이트에서 많은 것을 배웠습니다. 제가 조금만 도울 수 있다면 시도해 봅니다. 나는 또한 나 자신의 대답을 쓰는 것으로부터 꽤 많이 배운다. –

+0

예! 그게 효과가있어, 고마워. 분명히 규칙과 문법 템플릿 인수를 더 깊이 파고들 필요가 있습니다. –