問題タブ [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のルールから文法を作成できません
初めてSpiritライブラリを使おうとしています。今のところ楽しんでいますが、ドキュメントに大きく影響を受けた例を試しても、事前定義されたルールから文法を作成することはできません。
これが私の問題の核心です:
そしてこれはコンパイラが言うことでした:
エラー:'test_phrase_parser(const char [6]、ph_files_parsing :: process_parsing :: test_method():: my_grammar&)'</p>を呼び出すための一致する関数がありません
注:候補者は:
注:テンプレートbool test_phrase_parser(const char *、const P&)
交換すればすべて正常に動作します
に
助けてくれる人に感謝します。
(ブーストバージョンは1.48です)
c++ - Boost.Spirit、Nabialekのトリックとエラー処理
「一般的な」エラー処理(チュートリアルで説明されているような)とNabialekのトリックを何らかの方法で組み合わせることができますか?このような:
さて、some_other_rule
が怠惰に呼び出されて失敗すると、エラーメッセージは、それ"lazy"
が逐語的に期待されたものであり、"other rule's name"
(私が必要としている)ものではないことを示しています。それはそのように機能するはずであり、私は単にどこかで間違っていますか、それとも他の特定のトリックが関係していますか?
c++ - spirit :: qi::grammar-文字サイズが異なる名前
私はspirit::qiを使用してパーサーを作成しており、さまざまな文字サイズと互換性を持たせることを目指しています。
とすれば
必要な文字サイズの_szFileを含む文字列へのポインタを正常に返します。
でコンパイルすると
次のエラーメッセージが表示されます
したがって、.. grammar :: base_typeは、2番目のパラメーターとしてconst std :: string&のみを期待しています。私の質問は、qi :: grammarにイテレータのvalue_typeサイズの文字列を期待するように指示するにはどうすればよいですか?
前もって感謝します !
boost-spirit-qi - boost::spirit でパーサー属性のデフォルト値を提供する
プロジェクトに boost::spirit を実装してきましたが、私の課題の 1 つは、次のタイプのコンテナーに直接解析することです。
私はほとんどそこにいます。私が直面した問題は、 std::pair のキー値を自動的に割り当てることです。つまり、入力文字列の各トークンには事前に決定されたキーがあり、トークンが解析されるときにペアに自動的に挿入されるようにします。
私は近いと思いますが、そうではないかもしれません... これが(切り捨てられた)文法です:
最終的な結果は、コマンド ラインで次のように入力することです。
パーサーに「コマンド」をキーとして挿入させます。次のように入力します。
したがって、map["command"] 要素にアクセスすると、値 "select" が返されます。
問題は、qi::attr() に仕事をさせることができないことです。つまり、「コマンド選択」と入力しても機能しますが、「選択」だけでは機能しません。
c++ - 精神気文法の問題
まず第一に、不正確なタイトルで申し訳ありません。コンパイルエラーの原因が実際にはわからないだけです(私はspirit/phoenix/tupleが初めてです)。したがって、質問を読みやすくするために、文法全体をペーストビンにエクスポートしました: http ://pastebin.com/RsGM8E4r
コードは、Visual Studio 2010 で次のようにコンパイルされます。
文法を理解するために必要なその他の情報と、下部にある私の質問:
group と list もベースとして要素を持っています。
さて、私が理解していないのは、文法を見ると、アトムのルール定義は次のとおりです。
これにより、私が実際には理解できないコンパイラエラーの非常に長いリストが表示されます..再度pastebinにエクスポートします: http://pastebin.com/k4HseJ01
ただし、ルールを次のように変更すると
それは正常にコンパイルされますが、そのルールから解析されたデータを取得する必要があります:P
助けてくれてありがとう、私は本当に何日もそれで立ち往生しています。
c++ - スピリットパーサーから元の解析されていないコードを (コメントとして) どのように出力しますか?
入力文字列: を指定するA = 23; B = 5
と、現在 (期待される) 出力が得られます。
代わりにこれを見たい:
コードのコア行は次のとおりです。
identifier は qi::symbols テーブル ルックアップです。
私のコードの残りの部分は次のようになります。
c++ - Boost.Spiritを使用した混合値とキーと値のペアの解析
混合変数($(name)
)と変数と値のペア($(name:value)
)で構成される単純な文法があります。私は手作業でコーディングされた再帰下降パーサーを持っていますが、それをスピリットを学ぶための演習として使用することに興味があります。これは、最終的にはより複雑な文法に必要になります(/すぐに)。
とにかく、私が使用している可能なフォームのセット(完全な文法から簡略化)は次のとおりです。
私の現在のルールは次のようになります。
はっきりしていなければ、Spiritがどのように機能するのかわかりません。ドキュメントには実際の説明以外のすべてが含まれているので、これは例をまとめて約1時間です。
私が特に質問する部分char_('$')
は変数ルールの先頭ですが、これを削除するとシフト演算子エラーが発生します(コンパイラー'$' >> '('
は右シフトとして解釈します)。
コンパイルすると、状態ルール、特にペアの作成、およびルックアップに関連するエラーが発生します。
- エラーC2679:バイナリ'[':タイプ'const boost :: spirit :: _ 1_type'の右側のオペランドをとる演算子が見つかりません(または受け入れ可能な変換がありません)
- エラーC2512:'boost :: spirit :: qi :: rule :: rule':適切なデフォルトコンストラクターが利用できません
ルックアップ(vars[_1]
)を単純に変更すると、次のようになり+=
ます。
3。エラーC2665:'boost :: spirit :: char_class :: classify :: is':15個のオーバーロードのいずれもすべての引数タイプを変換できませんでした
_1
エラー1は、プレースホルダーのタイプ(属性?)に関連しているようですが、これは文字列である必要があり、出力文字列への印刷または連結に使用されます。2は1によって引き起こされたノイズのようです。
テンプレートエラーのスタックを掘り下げるエラー3は、状態ルールをペアに変換できないことに関連しているようです。これは、この例のルールの1つとほぼ完全に一致するため、奇妙に思えます。
両方の入力フォームを適切に処理するように変数ルールを変更するにはどうすればよいですか?
c++ - Boost::Spirit の簡単な文法例
ブースト スピリット (およびブースト フュージョン) のチュートリアル (バージョン 1.48.0) を実行しています。私はおもちゃの従業員の例で遊んでいます。ソースへのリンクは次のとおりです。
http://www.boost.org/doc/libs/1_48_0/libs/spirit/example/qi/employee.cpp
例の文法は次のとおりです。
そして、私の変更により、引用符の処理が削除され、区切り記号の間の任意の文字が解析され、パーサーがマップされている構造体に割り当てられます。
私の仮定では、char_ にはコンマに到達するまでのすべての文字が含まれます。ただし、次の文字列を使用してコンパイルおよび実行すると、解析に失敗します。
また、構造体型の適切な型に自動的にキャストする同様のパーサーを作成しようとしています。上記のような入力文字列の正しい文法を定義する限り、何か根本的に間違っていると確信しているので、どんな助けも大歓迎です!
ありがとう!
c++ - boost::spiritを使用してdoubleのリストを解析する
これがコードサンプルです。
std::string
x
で解析したいparser
p
。
の定義から次のよう struct parser
に、行
と
同等である必要があります。ただし、最初の解析は失敗し、2番目の解析は成功します。
の定義で何が間違っているのstruct parser
ですか?
c++ - Boost Spirit Auto Parserは、ダブルのタプルで失敗します
次のコードでは、Boost Spirit Auto Parserを1つまたは2つのdoubleに使用しようとしていますが、コンパイルされません。私はここで何が間違っているのですか?
コメント化された行はコンパイルされるため、 ;boost::tuple<double, double>
の属性タイプとして受け入れられます。qi::double_ >> qi::double_
ただし、属性タイプからパーサーを取得できません。なんで?