問題タブ [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++ - Boost.Spirit.Qi 使用時のエラーなだれ
コードの何が問題なのかわかりません。Boost のテンプレートは私を夢中にさせます! 私はこれらすべてについて頭も尻尾も作ることができないので、ただ尋ねなければなりませんでした。
これの何が問題なのですか?
エラーの数は膨大です。これを自分でコンパイルするのを手伝いたい人をお勧めします(私を信じてください、ここに貼り付けるのは実用的ではありません)。最新の TDM-GCC バージョン (GCC 4.4.1) と Boost バージョン 1.39.00 を使用しています。
static_assert
おまけとして、C++0x の新しい機能がこの意味で Boost に役立つかどうか、上記で引用した実装が良いアイデアかどうか、または Boost の String Algorithms ライブラリを使用する必要があるかどうか、さらに 2 つのことをお聞きしたいと思います。 . 後者はおそらくはるかに優れたパフォーマンスを提供しますか?
ありがとう。
- 編集
次の非常に最小限のサンプルは、最初は上記のコードとまったく同じエラーで失敗します。
-- 編集 2
私の古いバージョンの Boost (1.39) でなぜ動作しなかったのかはまだわかりませんが、Boost 1.42 にアップグレードすると問題が解決しました。次のコードは、Boost 1.42 で完全にコンパイルおよび実行されます。
ヒントをありがとう、hkaiser。
c++ - boost :: spiritを使用して、レコードの一部を独自の行に配置するようにするにはどうすればよいですか?
いくつかの例外の1つをスローして、どのルールが失敗したかを示すレコードパーサーがあります。
フロントの問題:
position_iterator
from Spirit.Classicを使用しているので、次のストリーム挿入演算子が便利です。
テンプレートerr_t
は、さまざまな形式の解析失敗に関連する例外をスローするための定型文を除外します。
err_t
ラッパーとともに使用される例外:
文法は単純なシーケンスを探します。がないeps
と、空の入力start
ではなくルールが失敗します。a
ではmy_parse
、ストリームの内容をにダンプし、解析の場所を追跡するためにstd::string
使用します。position_iterator
最後に、メインプログラム
上記のコードは以下をスローしMissingA
ます:
スキッパーが改行を消費したのではないかと思いましたが、lexeme[eol]
代わりに同じ結果が得られました。
これは書くのに最も些細な種類のパーサーの1つであるように思われるので、私は明白な何かを見逃しているに違いありません。私は何が間違っているのですか?
c++ - boost::spirit::qi で行末を解析するにはどうすればよいですか?
c++ - Boost Spirit 2 を使用して文字列を解析し、ユーザー定義の構造体にデータを入力する
Boost-1.42.0 と VS2005 で配布された Boost.Spirit を使用しています。私の問題はこのようなものです。
コンマで区切られたこの文字列があります。最初の 3 つのフィールドは文字列で、残りは数値です。このような。
私のルールはこんな感じです
このような構造にデータを格納しようとしています。
BOOST_FUSION_ADAPT_STRUCTURE でラップして、精神的に使用します。
My parse function parses the line and returns true and after
I'm expecting var.stringVector and var.doubleVector are properly filled. but it is not the case.
What is going wrong ?
The code sample is located here
Thanks in advance, Surya
c++ - Boost Spirit と Lex パーサーの問題
ドキュメントのサンプル コードを (漸進的に) 修正しようと奮闘してきましたが、それほど大きな違いはなく、期待どおりの動作が得られません。具体的には、「if」ステートメントは、(私の意図は)合格する必要がある場合に失敗します(「else」がありましたが、デバッグ中にパーサーのその部分が削除されました)。割り当てステートメントは正常に機能します。「while」ステートメントも「if」ステートメントと同じ問題を抱えていたので、一方が機能しない理由を理解するための助けを得ることができれば、もう一方を簡単に実行できるはずです。これは、例の 1 つにあるものとほとんど同じであるため、微妙なところに違いありません。
これを実行した場合の出力は次のとおりです (文字列に読み込まれたファイルは、メインで最初にダンプされます)
c++ - バージョン 2 構文を使用した適切な/完全な Boot Spirit の例
http://boost-spirit.com/repository/applications/show_contents.phpからこれまでに行って見た例のほとんどすべてが古い構文を使用しています。http://www.boost.org/doc/libs/1_42_0/libs/spirit/doc/html/index.htmlにある実際のドキュメントとその中の例を読んで再読しました。Joel がブログhttp://boost-spirit.com/home/でコンパイラ シリーズを開始していることは知っていますが、まだ本格化していません。完全に動作するアプリケーションのコンテキストで、より洗練された/関与する側面を使用した動作例を見るための他のリソースはありますか?
c++ - Boostライブラリが独自のプリミティブデータ型を定義するヘッダーファイルは何ですか?
最近、私はboost :: spirit :: qiバイナリエンディアンパーサーを使用して、プラットフォームのエンディアンに依存するいくつかのバイナリデータを解析しようとしています。次のような簡単な例があります。
宣言と変数の使用:
リトルエンディアンのバイナリパーサーの基本的な使用法:
それは非常にうまく機能します。boost::uint16_t
しかし、私の質問が来ます、なぜboost::uint32_t
ここでのようないくつかのデータ型を使用する必要があるのですか?ここで使用できますunsigned long
かunsigned int
?また、解析double
またはfloat
データ型を使用する場合、どのブーストデータ型を使用する必要がありますか?そして、ブーストが上記のタイプを定義する場所を教えてください。
c++ - スピリットセマンティックアクションパラメータをブーストする
ブーストスピリットセマンティックアクションに関するこの記事では、
実際には、さらに2つの引数が渡されます。パーサーコンテキストとブール値の「ヒット」パラメーターへの参照です。パーサーコンテキストは、セマンティックアクションがルールの右側のどこかにアタッチされている場合にのみ意味があります。これについては、まもなく詳細を確認します。セマンティックアクション内でブール値をfalseに設定すると、遡及的に一致が無効になり、パーサーが失敗します。
すべて問題ありませんが、他のパラメーター(パーサーコンテキストとヒットブール値)を使用するセマンティックアクションとして関数オブジェクトを渡す例を見つけようとしましたが、見つかりませんでした。フェニックスのブードゥーをかろうじて理解することができないので、通常の関数または関数オブジェクトを使用した例を見てみたいと思います
c++ - Boost Spirit で文法を解析する
次のようなツリー式のような C 関数を解析しようとしています ( Spirit Parser Frameworkを使用):
このために、次の文法で 3 つの規則を使用しようとしています。
このタグ ルールは、式で使用される識別子 (「関数」名) を取得しようとするだけであることに注意してください。また、ほとんどの例のように、タグ ルールの署名がExpressionAST
ではなく を返すことにも注意してください。std::string
このようにしたい理由は、実際には非常に単純です。バリアントを使用するのが嫌いで、可能であれば使用しないようにします。ケーキを持っておいて、それを食べるのもいいと思います。
コマンドは、タグ (現在のノードの名前、AST ノードの最初の文字列フィールド) と括弧で囲まれた可変数の引数で開始する必要があり、各引数はタグ自体または別のコマンドにすることができます。
ただし、この例はまったく機能しません。それはすべてコンパイルされますが、実行時にすべてのテスト文字列の解析に失敗します。そして、私を本当に悩ませているのは、少なくとも単語の伝統的な意味では、上記のコードを実際にデバッグできないため、修正方法がわからないことです。基本的に、上記のコードを修正できる唯一の方法は、自分が間違っていることを知ることです。
したがって、問題は、上記のコードの何が問題なのかわからないということです。上記の文法をどのように定義しますか?
ExpressionAST
私が使用しているタイプは次のとおりです。