2017-02-15 28 views
3

(免責事項、私はブースト精神を学んでいます)私はこのような式を解析しようとしています文字列(チー:: as_wstring)として整数を解析しよう

を: F(1)

と1を文字列(数字の代わりに "1"(qi :: int_で動作))として取得したい。

として任意の洞察力を私は(間違っている、多分私は正しい方向にしています)このような何かを試してみましたが、結果の文字列だけではなく、「」

の「\×1」であります数字を文字列に解析するために必要なものは何ですか?

template <typename Iterator> 
struct range_parser : boost::spirit::qi::grammar<Iterator, RangeResult(), iso8859_1::space_type> 
{ 
    range_parser() : range_parser::base_type(start) 
    { 
     using qi::lexeme; 
     using qi::int_; 
     using iso8859_1::digit; 

     number_as_string %= lexeme[ +(int_) ]; 

     start %= 
      qi::lit("F") 
      >> '(' 
      >> number_as_string 
      >> ")" 
      ; 
    } 

    qi::rule<Iterator, std::wstring(), iso8859_1::space_type> number_as_string; 
    qi::rule<Iterator, RangeResult(), iso8859_1::space_type> start; 
}; 
+0

誰かがqi :: as_wstringの部分を削除するためにタイトルを編集できますか?それは関連性がない(私は思う) – Max

+4

'+(int_)(1つ以上の整数)の代わりに' +(digit) '(1つ以上の数字)を書くことを意味すると思います。 'int_'(範囲チェックなし、+/-符号なし)と同じことをしないことに注意してください。 int_で認識される入力を取得する場合は、rawディレクティブを使用してみてください: 'raw [int_]' http://www.boost.org/doc/libs/1_63_0/libs/spirit/doc/html/spirit /qi/reference/directive/raw.html –

+0

(プロジェクトに戻ってきました)ちょっと@BorisGlick、これを答えとして入れて、答えとして受け入れることができますか?ありがとう。おかげさまで – Max

答えて

1

私はあなたの代わりに+(int_)(1つの以上の整数)の+(digit)(1桁以上)を記述するためのものだと思います。 +(digit)qi::int_と同じことを行いません(範囲チェックなし、+/-符号なし、数字の制限なし、"000"などの入力を受け入れるなど)。

あなたはqi::int_によって認識入力をキャプチャしたい場合は、生のディレクティブ使用してみてください:必要に応じてraw[int_]http://www.boost.org/doc/libs/1_63_0/libs/spirit/doc/html/spirit/qi/reference/directive/raw.html

を、それが両方に解析された値とqi::int_パーサの生の入力を保存することが可能ですここをクリックしてください:qi::rule with inherited attribute as inherited attribute

+0

ありがとうございます。私は簡単なことをしていますが、私はまだ精神パーサを学んでいます。 – Max

+0

よろしくお願いします!私はしばらくそれを使ってきましたが、まだ "学習"段階にあります。 –

関連する問題