0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?