問題タブ [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.
c++ - 気力を高める 整数と浮動小数点の数値解析
私は次の結果を理解しようとしています。テストケースコードは
ここでの動機は、数値「12345」を整数として、決して浮動小数点として一致させたいということです。'12345.34' は double_ に一致し、int_ には一致しませんが、逆の場合は当てはまりません。'12345' は、整数 (int_ ) と浮動小数点 (double_ ) の両方に一致します。double_ - int_ を試してみましたが、「12345」との一致に失敗しました。しかし、私の希望は、最後のテストケース '12345.34' が double_ - int_ に確実に一致することでしたが、結果は一致しませんでした。
なぜそうなのか、整数のみに一致するパーサーと浮動小数点のみに一致する別のパーサーを取得するにはどうすればよいですか (c のように、5.0 は浮動小数点として解釈されます)。
boost - カスタム属性解析によるブーストスピリットルール
テキストをこれらの構造体のベクトルに解析する Boost Spirit 文法を書いています。
この文法には次のような規則があります。
ただし、 の実際の文法pairSequence
は次のとおりです。
Pair
この文法でwitha
を double にb
等しく、なんらかの定数に等しくするようにしたいと考えています。私はこのようなことをしたい:
もちろん、上記はコンパイルされません。にコンストラクターを追加しようとしましたPair
が、まだコンパイル エラーが発生します ( 'Pair::Pair(const boost::phoenix::actor >&, double)' の呼び出しに一致する関数がありません)。
c++ - Boost :: Spirit :: Qiを使用して、複数の入力で入力位置を追跡するにはどうすればよいですか?
#include
ブーストスピリットパーサーでC++のメカニズムのようなものをサポートしたいと思います。基本的に、ファイルからサブスクリプトをロードするようにパーサーに要求するスクリプトコマンドがあります。ポストの解析中に入力位置の追跡で説明されているエラーメッセージを報告できるようにしたいのですが、複数の入力の解析については説明していません。
これは、を使用して合理的に達成できますboost::spirit::qi
か?
私は、よりスマートなイテレータタイプを使用して、さまざまな入力を取得することに取り組んできました。それでも正確なポジショニングを見たいです。
c++ - この単純なboost::spirit :: qiパーサーの問題は何ですか?
VBスタイルの二重引用符で囲まれた文字列を解析することを目的としたこの単純なパーサーがあります。したがって、パーサーは次のようになります。
の出力に
これが私がこれのために思いついた文法です:
ただし、取得している属性は、完全に解析されたメッセージではなく、一重引用符( ")です。
parsing - Boost Spiritで解析し、追加のアイテムを取得します
これは多くのコードで長くなるので、StackOverflowがそれに対処できることを願っています。:P
BoostSpiritを使用してSVGパーサーを作成しようとしています。「BezierPoints」のベクトルである「Contours」をベクトルに取り込む文法があります。これは、通常のポイントまたはベジェコントロールを使用したポイントのいずれかを表す場合があります。
これまでのところ、これはあります(相対描画コマンドはまだ処理していません):
文法は次のように呼び出されます。
そして、これは私の現在のテスト文字列です:
読みやすくするために文字列が再編成されました。
出力は次のとおりです。
文法はポイントを見ていますが、それはこれらすべての余分なポイントを入れ続けており、私はそれらがどこから来ているのかわかりません。
PS
私はまた、私のルールのいくつかについて疑問に思っています。まず、このルールがあります:
(drawto_command % *space)
ベクトルのベクトルではなく、単一のベクトルとしての結果が必要です。私の知る限り、これはフェニックスで手動で行う必要があります。そうですか?
私のmovetoルールにも同様のことがあります。
BezierVecを与える2つのルールがあり、3番目のルールのために1つのBezierVecに結合したいと思います。これまでのところ、これを行う唯一の方法は、Phoenixを使用して手動で挿入することであるように思われます。もっと簡単な方法はありませんか?
boost - ルールで継承された属性を割り当てまたは変更し、結果を親ルールに伝播する
親ルールが継承された属性をその子に渡す、このような Boost Spirit 文法があるとします。
子ルールが返すそれぞれのFooは、指定されたBar継承属性に依存します。親ルールにもこれがあるかもしれません:
私が疑問に思っているのは、子ルールが継承された属性を変更し、変更をその親ルールに伝播し、新しい値を次の子ルールに渡すことができるかどうかです。
上記の例では、開始ルールは、親ルールとその子ルールで使用されるBarの初期値を確立します。バーは、子ルールを通過するたびに変更されます。これは可能ですが、そのようなコードはどのようになりますか?
c++ - boost :: spirit :: qi::grammarと組み合わせたboost::phoenix :: at_cの代替手段はありますか?
問題を説明するためのテストアプリケーションを作成しました。「a=」または「b=」で始まる整数のリストを解析し、「\ r\n」で区切ります。リストには、これらのフィールドの複数のオカレンスが任意の順序で含まれています。
実際には、解析する必要のあるさまざまなタイプのフィールドがさらにあります。このアプローチに対する私の反対は、次の式にあります。[push_back(at_c <0>(_ val)、_1)]これは、割り当てとMyStructの最初の要素の間の「隠された依存関係」です。これにより、コードは変更に対して脆弱になります。構造体が変更された場合でもコンパイルされる可能性がありますが、期待どおりの動作はしなくなります。
[push_back(at_c <0> bind(&MyStruct :: aList、arg1)(_ val)、_1)]のような構造を期待しています。これを参照してください。それは本当に名前に縛られているように。
このようなことは可能ですか?それとも、まったく異なるアプローチを取る必要がありますか?
c++ - Boost.Spirit でカスタム パーサーを作成することは可能ですか?
Boost.Spirit (2.3) でカスタム Parser クラスを作成しようとしましたが、うまくいきませんでした。コードは次のとおりです。
そして、私はすべての要件を満たしていますが (少なくとも私は満たしていると思います) 、解析式でこのクラスを使用しようとするとエラーが発生します。
他のパーセット (例: ) の実装を調べようとしましたnot_predicate
が、それが機能する違いは何なのかわかりません。
モチベーション
私がそうする理由は、この質問に関連しています。独特の字句規則を持つ POSIX シェル言語を解析したい。特に、「スキッパーパーサー」は語彙素にも適用する必要がありますが、「句レベル」のスキッパーパーサーとは異なるものにする必要があります。これは、lexeme
ディレクティブが実行できないことであり、skip
プリスキップ (AFAIK) も行いません。これは私が必要としているものでもあります。だから私は関数を作成したい
トークンに一致するルールを返します。1 つの方法は、端末として機能する独自のrule
ラッパーを作成することです (rule
単独では参照セマンティクスに使用できないため)。別の方法は、新しいパーサーを作成し (これは の非端末になりますproto
)、それにシェルのトークン解析を実装することです。
boost - ブーストスピリットオートルール問題
おもちゃの言語の構文ツリーを構築するために属性伝播を使用しています。if ステートメントの定義で問題が発生しました。エラー メッセージからはわかりにくいのですが、rhs 属性が期待される属性に崩壊していないと思います。tuple <double,Statement,optional<Statement>>
それは私が思うに崩壊するはずです。
エラー:C:\Program Files (x86)\CodeBlocks\MinGW\boost_1_43_0\boost\variant\variant.hpp|1293|error: no matching function for call to 'boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list3<boost::recursive_wrapper<Lang::CompoundStatement>, boost::recursive_wrapper<Lang::IfStatement>, Lang::VarStatement> > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list2<boost::recursive_wrapper<Lang::IfStatemen [error cuts out here]
ありがとう。
PS コードを正しく表示できませんでした。ここにプレーンテキスト バージョンがあります: http://freetexthost.com/a3smzx0zk5
PPS 言及するのを忘れたいくつかの情報。削除"else" >>
してに変更> statement
すると機能しますが>> statement
、"else" >> statement
ステートメントだけに折りたたむ必要があります。「else」を qi::lit として明示的に作成しても役に立ちません。
c++ - Boost.Spirit.Qiを使用してさまざまな構造を解析するにはどうすればよいですか?
この例では、employee構造体は「employee {int、string、string、double}」の形式で解析されます。
この例を変更して、「intern {int、string、string}」などのさまざまなタイプの構造体も解析できるかどうかを知りたいです。
具体的には、構造体型でオーバーロードされた関数に構造体を渡したいと思います。これにポリモーフィックなダブルディスパッチを使用することを避け、代わりに、正しいオーバーロードされた関数に静的に一致するように解析される具象型を保持できれば素晴らしいと思います。