6

ブースト スピリット (およびブースト フュージョン) のチュートリアル (バージョン 1.48.0) を実行しています。私はおもちゃの従業員の例で遊んでいます。ソースへのリンクは次のとおりです。

http://www.boost.org/doc/libs/1_48_0/libs/spirit/example/qi/employee.cpp

例の文法は次のとおりです。

employee_parser() : employee_parser::base_type(start)
    {
        using qi::int_;
        using qi::lit;
        using qi::double_;
        using qi::lexeme;
        using ascii::char_;

        quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];

        start %=
            lit("employee")
            >> '{'
            >>  int_ >> ','
            >>  quoted_string >> ','
            >>  quoted_string >> ','
            >>  double_
            >>  '}'
            ;
    }

    qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
    qi::rule<Iterator, employee(), ascii::space_type> start;

そして、私の変更により、引用符の処理が削除され、区切り記号の間の任意の文字が解析され、パーサーがマップされている構造体に割り当てられます。

        //quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
        start %=
            lit("employee")
            >> '{'
            >>  int_ >> ','
            >>  +(char_) >> ','
            >>  +(char_) >> ','
            >>  double_
            >>  '}'
            ;

私の仮定では、char_ にはコンマに到達するまでのすべての文字が含まれます。ただし、次の文字列を使用してコンパイルおよび実行すると、解析に失敗します。

./employee
employee{10,my,name,20.0}
-------------------------
Parsing failed
-------------------------

また、構造体型の適切な型に自動的にキャストする同様のパーサーを作成しようとしています。上記のような入力文字列の正しい文法を定義する限り、何か根本的に間違っていると確信しているので、どんな助けも大歓迎です!

ありがとう!

4

1 に答える 1

11

+(char_)は 1 つ以上の文字を消費するため、コンマも消費し、 に移動することはありません>> ','。貪欲です。

+(char_ - ',')差分演算子を使用して、次のように書く必要があります-

//...
>>  int_ >> ','     
>>  +(char_ - ',') >> ','     
>>  +(char_ - ',') >> ','     
>>  double_
//...

パーサー+(char_ - ',')は、コンマに到達するまですべての文字を消費します。その後、 に移動して>> ','消費し、+(char_ - ',')コンマまで次の行に進みます。

この演算子の詳細については、http ://www.boost.org/doc/libs/1_48_0/libs/spirit/doc/html/spirit/qi/reference/operator/difference.html を参照してください。

また

文字のみを含む名前を解析したい場合は、文字のみを受け入れるパーサーを作成することも検討できます。

//...
>>  int_ >> ','     
>>  +(char_("a-zA-Z")) >> ','     
>>  +(char_("a-zA-Z")) >> ','     
>>  double_
//...
于 2012-02-09T09:51:48.223 に答える