2

次のテキストを解析する必要があります

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

flex や bison を扱う必要がなかったので、boost:spirit を選択しました。

私はついにこの文法を持っていました

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 つが任意の順序で一致した場合に一致することを読みました。すべての文法が任意の順序で 1 回だけ一致する場合にのみ、文法が一致する必要があります。

誰か助けてくれませんか?

4

1 に答える 1

6

Hartmut Kaiser は、この記事でこれを行う方法を説明しています。

no_empties_impl記事で説明されているようにクラスを定義してから、関数を宣言する必要があります

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

次に、文法で、 、 、 、および のそれぞれについてルールを定義する必要positiondirectionありupますFOVy。次に、開始文法は次のようになります (未テスト):

start %=
lit("Camera")
>> '{'
>> position ^ direction ^ up ^ FOVy
>> '}'
    [qi::_pass = no_empties(qi::_0)]
;
于 2012-04-12T19:24:52.080 に答える