2012-04-12 3 views
2

나는부스트 :: 정신 순열

Camera { 
    position 0 0 0 
    direction 0 -1 0 
    up 0 1 0 
    FOVy 45 
} 

내 선택은 부스트 ​​갔다 텍스트의 다음 조각을 구문 분석 할 수 있습니다 정신을 내가 플렉스 또는 들소와 거래를하지 않았 때문이다.

내가 마지막으로이 문법을했다

struct camera_grammar : qi::grammar<Iterator, camera(), ascii::space_type> 
{ 
    qi::rule<Iterator, camera(), ascii::space_type> start; 

    camera_grammar() : camera_grammar::base_type(start) 
    { 
     start %= 
     lit("Camera") 
     >> '{' 
     >> (lit("position") >> float_ >> float_ >> float_) 
     >> (lit("direction") >> float_ >> float_ >> float_) 
     >> (lit("up") >> float_ >> float_ >> float_) 
     >> (lit("FOVy") >> int_) 
     >> '}' 
     ; 
    } 
}; 

문제는 중괄호 내부의 부품도 교환 할 수있다; 순열 연산자 ^에 대해 읽었습니다.하지만 적어도 하나의 피연산자가 임의의 순서로 일치 할 때이 값을 읽습니다. 모든 문법이 순서에 있고 한 번만있는 경우에만 일치시킬 문법이 필요합니다.

누군가 나를 도울 수 있습니까?

답변

6

하츠 무트 카이저가이를 수행하는 방법을 설명합니다. in this article.

당신이 문서에 설명 된대로 no_empties_impl 클래스를 정의하려면, 다음 문법,

phoenix::function<no_empties_impl> const no_empties = no_empties_impl(); 

그런 다음 함수를 선언합니다, 당신은 directionposition의 각 규칙을 정의 할 수 있습니다 , upFOVy. 그런 다음 시작 문법은 (테스트되지 않음) 같습니다 :

start %= 
lit("Camera") 
>> '{' 
>> position^direction^up^FOVy 
>> '}' 
    [qi::_pass = no_empties(qi::_0)] 
;