問題タブ [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.
c++ - 期待値パーサーが失敗した場合、expectation_failure をスローしないようにする
期待パーサーが失敗したときに例外をスローしないようにするにはどうすればよいですか?
"function" > (!x3::lexeme[keyword >> !(x3::alnum | '_')] >> symbol) > ('(' > -lvalue_list > ')') > statements > "end"
次のようなコードを解析するルールがあります。
keyword
s は ( zero
、one
、function
、return
など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_parse
false
私の疑惑は次のとおりです。
すべてのパーサー ( X3parse()
の概念として)のメンバー関数の従来の戻り値が であるため、失敗について報告する方法は 2 つしかないのではないかと思います:)。これは、 C++での再帰的な降順パーサーの実装に固有のものです。しかし、結果の型をより広いものに変更すると、解析中にハードエラーまたはソフトエラー (またはその他のもの) をより柔軟な方法で区別できます — リターンコードの値を変えることで。bool
true
false
true
parse
bool
linux - Boost Spirit 3.0.0のインストール手順は?
このシステム構成の場合:
Synaptic Package Manager を使用して上記をインストールした場合、Boost Spirit 3.0.0のインストール手順は何ですか?
c++ - boost::spirit::x3 の属性として std::array を使用する
std::array
boost::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 を使用した、よりクリーンなソリューションがあると確信しています。
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 が現在可変繰り返し係数をサポートしていないのかどうかはわかりません。この問題を解決するための助けをいただければ幸いです。ありがとうございました。
c++ - X3 シンボルが部分文字列と一致しないようにする
X3 シンボル パーサーが部分的なトークンに一致しないようにするにはどうすればよいですか? 以下の例では、"foo" に一致させたいのですが、"foobar" には一致させません。識別子の場合と同じように、シンボルパーサーをlexeme
ディレクティブにスローしようとしましたが、一致するものはありません。
洞察をありがとう!
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 つを参照)。質問の焦点を絞るために、この質問から繰り返し部分を削除したため、この例ではセマンティック アクションを削除できましたが、それは可能な解決策ではありません。
上記のコードが機能しない理由がわかりません。前もって感謝します。