Spirit

またlexeme_dではまる

以下はコンパイルエラー。 ※c_id_p, code_blockは自作のparser identifier = c_id_p - keywords; foreach_stmt = lexeme_d[ str_p("for") >> +blank_p >> identifier >> +blank_p >> "in" >> +blank_p ] >> exp >> eol_p >> code_block >> "end" ; しかし、…

lexeme_dの使い方。

以下は間違い。 return_stmt = str_p("return") >> lexeme_d[+blank_p] >> !exp; 正しくは、以下。 return_stmt = lexeme_d[str_p("return") >> +blank_p] >> !exp;

eol_pにマッチしない

こんな感じでparseしてるんだけど、ruleに記述したeol_pにどうやってもマッチしない。 ifstream in(argv[1], ios_base::binary); // 取りあえずバイナリにしてみた。 vector<char> vec; std::copy( istream_iterator<char>(in), istream_iterator<char>(), std::back_inserter(</char></char></char>…

ネストしたlexeme_dはコンパイルエラー

以下のコードはコンパイルエラーとなる。 identifier = lexeme_d[ ((alpha_p | '_') >> *(alnum_p | '_')) ] ; script_val = lexeme_d[ ch_p('@') >> identifier ] ; 以下のように書き換えるとコンパイルに通る。 script_val = lexeme_d[ ch_p('@') >> ((alp…

演算子の優先順位ってどうやってるんだろー。 とか思って、「Spirit Applications Repository」からdscriptなる怪しげな言語の実装を参照してみる。 add_expr = mul_expr >> *(add_op >> mul_expr) ; add_op = ch_p('+') | '-' | '@' ; mul_expr = unary_exp…

epsilon_p/eps_pはHaskellのParsecで言うと'try'にあたるのか? PS ぜんぜん違った・・・

Boostの標準パッケージのSpiritはfch_pとかをサポートしていないようなので、Spiritの公式サイトからインストールする必要あり。 と、思って再インストールしてみたけれど、やっぱりfch_pは存在しない。 なんで? ああ、参考にしたドキュメントが古かったら…