2012-01-12 6 views
2

を解析されていません。Boost.Spirit私はブースト::精神::気のルールを持って、全体入力

auto dquote = qi::char_('\"'); 
auto comma = qi::char_(','); 
auto newline = qi::char_('\n'); 
auto nonEscaped = *(qi::char_ - newline - comma - dquote); 
auto escaped = *qi::blank >> dquote >> *((qi::char_ - dquote) | (dquote >> dquote)) >> dquote >> *qi::blank; 
auto field = nonEscaped | escaped; 

私は入力を解析しようとすると:

string input(" \"e\"\"e\" "); 
qi::phrase_parse(begin(input), end(input), field, qi::char_('\r')); 

入力が完全ではありませんescapedルールと一致しますが、nonEscapedルールのみが適用されます。したがって、最初のスペースのみが一致します。スピリットを理解して、入力全体を解析するか、できるかぎり解析するにはどうすればよいですか?

fieldルールのバリアントの順序を次のように変更すると、機能します。しかし、それは正しい解決策ですか?

auto field = escaped | nonEscaped; 

答えて

3

はい、並べ替えが適切なソリューションです。

ブーストスピリット

を意味し、LL parsersとして知られているものを生成これは、左から右への入力を解析し、文章のLeftmost derivationを構築(LRパーサと比較従ってLL)

簡単な言葉では、それは最初の可能なトークンと一致し、ルールが失敗しない限り、バックトラッキングを実行しません。あなたはでした「アサート」nonEscapedルールの終わりの種類の事後条件、参照

セマンティックアクションで_passに割り当てる

  • 、しかし

(失敗する偽)boolを返し、セマンティックアクション関数オブジェクトを使用し、実際に、これは(例えば、不必要なバックトラック、)次善のパーサにつながります

HTH

関連する問題