したがって、私は次の精神カルマ ルール本体を持っています。
base_rule =
eps(_r1 != 0) [ // _r1 is a pointer_typed placeholder
eps
]
;
これにより、g ++からのかなり長いエラーメッセージが表示され、(役に立つ) で終わります:
/opt/dev_64_swat/Boost/include/boost/spirit/home/phoenix/operator/comparison.hpp
:37:5: error: ISO C++ forbids comparison between pointer and integer
[-fpermissive]
これは有効な C++ です。
struct zebra{};
int main()
{
zebra * x;
if( x == 0);
}
boost::phoenix::static_cast_<_r1_type *>(0)
整数に変換するだけでなく、試してみようと思いまし_r1_type
た(はい、それは間違っています。単なる実験でした)。
質問:
ポイントがゼロのときにルール本体の評価を防ぐために、スピリット eps コンストラクトを使用してプレースホルダーでポインター テストを実行するにはどうすればよいですか?
すべての「C++ 関数型プログラミング ライブラリの使用法」の質問と同様に、私は答えがぼんやりした感じになることを期待しています。
答え
Ildjam のポイントは、私の質問に直接答えます。私の問題には2つの問題がありました。上記の間接的な問題があります。そして、それは PEG の条件に関係しています。私が表現しようとしていることは、次のように書く必要があります。
rule = ( eps(_r) << ( /* grammar for when pointer is not null */ ) )
| eps // otherwise dont do anything.
;
文法の条件部分を表現するために、セマンティック アクション ボディ ([] ブロックで指定) を使用していました。不思議なことに、以前に条件付き PEG 文法を書いたことがありますが、間違いを犯したため、2 番目のクラスの問題が発生しました。
したがって、eps(_r1) はそのトリックを行います。2 番目のタイプのコンパイルの問題は、質問とは無関係です。