問題タブ [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.
parsing - Boost Spiritで解析し、追加のアイテムを取得します
これは多くのコードで長くなるので、StackOverflowがそれに対処できることを願っています。:P
BoostSpiritを使用してSVGパーサーを作成しようとしています。「BezierPoints」のベクトルである「Contours」をベクトルに取り込む文法があります。これは、通常のポイントまたはベジェコントロールを使用したポイントのいずれかを表す場合があります。
これまでのところ、これはあります(相対描画コマンドはまだ処理していません):
文法は次のように呼び出されます。
そして、これは私の現在のテスト文字列です:
読みやすくするために文字列が再編成されました。
出力は次のとおりです。
文法はポイントを見ていますが、それはこれらすべての余分なポイントを入れ続けており、私はそれらがどこから来ているのかわかりません。
PS
私はまた、私のルールのいくつかについて疑問に思っています。まず、このルールがあります:
(drawto_command % *space)
ベクトルのベクトルではなく、単一のベクトルとしての結果が必要です。私の知る限り、これはフェニックスで手動で行う必要があります。そうですか?
私のmovetoルールにも同様のことがあります。
BezierVecを与える2つのルールがあり、3番目のルールのために1つのBezierVecに結合したいと思います。これまでのところ、これを行う唯一の方法は、Phoenixを使用して手動で挿入することであるように思われます。もっと簡単な方法はありませんか?
struct - Boost Phoenix: 構造体の参照メンバーへのバインド?
Boost Phoenix を使用して、参照型メンバーを含む構造体の std::find_if 操作で使用するラムダ関数を生成したいと考えています。考案された例は次のとおりです。
MyStruct::x が int& ではなく int 型の場合、正常にコンパイルされます。しかし、参照メンバーを使用すると、「参照メンバーへのポインターは不正です」というエラーが表示されます。
ネットで調べてみると、Phoenix の「ref」機能を使用する必要があるようですが、必要な構文がわかりません。
これをタイプ 'int&' で機能させる方法を知っている人はいますか?
c++ - 遅延評価に焦点を当てたBoostPhoenixライブラリの理解と使用
Boost Phoenixライブラリ(Spiritプロジェクトに隠されている)について知り、関数型プログラミングスタイルのファンとして(ただし、まだアマチュアです。haskellとスキームに関する小さな経験があります)、このライブラリを試して学びたいと思いました。このライブラリの合理的なアプリケーションについて。
fpスタイルを使用したコードの表現力と明瞭さの向上に加えて、低コストで計算を高速化するための遅延評価に特に興味があります。
小さくて単純な例は次のとおりです。ユークリッド距離行列を使用しているある種のルーティング問題(tspなど)があります。距離行列の値の一部は使用されておらず、一部は非常に頻繁に使用されると想定しています(したがって、呼び出しごとにその場で計算することはお勧めできません)。これで、距離の値を保持する怠惰なデータ構造を持つことが合理的であるように思われます。それはフェニックスでどのように可能でしょうか?(fp-style-programmingがまったくなくても簡単に実行できるという事実を無視して)フェニックスの公式ドキュメントを読んでも、それに答えるのに十分な理解が得られませんでした。
それは可能ですか?(たとえばHaskellでは、後で値を計算できることを保証するサンクを作成する機能は、言語のコアにあります)。
フェニックスで定義されているすべての怠惰な関数でベクトルを使用するとはどういう意味ですか?私は素朴ですが、2つの行列(ベクトル>)をランダムな値で埋めようとしました。1つは通常のpush_backで、もう1つはboost :: phoenix :: push_backで埋め、これらの行列から少量の値のみを読み取ろうとしました。印刷用の容器に保管してください。怠惰なものは常に空でした。私はフェニックスを間違った方法で使用していますか/それは可能であるはずですか?または、フェニックスのコンテナ/アルゴリズムの機能を誤解しましたか?後者の小さな手がかりは、フェニックスに影響を与えたFP++ライブラリに特別なリストデータ構造が存在することです。
さらに:
- フェニックスは何に使っていますか?
- フェニックスに関するいくつかの良いリソースを知っていますか?(チュートリアル、ブログエントリ...)
ご入力いただきありがとうございます。
c++ - boost.spiritを使用してstd::stringを抽出するにはどうすればよいですか?
boost.spiritを使用して、フォームの単純なコマンドラインを解析しようとしますcommand:param1 param2...
そうするために、私はこのパーサーを作成しました:
2つの複合パーサーの属性タイプはベクトルであるため、cmdとparamsがベクトルタイプの場合はこれが機能します。ただし、タイプがstd :: stringの場合は、そうではありません。Webでこのソリューションを検索しているときに、文字列でも機能するはずだというヒントを見つけました。とにかく私はこれを文字列で動作させることができますか?
c++ - Boost.Spirit.Qi:ルールの属性を取得し、それを囲んでいるルールの構造体属性のフィールドとして設定しますか?
これらの他の質問の多くと同様に、Boost.Spirit.Qiを使用して、単純な文法を構造体のツリーに解析しようとしています。
私がやろうとしていることを可能な限り単純なケースに蒸留しようと思います。私は持っています:
後で、文法構造体の中に、次のメンバー変数があります。
私が定義している
しかし、実際に整数を解析しようとすると、
myInteger.value
解析が成功すると、常に初期化されません。同様に、私は次の定義を試しました(明らかにコンパイルされないものは間違っています):
明らかに、私はスピリット、フェニックス、または他の何かについて何かを誤解しています。私の理解では、これがここでqi::_1
の最初の属性でありqi::int_
、角括弧内の部分が関数オブジェクトとして実行されるときに、解析された整数を表す必要があります。integer
次に、関数オブジェクトが囲んでいる属性を受け取りqi::_val
、解析された整数をそれに割り当てようとすると仮定しています。私の推測では、私のBOOST_FUSION_ADAPT_STRUCT
呼び出しのおかげで、この2つは互換性があり、静的分析の観点からは確かにそうであるように見えますが、データは保存されていません。
どこかに欠けている参照(&)指定はありますか?
c++ - Boost.Phoenix を使用する利点は何ですか?
Boost.Phoenix を使用することの本当の利点を理解できません。
Boost.Spirit 文法で使用すると、非常に便利です。
ラムダ関数に使用すると、便利でエレガントです。
しかし、このライブラリの他のすべての利点は何ですか? ドキュメントには、「ファンクターはどこにでもある」と書かれています。よく分からんけど何がいいの?
c++ - Spirit::Qiルールからboost::variantメンバーにアクセスするには?
Spirit-Qi 文法で boost::phoenix を使用して、boost::variant のメンバーにアクセスする適切な方法が見つかりません。これは、私が達成しようとしている簡単な例です。(私の文法全体ははるかに複雑です。これは、言及された問題をテストしている単純なフラグメントです)。
しかし、phoenix::get<> や、Phoenix を使用して boost::variant にアクセスする同様の方法が見つかりません。phoenix::get<> が必要な理由は、特定の型のリストにバリアントを挿入し、この特定の型を継承された属性として子ルールへの参照として渡す必要があるためです。
このような動作を実現する方法はありますか?
返信ありがとうございます
リック
c++ - ブーストスピリットとブーストフェニックスの質問
1。スピリットルールのローカル変数が、ルールに渡されたパラメーターを使用してデフォルトで構築されるように定義することは可能ですか?循環依存関係のあるASTビルダーオブジェクトがあります。親への参照を使用して子を初期化したいのですが、親は子パーサーのルールへの参照によって渡されます。例:rule< Iterator, void(Parent & p), locals<child> > child_parser;
注:上記でやりたいことを行う方法はいくつかあります。私はそれを行う最もクリーンな方法であるため、私が上で述べた特定のアプローチにのみ興味があります。
2。怠惰なフェニックスプレースホルダーへのポインターをどのように渡すのですか?&_r1
またはのように単純にすることはできません&arg1
注:この質問はここで個別に尋ねられています。そこで答えることができます。
三。ラムダ/フェニックスの合併はどのように進んでいますか、合併がいつ行われるかについての考えはありますか?
ps、私の質問に答えてくれてありがとうHartmut:D
c++ - Boost Phoenix (または Boost Lambda) - ポインターを遅延取得する
怠惰なフェニックス値/ ref のポインターを取得する方法はありますか? もしそうなら、どのように?
c++ - Boost.Phoenixで一連のステートメントをstd::transformと一緒に使用するには?
Boost.Phoenix を使用して、数行のコードで構成され、値を「返す」ラムダ関数を作成して、std::transform
.
このような:
これstd::for_each
を使用すると完全に機能std::transform
しますが、コンマ演算子が を返すため、コンパイルできませんvoid
。このようなラムダ関数から値を返すにはどうすればよいですか?
編集:最初に書いたことが自分のやりたいことについて誤解を招いたため、コードフラグメントを変更しました。