C++で再帰下降パーザライブラリ

再帰下降パーザを書くだけなら誰でもできることなのだが、本当に一日中悩んでやっと低機能なものが動くようになった。
最終的にはPEGをサポートしたいところである。

たとえば

<hoge> ::= alpha alpha digit <foo>
<foo> ::= digit

なんて文法があったら

#include <iostream>
#include "peg.hpp"

struct Foo
{
  char v;
  void action(digit x) {
    v = x.v;
  }
};

struct Hoge
{
  string v;
  
  void action(alpha x, alpha y, digit z, const Foo& f) {
    v += x.v;
    v += y.v;
    v += z.v;
    v += f.v;
  }
};


int main()
{
  parser<Hoge> parser;
  bool failed;
  Hoge h = parser.parse(&failed, "ya1234");

  std::cout << h.v << std::endl;
  
  return 0;
}

って書くだけで、カスタムアクションとASTつきのパーザがなぜか出来上がるという謎実装。
そして、異様にコンパイルに時間がかかる。
さらにちょっと書き間違えただけで、大量の謎エラーメッセージ