問題タブ [boost-spirit-qi]
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.
compilation - 個別にコンパイルされた boost::spirit::qi 文法を作成する方法はありますか?
Boost Spirit の Qi パーサーの文法は素晴らしく、私はいつもそれらを小さなことのために使用しています。ただし、別の文法を作成できるようにしたい場合もあります。
これは、適切な文法を #include してそれらをつなぎ合わせることにより、1 回のコンパイルで簡単にオールインワンで実行できます。ただし、これにより、コンパイル時間が屋根を通過し始めます。他にも欠点があります。
個別にコンパイルされた文法を構成する方法はありますか? 言い換えれば、ヘッダー ファイルで文法のインターフェイスを定義し、テンプレートを実装し、別のコンパイル ユニットで特定の Iterator のインスタンスを作成してから、完全なテンプレートがなくても、別の文法を使用できるようにしたいと考えています。定義はコンパイル時に表示されます。つまり、文法をルールで間接的に使用できるようにしたいのです。
そのようなことは可能ですか?もしそうなら、どのようにそれについて行くでしょうか?
c++ - Boost Spirit 2.4.2: 文字列を抽出できない
解決済みの質問Boost Spirit: Error C2664, Cannot convert 'const boost::phoenix::actor<Eval>' to 'char' に従って、別の質問があります。
以下のコードを js_key と js_string に使用すると、「str」または「str」の形式で文字列をキャプチャできないのはなぜですか。それらは常に空白に戻ります!
例えば:
入力:{"a":"aa", b:'c'}
実際の出力:
期待される出力:
ご教授ください。ありがとうございました!
c++ - boost :: spirit :: qi :: parse()がこのboost :: Variantの値を設定しないのはなぜですか?
テキストをboost::Variantに解析しようとすると、バリアントの値は変更されません。パーサー自体は正常に機能しているように見えるので、バリアントコードで何か問題が発生していると思います。
Boost 1.46.1を使用しており、次のコードはVisualStudio2008でコンパイルされます。
最初の更新
hkaiserは、ルールと文法テンプレートの引数は。でなければならないことに注意しましVariant
たVariant()
。
でコンパイルエラーが発生したため、これは少し「さらに」なりましたboost_1_46_1\boost\variant\variant.hpp(1304)
。コメントは言う:
したがって、式の属性はで(qi::double_ | +qi::char_)
はないようboost::variant<double, std::string>
です。しかし、それは何ですか?
2回目の更新
typedef boost::variant<double, std::vector<char>> Variant;
パーサーの作品を使用しています。ただし、これはstd ::string...ほど簡単には使用できません。
c++ - 気力増強ルールの属性問題
次のコードはコンパイルできませんが、どこに問題があるのか わかりません。
エラーメッセージは次のとおりです。
誰か提案をしてくれる人はいますか?ありがとう
boost - ルール内のベクトル内の特定の要素にデータを割り当てる
値を指定して、それをベクトルの特定の要素に割り当てることができるパーサーを設定しようとしていますが、それを実装する方法が完全にはわかりません。
次のコードが文字列を解析するとします(0){**+*+}
。bar.a[0]
ごとに1回、。ごと+
にbar.b[0]
1回インクリメントする必要があります*
。私が遭遇している問題は、以下を使用してベクトルの要素への参照を取得する方法がわからないことです_a
。
これはコンパイルに失敗し、次のエラーが発生します。
したがって、明らかに、内でプレースホルダー値を使用することはできませんat_c
。また、可能であっても、指定された位置が範囲外の場合、ベクトルのサイズを変更する問題が発生することも認識しています。
このようなものをどのように実装しますか?私はこれを完全に間違った方法で行っているのですか?
c++ - ブーストスピリットのルールと文法におけるテンプレートパラメータの括弧
Spirit パーサーを実装するためのこの例を見て、似たようなものを書こうとしていたとき、何かに引っかかりました。
文法の属性テンプレート パラメータ ( std::map<std::string, std::string>()
) とルールの署名テンプレート パラメータ (例qi::rule<Iterator, std::string()> key, value
) には括弧が含まれています。
私はこれまで見たことがなく、自分のバージョンを書いているときに意図せず省略しました. これにより、パーサーが正しい出力ランタイムを生成しません (出力マップが空です)。
これらの括弧の目的は何ですか? 私の推測では、これにより、このルールの属性がそのタイプのオブジェクトになります。
c++ - BOOST_FUSION_ADAPT_STRUCT が正しい数の引数を取らない
Boost::Spirit を使用して、一部のテキストを構造体に解析しています。これには、テキストを解析して構造体に直接格納するために BOOST_FUSION_ADAPT_STRUCT を使用する必要があります。マクロは 2 つの引数を取ることを知っています。最初の引数として構造体名、2 番目の引数としてすべての構造体メンバーです。そして、私はそれらの2つだけを渡しています。しかし、コンパイルエラーが発生します。
これがコードスニペットです。コード全体が必要な場合はお知らせください。
ありがとう。
これは私が解析しようとしているルールです。
parsing - 文字列を解析して、ブーストスピリットでintまたはfloatに変換します
wstringを解析して、int、float、または文字列自体にする必要があります。ここで私のような質問を見つけましたが、パーサーの使用方法がわかりません。test_parserメソッドが見つかりません。問題は、パーサーのカスタムルールを実装した後、それらをどのように使用するかということです。
c++ - 代替演算子 '|' で士気を高める 失敗!行くべき2つの可能なルールがあるとき
私はhttpパーサーに取り組んでいます。代替演算子を使用して解析しようとすると、問題が見つかりました。hold[]を使用して修正できるのは、属性の値に関するものではありません。この問題は、ルールの先頭が似ている 2 つのルールがある場合に発生します。私の問題を示すためのいくつかの簡単なルールを次に示します。
qi::parse
次に、入力文字列が好きな場合に失敗すること
を使用して、このルールを解析します。"/abcd"
ただし、最初のルールの前に2番目のルールを切り替えると。パーサーは true を返します。問題は、パーサーが最初のルールで入力を消費し、最初のルールが Fail であることが判明したためだと思います。最初のルールの代替である 2 番目のルールには戻りません。
最初のルールを適用しようとしましhold[]
たが、属性の生成にのみ役立ちます。この問題は解決しません。HTTPにはルールの始まりが他のルールと同じであるという多くのルールがあるため、この問題を修正する方法がわかりません。
===========私のコードについての詳細============================
ここに解析のための私の関数があります文字列
主にこのコードがあります。
この結果が得られました。
[誤]/htmlquery? [dead with]/htmlquery <= '?' を消費できないことがわかります
ただし、このようにルールを切り替えると; (「rule_wo_question」の前に「rule_w_question」を入れました)
出力は次のようになります。[正解]/htmlquery?
最初のバージョン (間違ったもの) は、解析が '/htmlquery' ("rule_wo_question") を消費するように見えますが、'?' を消費できないことがわかります。これにより、このルールは失敗します。次に、このルールは代替ルール ("rule_w_question") に進むことができません。最後に、プログラムは「[不正]」を返します
2 番目のバージョンでは、「rule_wo_question」の前に「rule_w_question」を切り替えます。これが、パーサーが結果として "[correct]" を返す理由です。
================================================== ============ pthread と boost_filesystem にリンクされたブースト 1.47 を使用した私のコード全体が私のメイン .c です。
結果は