Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

Boost.Spiritについて少しメモした

C++ Boost(またはテンプレートプログラミング)の最大のアプリケーションは何か?

→ 諸説あるが、Template ExpressionかSpiritのどちらかだらうという人は結構多い。

スクリプトエンジンプログラミングという名著がある。
https://www.sbcr.jp/product/4797347623/
私は、ここから、Boost.Spiritに入った。

Flex/Bisonとはまた違う世界である。

 1#include <iostream>
 2#include <string>
 3#include <boost/spirit.hpp>
 4using namespace std;
 5using namespace boost::spirit;
 6
 7struct Watashino_Grammar : grammar<Watashino_Grammar>
 8{
 9    template<typename ScannerT>
10      struct definition
11      {
12          typedef rule<ScannerT> rule_t;
13          rule_t r;
14
15          definition( const Watashino_Grammar& )
16          {
17              r = ch_p('b') >> *ch_p('a') >> ch_p('c');
18          }
19          const rule_t& start() const { return r; }
20      };
21};
22
23#include <typeinfo>
24int main()
25{
26    Watashino_Grammar parser;
27
28    string line;
29    while( cout<<"# ", getline(cin, line) )
30    {
31        parse_info<string::const_iterator> info =
32            parse( line.begin(), line.end(), parser );
33        cout << (info.full ? "OK" : "fail") << endl;
34    }
35    return 0;
36}

7-21行目のScannerTとか、rule_tとかは、超絶技巧が使われているので、ここではあまり立ち入らない。(逃げる)
まず、どこを注意すればいいのかという話になりそうだが、これは15-18行目の部分である。

15          definition( const Watashino_Grammar& )
16          {
17              r = ch_p('b') >> *ch_p('a') >> ch_p('c');
18          }

次に、*ch_p('a')を見てみると、*が付いているが、これは任意の文字の繰り返し(0回も含む)という意味である。

実行してみる。。。


# g++ bac.cpp -lboost_system
In file included from bac.cpp:3:0:
/usr/include/boost/spirit.hpp:18:4: warning: #warning "This header is deprecated. Please use: boost/spirit/include/classic.hpp" [-Wcpp]
 #  warning "This header is deprecated. Please use: boost/spirit/include/classic.hpp"
# ./a.out 
# bac
OK
# baaac
OK
# bc
OK
# ba
fail
#  

https://www.sbcr.jp/product/4797347623/
↑を参考にしたBoostの特徴

■ Bison/Flexより小回りが利く。(ファイルを分けなくて良い等)
■ Bison/FlexはLALR(1)だが、Boostは再帰下降パーサ。(`ー´)b

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
1
Help us understand the problem. What are the problem?