ブースト スピリット (およびブースト フュージョン) のチュートリアル (バージョン 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
-------------------------
また、構造体型の適切な型に自動的にキャストする同様のパーサーを作成しようとしています。上記のような入力文字列の正しい文法を定義する限り、何か根本的に間違っていると確信しているので、どんな助けも大歓迎です!
ありがとう!