問題タブ [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.

0 投票する
1 に答える
1178 参照

c++ - spirit::qi : 継承された属性参照を phoenix::function に渡す

次のコードは、私がやろうとしていることの合理化されたバージョンです。基本的に、コンテナー データ メンバーを持つ構造体 (おもちゃのコードでは int_holder) があります。オブジェクト (この場合は int) を挿入し、新しく挿入されたオブジェクトへのポインターを親 qi::rule に返します。

解析中に値を入力するために、参照によって int_holder を文法に渡します。したがって、int_holder は文法の継承された属性になります。コード:

コードはコンパイルされず、次のエラー メッセージが表示されます。

_r1 を phoenix::function に渡すときに明らかに問題がありますが、解決方法がわかりません。前もって感謝します。

0 投票する
1 に答える
1174 参照

c++ - Boost Spirit のストリーム パーサーをカスタム文法で使用する

あらすじ

Boost Spirit のストリーム パーサー APIを利用して、段階的に解析したいと思いstd::istreamます。ただし、反復子ベースの文法で使用する方法の良い例を見つけることができませんでした。概念的には、私の目標は type のオブジェクトの無限ストリームを解析することですT

詳細

Ttypeと skipperの属性を持つ Qi の文法は、S通常、次の形式を持ちます。

ストリームベースの API でこのような文法を使用するにはどうすればよいですか? 具体的には、ストリーム API に関する私のメンタル モデルは、次のようなことができるというものです。

イテレータを必要とする従来の文法をまとめるのに苦労しています。それはストリーム API とどのように適合しますか?

0 投票する
1 に答える
1279 参照

c++ - boost::spirit::qi Expectation パーサーとパーサー グループ化の予期しない動作

>スピリットの解析でand>>演算子を使用することについての私の無知を誰かが照らしてくれることを願っています。

トップレベルのルールが次のように見える実用的な文法があります

これは、アトリビュートに依存して、解析された値をフュージョンに適応した構造体 (つまり、ブースト タプル) に自動的に割り当てます。

ただし、 operationRule に一致したら、続行するか失敗する必要があることはわかっています (つまり、 で始まる他のルールを試すバックトラックを許可したくありませんidentifier)。

これにより、不可解なコンパイラ エラー ( 'boost::Container' : use of class template requires template argument list) が発生します。少しふざけると、次のようにコンパイルされます。

しかし、属性設定は機能しなくなりました-解析後にデータ構造にゴミが含まれています。これは のようなアクションを追加することで修正できます[at_c<0>(_val) = _1]が、それは少し不格好に思えます - また、boost docs によると動作が遅くなります。

だから、私の質問は

  1. バックトラッキングを防止する価値はありますか?
  2. グループ化演算子が必要な理由()
  3. operationRule上記の最後の例は、一致した後にバックトラッキングを本当に停止し(...)ますか?
  4. 前の質問に対する答えが /いいえ/ である場合、operation操作が /一致する/一致しない場合はバックトラックを許可するが、操作が/一致する場合はバックトラックを許可しないルールをどのように作成すればよいですか?
  5. グループ化演算子が属性文法を破壊するのはなぜですか? アクションが必要です?

私はこれが非常に幅広い質問であることを認識しています - 正しい方向を指し示すヒントは大歓迎です!

0 投票する
3 に答える
3817 参照

c++ - boost::spirit を使用して一連の単語をベクトルに解析する方法は?

私は学ぼうとしていますboost::spirit。例として、一連の単語を解析してvector<string>. 私はこれを試しました:

これにより、次の出力が得られます。

しかし、各単語が個別に一致する次の出力が必要でした:

qi::grammar可能であれば、この単純なケースに対して独自のサブクラスを定義する必要は避けたいと思います。

0 投票する
1 に答える
496 参照

c++ - boost::spirit セマンティック アクションで関数オブジェクトの結果をローカルに割り当てるにはどうすればよいですか

GCC 4.6.3で次のコードで次のエラーが発生する理由がよくわかりません

'boost::spirit::_a = boost::phoenix::function::operator()(const A0&) const [with A0 = boost::phoenix::actor >, F = make_line_impl] の 'operator=' に一致しません、typename boost::phoenix::as_composite、F、A0>::type = boost::phoenix::composite、boost::fusion::vector、boost::spirit::argument<0>、boost::fusion: :void_、boost::fusion::void_、boost::fusion::void_、boost::fusion::void_、boost::fusion::void_、boost::fusion::void_、boost::fusion::void_ , boost::fusion::void_> >]((* & boost::spirit::_1))'</p>

遅延関数オブジェクトの結果を qi プレースホルダーに割り当てることさえ可能ですか?

0 投票する
2 に答える
1900 参照

c++ - boost :: spiritを使用してテキストを構造体に解析する方法は?

私は学んboost::spiritでいて、いくつかのテキストを読んで解析して構造体にしようとしています。

たとえば、以下では"2: 4.6"int2およびdoubleとして解析されます。4.6TestStruct

それはうまく機能しますが、このコードをどのように単純化できるのでしょうか?

mystruct0たとえば、タイプをマークするためだけに存在する文法ルールを削除したいと思います。これは、ルールからオブジェクトstd::pair<int,double>を自動的に構築するために使用されます。TestStructmystruct

また、可能であれば、TestStructコンストラクターをから削除できるようにしたいと思います。std::pair

では、次のコードをどういうわけかコンパイルすることができますか?それははるかに良い解決策になるでしょう:

残念ながら、コンパイラは次のように述べています。

0 投票する
1 に答える
4225 参照

c++ - eolをスキップせずにスキッパーASCII::スペースを使用するにはどうすればよいですか?

解析にはboost::spiritを使用する必要があり、phrase_parse関数を使用したい:

しかし、4番目の用語(ascii :: space-qi :: eol)は、私のコンパイラでは許可されていません。eolをスキップせずにスキッパーASCII::スペースを使用するにはどうすればよいですか?

0 投票する
2 に答える
2245 参照

c++ - セミコロンまたは改行(boost :: spirit)が続くエントリを解析する方法は?

Boost :: Spiritで、セミコロンまたはオプションのセミコロン付きの改行が続くエントリを解析するにはどうすればよいですか?

入力例。各エントリはintとdoubleです。

エントリとそれに続く空白を解析するだけのサンプルコードを次に示します。

さて、私が望む方法(各エントリの後にセミコロンまたはオプションのセミコロン付きの改行が続く)を解析するために、これを置き換えました:

これで:

ここで、boost::spirit演算子は次の||ことを意味します:(aの後にオプションのbが続く)またはb。1.4ただし、この例の入力の後にスペースがある場合はエラーになります。

スペースが一致していないのは理にかなっていno_skipますが、解決策を見つけることができませんでした。

0 投票する
1 に答える
1384 参照

c++ - boost ::spiritルールの属性としてboost::tupleを使用する方法は?

私は次のルールを持っていますboost::spirit

しかし、2番目intはタプルに書き込まれません。使用せずに動作させる方法はありますboost::fusion::tupleか?

使用すれば動作するのにstd::pair、なぜ使用できないのboost::tupleですか?

完全なコンパイル例を次に示します。

0 投票する
2 に答える
1214 参照

c++ - Boost Spiritの関数からexpectation_failureをスローする方法は?

expectation_failureBoost::Spirit で、バインドされた関数からどのようにトリガーできBoost::Bindますか?

背景: 複雑なエントリを含む大きなファイルを解析しています。エントリが前のエントリと一致しない場合、失敗してexpectation_failure(適切な解析位置情報を含む) をスローします。エントリを解析するとき、エントリが以前に見たものと矛盾しているかどうかを判断する関数をバインドします。

ポイントを示す小さなおもちゃの例を作りました。ここでは、が 10 で割り切れないexpectation_failure場合にをスローしたいだけです。int

をスローするexpectation_failureと、10 で割り切れない int で次のようなエラー メッセージが表示されます。