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

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

c++ - 期待値パーサーが失敗した場合、expectation_failure をスローしないようにする

期待パーサーが失敗したときに例外をスローしないようにするにはどうすればよいですか?

"function" > (!x3::lexeme[keyword >> !(x3::alnum | '_')] >> symbol) > ('(' > -lvalue_list > ')') > statements > "end"次のようなコードを解析するルールがあります。

keywords は ( zeroonefunctionreturnなどend) です。

パーサーにfunction one() return zero endコードを入力すると、expect_directive::parseここから関数例外がスローされます。

それが起こったとき、私はプログラムが予期せず終了しました。または中止 (コアダンプ) (使用する端末によって異なります)。

コードをデバッグすると、gdbboost::throw_exceptionは次のメッセージを含む関数内の右中括弧 '}' で自動的に中断します。

上記の関数をステップごとにステップ実行すると、そのthrow enable_current_exception(enable_error_info(e));行がシグナルの送信前に実行された最後の行であることがわかります。例外ハンドラの検索にスタックの巻き戻しがないのはなぜですか? boost::throw_exceptionなぜ中止が即座に発生するのですか (指定子があるように見えnoexceptます)?

try { ... } catch (x3::expectation_failure< input_iterator_type > const & ef) { ... } x3::phrase_parse関数呼び出しを取り入れました。x3::expectation_failure< input_iterator_type >から投げられたまさに期待boost::throw_exceptionです。それはすべて問題ではありません。

Boost.Spirit X3x3::expectation_failureで例外を完全に回避する方法はありますが、それでもコード全体の解析を中断し、予想の失敗に戻るようにする方法はありますか?x3::phrase_parsefalse

私の疑惑は次のとおりです。

すべてのパーサー ( X3parse()の概念として)のメンバー関数の従来の戻り値が であるため、失敗について報告する方法は 2 つしかないのではないかと思います:)。これは、 C++での再帰的な降順パーサーの実装に固有のものです。しかし、結果の型をより広いものに変更すると、解析中にハードエラーまたはソフトエラー (またはその他のもの) をより柔軟な方法で区別できます — リターンコードの値を変えることで。booltruefalsetrueparsebool

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

linux - Boost Spirit 3.0.0のインストール手順は?

このシステム構成の場合:

Synaptic Package Manager を使用して上記をインストールした場合、Boost Spirit 3.0.0のインストール手順は何ですか?

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

c++ - boost::spirit::x3 の属性として std::array を使用する

std::arrayboost::spirit の最新リリース x3 (boost 1.54 に含まれている) を使用して、数値のリストを固定サイズのコンテナーに解析しようとしています。必要な機能を備えているためstd::array、コンテナとして認識されますが、挿入機能がないため互換性がありません。これが私が達成しようとしていることの短い例です:

std::array関数がないため、これはコンパイルされませんinsert。回避策として、セマンティック アクションを使用しました。

そして電話する

代わりは。これは機能しますが (-std=c++14 で clang 3.6.0 を使用)、このソリューションは非常に洗練されておらず、読みにくいと思います。

BOOST_FUSION_ADAPT_ADTだから私は std::array を次のように使用して融合シーケンスとして適応させようとしました:

次に Vertex を特殊化x3::traits::is_containerして x3 に std::array をコンテナーとして扱わないように指示します。

ただし、これは x3 と組み合わせてコンパイルすることはできません。これはバグですか、それとも使い方が間違っていますか? たとえば、すべての x3 コードなしで呼び出すfusion::front(v)と、コンパイルして機能するので、コードが完全に間違っているわけではないと思います。

ただし、この単純な問題に対するフュージョン アダプターやセマンティック アクションを含まない x3 を使用した、よりクリーンなソリューションがあると確信しています。

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

c++ - ブースト スピリット X3 は、可変係数を使用して繰り返しディレクティブをコンパイルできません

ブースト スピリット X3 ディレクティブリピートを可変の繰り返し係数で使用しようとしています。基本的な考え方は、ヘッダーがペイロードのサイズを指定する、ヘッダー + ペイロードの考え方です。簡単な例「3 1 2 3」は、ヘッダー = 3、データ = {1, 2, 3} (3 つの整数) として解釈されます。

精神気のドキュメントからしか例を見つけることができませんでした。ブースト フェニックス リファレンスを使用して可変因子をラップします

運が悪い場合、精神 x3 の次の簡単な例を書きました。

上記のコードをブースト 1.59.0 と clang++ (フラグ: -std=c++14) でコンパイルすると、次の結果が得られます。

repeat(3)代わりにハードコードするrepeat(boost::phoenix::ref(n))と正しく動作しますが、可変繰り返し係数をサポートする必要があるため、可能な解決策ではありません。

コンパイルはrepeat(n)正常に完了しますが、解析に失敗し、次の出力が表示されます。 “Parse failed, remaining: 1 2 3"

ソースコードを見ると、boost/spirit/home/x3/directive/repeat.hpp:72テンプレート型RepeatCountLimit::type変数の空のコンストラクターが呼び出さiれ、for ループ中に割り当てられ、min と max が繰り返されます。ただし、型は参照であるため、コンストラクターで初期化する必要があるため、コンパイルは失敗します。以前のライブラリ バージョン boost/spirit/home/qi/directive/repeat.hpp:162 からの同等のソース コードを見ると、直接割り当てられています。

ここで何が間違っているのか、または x3 が現在可変繰り返し係数をサポートしていないのかどうかはわかりません。この問題を解決するための助けをいただければ幸いです。ありがとうございました。

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

c++ - X3 シンボルが部分文字列と一致しないようにする

X3 シンボル パーサーが部分的なトークンに一致しないようにするにはどうすればよいですか? 以下の例では、"foo" に一致させたいのですが、"foobar" には一致させません。識別子の場合と同じように、シンボルパーサーをlexemeディレクティブにスローしようとしましたが、一致するものはありません。

洞察をありがとう!

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

c++ - 個別のルール定義とインスタンス化を使用すると、Boost Spirit X3 AST がセマンティック アクションで機能しない

構造を AST に解析しながら、セマンティック アクションで Boost Spirit X3 を使用しようとしています。個別の定義とインスタンス化なしでルールを使用すると、次のように問題なく動作します。

上記のコード (フラグ -std=c++14 でコンパイル) を実行すると、期待される結果が出力されます。

ここで、Spirit X3 パーサーを、Boost Spirit X3 のcalc 9 の例とほぼ同じ方法で編成しようとしていますが、機能しません。

  • ast.hxx: 抽象構文ツリーを定義します。
  • grammar.hxx: パーサー メソッドを公開するユーザー インターフェイス。
  • grammar.cxx: ルールをインスタンス化します。
  • grammar_def.hxx: パーサー文法定義。
  • config.hxx: パーサー構成。
  • main.cxx: パーサーの使用例。

ast.hxx:

grammar.hxx:

grammar.cxx:

grammar_def.hxx:

config.hxx:

main.cxx:

main.cxx と grammar.cxx (フラグ: -std=c++14) をコンパイルし、上記のコードを実行すると、次のように出力されます。

ソースコードが長くなってしまい申し訳ありません。できるだけ小さくしようとしました。

unsigned n グローバル変数の使用法がいくつかあることに注意してください。これは、カスタムの繰り返しディレクティブと共に使用されます (質問はこちら解決策の 1 つを参照)。質問の焦点を絞るために、この質問から繰り返し部分を削除したため、この例ではセマンティック アクションを削除できましたが、それは可能な解決策ではありません。

上記のコードが機能しない理由がわかりません。前もって感謝します。