問題タブ [boost-spirit-x3]
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++ - x3::symbols は結果を移動するため、それを symbol_parser 自体から削除します
そのため、boost 1.59 で提供されている boost::spirit::x3 で奇妙な動作に遭遇しました。
次の方法で「動的」シンボルテーブルを定義しました。
OpCode
と定義されている
現在、必要なルールに埋め込まれた記号テーブルを使用して、次のような入力文字列を解析する場合
結果の ast には、最初のmov
オペランドのみが含まれます。2 番目の mov がありませんが、オペランドは正しく解析されています。結果の AST を出力すると、次のようになります。
デバッガーを使用して、symbols.hpp のエラーの原因を特定しましたsymbol_parser::parse()
。
move_to
ビーイング
で:
ご覧のとおりsrc
、symbol_parser に追加された OpCode インスタンスが移動されています。これは、最初の呼び出しの後に再び空になることを意味し、そのため最初の命令のみが表示されます。簡単に言えば、シンボルテーブルから移動しました。
最後に私の質問: これはバグですか、それとも間違いですか?
c++ - セマンティックアクションからboost::string_refを構築するSpirit X3
ブーストスピリットX3とstring_refクラスと混同しています。string_ref オブジェクトの作成方法。コンソールは次のようなものを出力します:
それを「通常の型名」に変換する方法がわかりませんが、ブーストイテレータ範囲から string_ref を作成する必要があるように思えますか?
ルールは次のとおりです。
c++ - Boost Spirit X3で「ストリーム」解析を行う方法は?
istream
x3を使用してから解析する正しい方法を見つけようとしています。古いドキュメントは何かを参照してmulti_pass
いますが、これを引き続き使用できますか? または、バックトラックできるように X3 のストリームをバッファリングする他の方法はありますか?
c++ - Boost.Spirit.x3 は、同じタイプの 2 つの連続する属性をベクトルに折りたたむことを回避します。
Boost.Spirit を学習しようとしていますが、問題が見つかりました。
文字列を次の構造に解析しようとしています。
そして、同じタイプの 2 つの属性が背中合わせにある場合、それらは (論理的に)std::vector
そのタイプの に折りたたまれているようです。そのルールのため、次のパーサー
の属性を持つことになりますstd::vector<std::string>
。
しかし、私は this を that に解析しようとしてstruct
います。つまり、私にとって理想的な属性は aboost::fusion::tuple<std::string, std::string>
であるため、構造体をそれに適応させることができます。
動作しないコードの完全版 (上記参照):
static_assert
このコードは、属性が正しくないことを通知するトリガーとなります。
のコマンドで
(GCC でも失敗します)。
私が試したこと
この問題の回避策を見つけましたが、面倒で、これが最もクリーンな方法だとは信じられません。
私は本当にその解決策が好きではありません:それは精神の驚くべき表現力を台無しにし、それを非常に醜くします。また、employee
構造体に新しいフィールドを追加したい場合は、私のBOOST_FUSION_ADAPT_STRUCT
,これははるかに簡単です。
問題は、同じタイプの 2 つの連続する属性を (できれば) と から にきれいに分割する方法がstd::vector
あるboost::fusion::vector
かどうかです。
ここまでやってくれてありがとう;)。
c++ - ブースト スピリット X3 で些細なファイルを効率的に解析する
私は C++ と Boost Spirit X3 の初心者です。私のプロジェクトでは、次の構造を持つ 2 つのファイルから地社会グラフを解析し、ブースト スピリット X3 をブースト グラフに入れます。
私は実用的な実装を持っています。私はライブラリの経験がないので、このアプローチについてどう思うか、別のアプローチを取ることをお勧めしますか.
グラフ ファイルには、エッジごとに 1 つの行があります。ノードが以前に見られなかった場合に備えて、エッジを解析している間、グラフのノードを作成する必要があります。そのノードがすでにグラフにあるかどうか、ノード ID に遭遇するたびにチェックするセマンティック アクションを使用します。行全体を読んだ後、エッジを追加するセマンティック アクションを使用します。
位置ファイルには、特定の時点でのノードの既知の位置ごとに 1 つの行があります。ノードの既知の最初の位置をグラフに保存します (カスタム ブースト グラフ プロパティを使用)。
具体的な質問が必要ですが、ご意見やご提案をいただければ幸いです。
- グラフ ファイルに対して行っているように、ネストされたセマンティック アクションを使用しても問題ありませんか? これはパフォーマンスに影響しますか?
- Spirit X3 で一度にファイル全体を解析することをお勧めしますか、それとも、Spirit X3 ですべての行を個別に解析する必要がありますか?
グラフ (グラフのエッジを示す)
場所
Spirit X3 解析コード
X3 によって呼び出されるセマンティック アクション
ブーストグラフ
c++ - boost::spirit::x3 属性の互換性ルール、直感、またはコード?
さまざまなspirit::x3ルール定義操作が属性の互換性にどのように影響するかを説明するドキュメントはどこかにありますか?
私が驚いたのは:
Fusion に適応した構造体に移動できませんでした:
とりあえず、最初の必須のアルファベット文字を取り除きましたが、名前の文字列は文字で始まらなければならないことを定義する規則を表現したいと思います。これは、機能するまで追加を試みる必要がある状況の 1 つですeps
か、それとも上記が機能しない理由が明確に示されていますか?
見つけられなくてどこかに書いてありましたらすみません。
c++ - ブーストスピリット×3で時間をコンパイル
新しい Spirit X3 (ブースト 1.61.0) を使いこなそうとしています。
私のマシンは、Linux を実行している MacBook Pro (i7-4750HQ) です。
Spirit のバージョン 2 を使用していたので、長いコンパイル時間に慣れていましたが、これは正しくありません。次の式パーサーの最初のステップでは、コンパイルに 20 秒が必要です。
X3の方が速いと思っていたのですが、これで妥当でしょうか? 私のコードは最適ではありませんか?
コンパイラ設定 (clang 3.8.0)
コード: