問題タブ [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.
boost-spirit-x3 - スピリット x3 を使用した長さ依存のデータ構造の解析
私は精神 x3 を使用してバイナリ データを解析しようとしていますが、[uint32-counter][counter-length data] のような長さ依存のデータ構造を解析する方法が見つからないという問題に遭遇しました。
1 つのパーサー (x3::little_dword) から x3::repeat(???)[byte_] のようなものに属性を渡すことは可能ですか?
c++ - Spirit x3でno_caseを行う方法
IDK が精神 X3 で no_case を実行する方法に問題があります。スピリットには no_case はありませんが、使用すると次のようになります。
私は混乱していて、リンゴとオレンジを混ぜようとしている可能性があります (qi と x3、たとえば IDK x3::parse と qi::parse の違い)
だからtl; dr私の質問は、これを機能させる方法です:
(no_case がなくても動作します)
c++ - パラメータに依存するパーサー規則
ルールが完全に事前定義されていない、つまり変数部分が含まれているパーサーを定義しようとしていました。これは Spirit Qi では問題ありませんでしたが、X3 の静的な性質のために実装できませんでした。with ディレクティブを試しましたが、残念ながら文書化されていませんが、これまでのところ運がありません。これまでに見つけた唯一の例は、ラムダ式の中にあります。
問題を実証するために簡単な例を作成しました。セパレーターがパラメーターとして指定されている整数の解析です。
with ディレクティブを使用しようとした部分をコメントアウトしました。
これは現在 X3 で可能ですか? 誰もこれを以前にやったことがありますか?
c++ - ブーストスピリット x3 を使用して別のパーサーを使用しているときにエラーをリンクする
現在、を使用してブースト スピリット x3 パーサーを異なる _def ファイルと .cpp ファイルに分離しようとしていますBOOST_SPIRIT_DEFINE/DECLARE/INSTANTIATE
が、リンク エラーが発生し続けます。
HEREは、分離された私のパーサーです。
リンカーエラーは読み取ります
私は何を間違っていますか?私の例を機能させるにはどうすればよいですか?
config.hpp:
/li>リテラル.cpp:
/li>リテラル_def.hpp:
/li>リテラル.hpp:
/li>main.cpp:
/li>
c++ - セマンティック アクションは属性の互換性を壊しているようです
セマンティック アクションを追加すると、属性の互換性が失われる可能性があるようです。次の簡単な例は、期待どおりに動作し、コンパイルされます。
ここで、セマンティック アクションをpair_rule
inに追加すると、次のようになりcombined
ます。
互換性のない型の移動についてコンパイラが不平を言う
ただし、別のセマンティック アクションを のalnum
パーサーの 1 つに追加するpair_rule
と、コードが再度コンパイルされます。
セマンティック アクションが属性の互換性を壊すのはなぜですか? また、追加のセマンティック アクションはそれをどのように「修正」しますか?
c++ - ブースト スピリット x3 パーサーが解析中に std::logic_error をスローする
ブーストスピリット×3を使って文法を作成しました。結果のパーサーをテストしているときに、パーサーが次の例外をスローする場合があることを認識しました。
ブーストスピリットx3を使用してこれが発生する可能性があることを知りませんでした。解析メソッドeighterがfalseを返すか、をスローすると思いboost::spirit::x3::expectation_failure
ました。文法で何が間違っているのでしょうか。mcve HEREをアップロードしました。バイナリを実行すると、std::logic エラーがスローされます。
たとえば .cpp
/li>main.cpp
/li>タイプ.cpp
/li>ast.hpp
/li>config.hpp
/li>example_def.hpp
/li>たとえば .hpp
/li>types_def.hpp
/li>タイプ.hpp
/li>
c++ - クラスに Spirit X3 パーサーをカプセル化する
X3 パーサーを、ルール (およびその定義) がメンバーであるクラスにカプセル化しようとしました。つまり、boost::spirit::qi::grammar から派生する必要がある Qi パーサーの構造に似ています。
このアプローチの利点は次のとおりです。
- 例で使用されている名前空間アプローチよりもコードの分離が優れています (たとえば、名前空間の競合を回避するため)。
- パーサーは、静的であるパーサー (個々のルール) の代わりに、このクラスのオブジェクトが生成されたときにのみインスタンス化されます。
- 潜在的なパラメーター (例: parameterに依存するquestionパーサー ルール) はコンストラクターに与えられ、 with<> ディレクティブを使用する代わりに「直接」の方法で統合される場合があります。
しかし、これは不可能のようです。フォームでルール (またはルール定義) を定義することは、クラス メンバーでは不可能であるためauto name = rule<class name, std::string>() = alpha >> *alnum;
、オプションではありません。auto
一方、実際の型を記述することも、非常に小さなパーサーを除けば実用的ではないようです。モデリングの代替手段は、ルールをメンバーとして持ち、コンストラクターで定義を作成することですが、ここでは、通常 BOOST_SPIRIT_DEFINE で行われるそれらの間のリンクは不可能であり、ルールだけでは解析するのに十分ではありません (static_assert に失敗しました "BOOST_SPIRIT_DEFINE undefined forこのルール」)。
また、パーサー全体をクラスメソッドに含めることは、たとえばParseXYZ::parse()
、パーサーを作成し、おそらく一度だけ作成されるような別のメソッドを介して入力を解析し、コードの再利用に関しては実際にはオプションではありません(コピーと貼り付けは別として) )。
X3 パーサーをクラスにカプセル化できるかどうか知っていますか? それ以外に、X3 で再利用可能なパーサーを構築するための提案は何ですか?
c++ - ブーストスピリットX3:「属性が期待したサイズを持っていません」が、なぜ気にするのですか?
Spirit X3 でパーサーを書こうとしていますが、理解できないコンパイル エラーが発生しているため、あまり進んでいません。コンパイラが不満を言っていることはわかっていると思いますが、理解できないのは、コンパイラが気にする理由です。次のコードはコンパイルされ (clang 3.9、Boost 1.62.0)、機能します。(構造が不十分であり、定数用の組み込みパーサーがあることに気付きました。問題を実証しようとしているだけです。)
ただし、integer_literal の代わりに float_literal を使用するように constant_def を変更すると、次のようになります。
コンパイルエラーが発生し始めます。
ソースを見ると、次のメッセージが表示されます。
このエラーは、float_literal の定義にオプションが存在することに関係していると思います。の属性タイプinteger_literal
は次のようなものだと思いvector<char>
ますが、オプションにより、の属性は次のfloat_literal
ようになりますtuple<vector<char>, optional<vector<char>>>
か?そして、どこかでそれを文字列か何かに強制しようとしていますが、2タプルを1タプルに変換しようとしているために失敗しています。float_literal
解決策は、定義をラップして、raw[]
代わりに基になる文字列を取得することだと思いますが、とにかく欲しいです。しかし、これは私の最初の X3 パーサーであるため、別のコンテキストで発生した場合に診断できるように、コンパイラーがこのエラーを発生させている理由を理解したいと考えています。
私が本当に理解していないのは、コンパイラが の型を気にする理由ですfloat_literal
。定数ルールの属性型である Constant のインスタンスを生成するセマンティック アクションをアタッチしましたが、属性 of を参照する必要はfloat_literal
ありませfloat_literal
ん。どこで不等長シーケンスの割り当てを行おうとしているのか、また何の目的でしょうか?
ありがとう!