問題タブ [boost-spirit]

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 投票する
2 に答える
1972 参照

c++ - ブーストスピリットクロージャーに格納された変数をブーストスピリットループパーサーへの入力としてどのように使用しますか?

解析された値をループ パーサーへの入力として使用したいと考えています。

文法は、後続の文字列の (可変) サイズを指定するヘッダーを定義します。たとえば、次の文字列がパーサーへの入力であるとします。

12\r\nテスト ペイロード

パーサーは12を抽出し、それをunsigned intに変換してから、12 文字を読み取る必要があります。コンパイルするブースト スピリット文法を定義できますが、実行時にブースト スピリット コードのアサーションが失敗します。

クロージャー変数を遅延評価する必要があることを精神に伝えることは可能ですか? この行動はブーストスピリットによってサポートされていますか?

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

c++ - unsignedchar型のboost::spiritをコンパイルするにはどうすればよいですか?

boost::spiritはboost::spirit :: char_class :: ascii :: isalnum()でアサートします

127を超えるascci文字を渡す場合。

すべてのプライベート変数をstd::stringから

ただし、ブーストは内部でstd:.stringを使用します。私は何をしなければなりませんか?

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

c++ - boost::spirit と異なるノードの生成

ご挨拶。

文法を解析して AST を生成するときに、boost::spirit に異なるクラスのノードを強制的に生成させる方法に興味がありました。たとえば、VariableNode (メンバーとして変数の名前を持つ)、ValueNode (メンバーとして値を持つ) などのさまざまなノードが必要です。

ツリーウォーカーを扱うときに非常に便利です。この場合、すべての異なるノードをウォークするための基本抽象クラスを作成し (「ビジター」パターンを適用)、セマンティクス チェック フェーズ、コード生成フェーズなどを処理するときにそれを拡張します。

boost::spirit を使用すると、ツリーに使用されているファクトリをパラメータ化できますが、その動作を調整する適切な方法を見つけることができませんでした。

アイデア、コードはありますか?前もって感謝します。

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

c++ - ブースト精神 2.x: キーワードと識別子を処理する方法?

良い一日。

以前はブースト スピリット クラシックを使用していましたが、現在は新しいブースト スピリット 2.x に固執しようとしています。誰かがキーワードの扱い方を教えてくれませんか? たとえば、「foo」と「int」を区別したいのですが、「foo」は識別子で、「int」は単なるキーワードです。「intfoo」などの間違った解析から文法を保護したい。

わかりました、私は持っています

ident ルールは次のように宣言されます。

そして、たとえば、いくつかのルール:

「void」、「float」などがキーワードであると述べて、正しく記述する方法は? 前もって感謝します。

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

c++ - ブーストスピリットと前方宣言の問題

誰かが私に、現時点で正しいセマンティックアクションを実行できるようにするためにさらなる宣言を調べる必要がある状況に対処する方法についてのアドバイス/アイデアを教えてもらえますか?たとえば、誰かが「前方宣言」をサポートしていないプログラミング言語のインタプリタ/コンパイラを作成する場合によく知られています。例を見てみましょう:

少なくとも2つのパスが必要であることは明らかです。まず、すべての関数宣言を解析し、関数が取る引数の量、それらの型などの必要なすべての情報を取得します。次に、関数の呼び出しを処理し、上記のように問題を解決できます。このように進む場合は、いくつかのASTトラバースメカニズム/ビジターを使用してこれらすべてのパスを実行する必要があります。この場合、ASTのトラバース/アプライビジターに対処する必要があり、パーサーに直接統合されたフェニックス構造のすべての美しさに「さようなら」と言わなければなりません。

これにどのように対処しますか?

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

boost-spirit - パーサーの内部文字型を変更するには?

私はかなり長い間スピリット クラシックを使用しており、最近 v2 の学習を開始しました。どちらも使いやすく、適度な解析問題を処理するのに十分強力です。

スピリット クラシックとアスキー キャラクターの牧歌的な時代に、仕事は単純に EBNF を LL 形式に適合させることです。しかし、最後に、i18n に対処する必要があります。

私の考えは本当に大雑把です。任意のエンコーディングの入力テキスト バイト ストリームを反復処理する前方反復子を作成します。イテレータはこれらのエンコーディング変換ジョブを処理し、パーサーに utf16/32 コード単位をフィードします (イテレータは iconv または icu4c で簡単に実装できます)。

