問題タブ [boost-phoenix]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - BoostC++フェニックス式ツリーの変換
Boost Phoenixの記事「式ツリーの変換」では、カスタムクラスの特殊化のセットを使用して、バイナリ算術式を反転しています。invert_actions
たとえば、;a+b
になります。になります; 両方ともその逆です。a-b
a*b
a/b
これには、式ツリーの再帰的なトラバーサルが含まれますが、明示的に処理されていない演算子を含む式が検出されると、このトラバーサルは停止します。たとえば、_1+_2-_3
はになりますが_1-_2+_3
、その_1+_1&_2
ままになります(のハンドラーはありません&
)。let(_a = 1, _b = 2) [ _a+_b ]
また、変更されません。
これは記事の意図どおりだと思っていましたが、最後にリストされているテストを見ると、変更されることif_(_1 * _4)[_2 - _3]
が予想されます。提供されたコード(ここ)では、そうではないことがわかりました。
次に、明示的にリストされた(n-ary)演算子のセットすべてに適用される一般的なBoostPhoenix式ツリー変換を定義するにはどうすればよいですか。他を変更せずに残しますか?
いくつかのコードが役立つ場合があります。次のC++11コード(自動)を出力したいのですが、;0
ではありません。、またはその他の演算子/ステートメントを明示的に処理することなく。2
&
c++ - BoostPhoenix式内の関数本体の変換
Boost Phoenix式の変換に関数本体を含めるにはどうすればよいですか?
たとえば、Boost Phoenix Starter Kitのレイジー関数セクションに基づいて構築し、レイジー加算関数を作成しました。
次に、前の質問からの単純なプラスからマイナスへの変換を準備します。これを次に示します。
ただし、以下に示すようにlambda
、を使用して逆フェニックス式をmy_add
引数に適用すると、意図した逆変換が達成されていないようです。フェニックス内で関数呼び出しを実装するための推奨される方法はありますか?それはそのような変換を容易にすることができますか?
c++ - ブースト 1.53 で phoenix::bind qi::_val を実行できない (リグレッション ?)
以下のコードは、boost::spirit を使用しており、boost 1.44 および boost 1.49 で動作していました。
boost をバージョン 1.53 に更新しましたが、このコードはコンパイルできなくなりました。g++ が不平を言う
修正方法がわかりません。次のコードがコンパイルされます。
問題は qi::val_ にあると思います... boost::spirit の API が変更されたのでしょうか、それともインクルード ファイルがありませんか?
--std=c++0x で g++4.7 を使用しています。
ここでは、問題を再現するために小さなテスト ケースを試しました。エラーメッセージは同じではありませんが (それでも大きいです!)、ここでも逆参照演算子が問題のようです。
c++ - 霊界で使用する鳳凰関数を作成する
以下のコードをコンパイルしようとしていますが、いつものように、spirit/phoenix のエラーは、何が間違っているかについての手がかりをあまり与えません。誰が問題が何であるかを見ることができますか?
c++ - ブーストスピリット/鳳凰/C++11のやり取りで混乱
私はできる限りこの問題を軽減しようとしました。
コメントを外すvoid initialize()
と、このコードはコンパイルされます。コメントアウトしたままにしておくと、ビルドされません。
この問題を解決するために私が見つけた唯一の方法は、C++03 モードでビルドすることboost::shared_ptr
ですstd::shared_ptr
。
OS X Lion (libc++ を使用) では標準の clang コンパイラを使用し、CentOS 6.4 x64 では次のコンパイラを使用してみました。
いつものように、spirit からのコンパイラ出力は非常に冗長なので、要旨として含めました。
コードは続きます...
c++ - Boost C++ Phoenix ユーザー定義引数での添字 operator[] エラー
などの既存の Boost Phoenix (プレースホルダー) 引数_1
を使用して、配列/添え字演算子を使用できます。たとえば、次の抜粋では1
.
ただし、独自のプレースホルダー引数を定義すると、次のようになります。
ただし、飾らなくても問題なく動作します (次の出力は 7 です)。
(上記のように)添字演算子を使用しようとすると:
多くのエラーが発生します。要約すると、G++ 4.7.2 では、テンプレート引数の推論が失敗します。Clang 3.2 では、関数は配列型を返せないと言われました。
Phoenix プレースホルダー引数で添字演算子をサポートするにはどうすればよいですか?
c++ - Boost Phoenix 式を文字列化できますか?
Boost Phoenix 式を C++ の代表的な文字列に変換できますか? ができた:
次に、次のようなものを含む文字列を生成する可能性があります。
この例には荒削りな部分があることは承知していますが、これらの線に沿って何かが試みられたのでしょうか?
c++ - boost::phoenix::lambda 内から関数を呼び出す
boost::phoenix
C++11 をサポートしていない古いコンパイラで C++ ラムダ式をエミュレートしようとしていますが、ラムダ式内から単純な関数を呼び出すことができません。
C++11 バージョン:
私の Phoenix Lambda コードは次のとおりです。
これにより、次のコンパイラ エラーが発生します。
Phoenix ラムダ式内から関数を呼び出すにはどうすればよいですか?
phoneix::lambdas
過去に C++11 ラムダを使用したのと同じ方法で使用できることを望んでいます。