2012-04-12 5 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_) 
     >> '}' 
     ; 
    } 
}; 

この文法を持っていた問題は、中括弧内の部品も交換することができることです。私は置換演算子^について読んだことがあるが、オペランドの少なくとも1つが任意の順序でマッチすると、そのマッチを読み込む。文法が必要なのは、それらのすべてが何らかの順序で一度だけあるときだけです。

誰かが私を助けることができますか?

答えて

6

ハルトムートカイザーがこれを行う方法を説明していますin this article

あなたが記事で説明したようにno_empties_implクラスを定義したい、そして、あなたの文法で、

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

次に、関数を宣言するだろう、あなたは、directionpositionごとにルールを定義することをお勧めします、up、およびFOVy。次に、開始文法は(未テスト)のようになります。

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