コード単位の型は、パーサーによって処理される内部 char 型である必要があります。しかし、ドキュメントを読んだ後、明示的な char_t パラメータを持つプリミティブな反復子テンプレートがいくつかしか見つかりませんでした。それは、これらの数値、ディレクティブ、スキャナーなどを再構成する必要があるということですか?

v2ドキュメントもチェックアウトしました。すべてを一貫させる名前空間の方法を提供しますが、内部の char 型を明示的に変更する方法についてはまだそれほど多くはありません。繰り返しになりますが、メーリング リストのアーカイブを検索しましたが、Unicode やその他のエンコーディング関連の投稿はまだ公開されていないようです。エンコーディングが異なるこれらのファイルでもスピリットは機能する可能性があると言う人もいました。そこで、エンコーディングは異なるが同じ内容のファイルを使用してパーサーをテストしました。いくつかの MBCS でエンコードされたファイルがテストに合格し、偶然にも一部の utf8 ファイルも合格しました。しかし、他のエンコーディングはほとんどの場合失敗しました。

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

c++ - boost.spirit2を使用して式の行番号を格納する

Boost.Spirit 2を使用して(拡張診断情報用の)スクリプト変換ユーティリティを実行することを計画しています。

エラーの解析のための行情報などのサポートはありますが、Qiで正常に解析された式の行番号を保存するにはどうすればよいですか?

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

c++ - boost::spiritは文法から文法を構成します

私は精神の使い方を理解しました。つまり、適度に複雑な文法を書きました。私は常にプログラムを成長させるアプローチを取ります-一度に1つのサブシステム。最高レベルで4つのタイプを持つ複雑なモデルのデータ構造を記述しました。

ルールアプローチから構成された文法を使用して、一度に1つのタイプのトップレベルタイプを解析したいと思います。つまり、1つのトップレベルグラマーで4つのグラマーを記述したいと思います。これが可能である場合(私は疑い始めています)、誰かがこれを行うプロジェクトへのスニペットまたは参照を投稿してください。

50以上の(もっと多くの可能性がある)ルール(適切なエラー処理のため)を備えた1つのトップレベルの文法は、面白そうに聞こえません(TMPコードは揮発性/コンパイルが遅く、役に立たないエラーメッセージを提供します)。

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

c++ - ソートされていないスキーマのboost::Spirit Grammar

解析する必要のあるモデルのスキーマのセクションがあります。次のようになります。

プロパティは次のとおりです。

  1. 要素は順序付けられていないように見える場合があります。
  2. スキーマの一部であるすべての要素が表示される必要があり、他の要素は表示されない必要があります。
  3. 要素の合成された属性はすべて構造体に入ります。
  4. (オプション)スキーマは将来、タイプフィールド(つまり、タイプに基づいて異なるフィールド)に依存する可能性がありますが、現時点ではこれについては心配していません。
0 投票する
1 に答える
1265 参照

c++ - Boost.Spirit.Qi 使用時のエラーなだれ

コードの何が問題なのかわかりません。Boost のテンプレートは私を夢中にさせます! 私はこれらすべてについて頭も尻尾も作ることができないので、ただ尋ねなければなりませんでした。

これの何が問題なのですか?

エラーの数は膨大です。これを自分でコンパイルするのを手伝いたい人をお勧めします(私を信じてください、ここに貼り付けるのは実用的ではありません)。最新の TDM-GCC バージョン (GCC 4.4.1) と Boost バージョン 1.39.00 を使用しています。

static_assertおまけとして、C++0x の新しい機能がこの意味で Boost に役立つかどうか、上記で引用した実装が良いアイデアかどうか、または Boost の String Algorithms ライブラリを使用する必要があるかどうか、さらに 2 つのことをお聞きしたいと思います。 . 後者はおそらくはるかに優れたパフォーマンスを提供しますか?

ありがとう。

- 編集

次の非常に最小限のサンプルは、最初は上記のコードとまったく同じエラーで失敗します。

-- 編集 2

私の古いバージョンの Boost (1.39) でなぜ動作しなかったのかはまだわかりませんが、Boost 1.42 にアップグレードすると問題が解決しました。次のコードは、Boost 1.42 で完全にコンパイルおよび実行されます。

ヒントをありがとう、hkaiser。