問題タブ [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++ - x3 で継承された属性を持つ qi パーサーを書き直す方法は?
継承された属性がセマンティック アクションで使用される場合、x3::with
ディレクティブを使用できます。
属性をパーサーの一部として使用したい場合はどうすればよいでしょうか? たとえば、単純なパーサーは、文字がパラメーター文字セットからのものである場合を除き、1 つ以上のアルファベット文字と一致します。
または、パラメーター char セットを遅延パーサーとして使用できます。
x3::with ディレクティブは、このローカル値をコンテキストに配置します。このコンテキストをセマンティック アクションの外で使用して、最終的にパーサーを生成できるかどうかはわかりません。
c++ - 文法の最適化
また、ブースト スピリット メーリング リストhttp://boost.2283326.n4.nabble.com/Spirit-X3-Boost-1-59-Compilation-never-finishes-for-a-recursive-grammar-td4693813で質問しました 。 html
RFC に従って xpath2.0 パーサーの作成に取り組んでいます。基本的には、私が取り組んでいる別のプロジェクトのサブプロジェクトです。
最初のいくつかの成功の後、すべてのポイントでコンパイルしてテストするのではなく、文法規則と AST を大量に作成するという過ちを犯しました。その後、私は基本的にテンプレートエラーメッセージの小説を読む必要がありました(実際には私のせいです)。
以下に、xpath の簡略化された文法 (特に RFC によるものではありません) を示します。これは、コンパイルを終了しないか、約 7 分後に Mac の速度が低下し始めたときにプロセスを停止する必要がありました。
としてコンパイルする
コンパイラ: Clang 3.8
ブーストバージョン: 1.59
テンプレートの深さが低い場合のテンプレートエラーのインスタンス化に基づいて、どこかで深い再帰が起こっていると確信しています。この問題を引き起こさないように上記の文法を最適化する方法はありますか?
ありがとう。
c++ - 結果が渡される再帰的な x3 パーサー
(1) で囲まれた単純な再帰ブロックを解析したいとし{}
ます。
この再帰パーサーは非常に単純です。
(2) その後、ブロックはより複雑になります。で囲むこともできます[]
。
どんな種類の開き括弧があるかを保管する場所が必要です。x3 にはローカル変数がないため、x3::_val
代わりに属性 ( ) を使用できます。
(3) ブロックの内容 (囲まれた部分)、これを引数と呼びますが、この例よりもはるかに複雑になる場合があります。そこで、そのためのルールを作成することにしました。この場合、この属性ソリューションは機能しません。幸いなことに、私たちにはまだx3::with
指示があります。開き括弧 (または閉じ括弧を想定) をスタック参照に保存して、次のレベルに渡すことができます。
コードはColiruにあります。
質問: これは、この種の問題に対して再帰的な x3 パーサーを作成する方法ですか? スピリット Qi のローカルと継承された属性を使用すると、解決策ははるかに簡単に見えます。ありがとう。