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

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@syoyo

C++11 PEG パーザーライブラリ PEGTL のメモ

More than 1 year has passed since last update.

Version 2.x ですと C++11 で動きます.

利点

template プログラミングであるが, コンパイルが早めな気がする.

すくなくとも cpp-peglib よりはコンパイルが早い感じがします.

ヘッダーオンリー.

使いかた

ルールは template で定義します.


using namespace tao::pegtl;

struct sign : one< '+', '-' > {};
struct integer : seq< opt< sign >, plus< digit > > {};

<, > の間のスペースは空いていても空いていなくても問題ありません.

最初はちょっと手間取りますが, サンプルなど見て慣れればだいたい C++11 の仕組みで書けます.

文字列に対して parse する.

memory_input で入力データを作ってから parse に渡します.

std::string uri = ...;
pegtl::memory_input input( uri, "uri" );
pegtl::parse< grammar, uri::action >( input, *this );

ファイルや stdin から入力を受け付ける関数もあります.

action を設定する

ルールにマッチしたときに呼び出す関数(callback)も template で定義します.

   // 必須
   template< typename Rule > struct action {};

   // 個々のルールに対して apply でアクションを定義.
   template<>
   struct action< pegtl::uri::opt_userinfo >
   {
      template< typename Input >
      static void apply( const Input& in, URI& uri )
      {
         if( !in.empty() ) {
            uri.userinfo = std::string( in.begin(), in.size() - 1 );
         }
      }
   };

まずはベースとなる action のテンプレートを定義し, そのあと各ルールごとに template を定義します. ベースの template を定義していないとうまく動きません(なにも起こらない)ので注意です.

また, apply の第二引数と, parse で渡す型が違うととこれもまた何も起こらないので注意です.
e.g.

 std::string ctx;

 // action は `URI` に対して定義しているので, なにもおこらない.
 pegtl::parse< grammar, uri::action >( input, ctx );

問題点

template programming なので, パターンマッチしないときはエラーを出さず何も処理されないので注意です.

したがってデバッグはちょっとめんどいかもしれません. cpp-peglib などで先に grammar を記述してテストしておくのがよいかもしれません.

TODO

1
Help us understand the problem. What is going on with this article?
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
syoyo
RayWa(Ray and Peace)

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?