問題タブ [boost-spirit-lex]
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.
boost-spirit - Boost.Spirit(2)Lex:strip_comments_lexer.cpp-動作しませんか?
boost_1_47_0 / libs / spirit / example / lex /strip_comments_lexer.cppCスタイルのコメントを削除しません。なんで?
boost - boost::spirit::lex ベースのレクサーにシンボル テーブル インターフェイスを追加するにはどうすればよいですか?
typedef のサポートを実装するには、レクサーが識別子を識別して別のトークンを返すたびに、シンボル テーブルを検索する必要があります。これは、flex lexer で簡単に実行できます。私はブーストスピリットを使用してパーサーを構築しようとしていますが、例を調べましたが、レクサーとパーサーの間でコンテキスト情報を渡すものはありません。ミニ C コンパイラのチュートリアルの例でこれを行う最も簡単な方法は何ですか?
boost-spirit - レクサーruntime_errorのヘルプが必要
変更されたC言語用のCqiパーサーを作成しようとしています。t_in_opのコメントを外すと、以下のセクションでrun_timeエラーが発生します。
構文エラー:インデックス1で「+」のときにBEGINを押します(またはそれらの行に沿った何か、正確には覚えていません)。このレクサーの問題は何ですか?
simple.ic int i32 = 1;
c++ - BoostSpiritのレクサー機能でセマンティックアクションをコンパイルできません
だから、私はブースト1.47.0を使用していて、レクサーをまとめようとしています。
私の目標は、レクサーのトークンのいくつかに、を含むセマンティックアクションを追加することです
spirit::lex::_pass = spirit::lex::pass_flags::pass_ignore
。ただし、コンパイルするセマンティックアクションを取得できませんでした。以下に(多かれ少なかれ)最小限の例を添付しました。OSX10.7.1でclangを使用してコンパイルしています。
コンパイルコマンド
コンパイルするコード
コンパイルされないコード
コンパイルされないコードで報告されたエラー。
c++ - トークンの文字列値を取得できません
BoostSpiritを使用して小さなプログラミング言語用のレクサーを実装しようとしています。
トークンの値を取得する必要があり、bad_get例外が発生します:
'boost :: bad_get'のインスタンスをスローした後に呼び出された終了
what():boost :: bad_get:failed value get using boost :: get Aborted
私はこれを行うときにこの例外を取得します:
私のレクサーは次のように定義されています:
トークンの値を取得する他の方法はありますか?
c++ - boost :: spirit :: lexトークンの値をiterator_rangeから文字列に変換するにはどうすればよいですか?
iterator_rangeからトークンの値を変換しようとすると、次のトークンを読み取ろうとしたときにレクサーが失敗します。
トークン定義を保持するTokens構造体は次のとおりです:(これは適切ではないと思いますが、念のために含めています)。
トークンとレクサーのタイプの定義は次のとおりです。
トークンを読み取り、その値を文字列に変換するために使用しているコードは次のとおりです。
このコードの出力は「9」です(最初の数値を読み取り、ストリームに「インデックス」を残します)。この時点でstring(first、last)の値を出力すると、「ndex」と表示されます。何らかの理由で、レクサーはその「i」文字で失敗していますか?
std :: stringstreamを使用して変換を試みましたが、これにより次のトークンも無効になります。
最後に、トークンの値をcoutに送信するだけで、次のトークンは有効になります。
token-> value()によって返されるiterator_rangeがどのように機能するかについて私は何が欠けていますか?文字列に変換するために使用した方法はどちらも、integer_rangeまたはレクサーの文字の入力ストリームを変更するようには見えません。
編集:コメントの返信が短すぎて何が起こったのかを完全に説明できないため、ここにこれを追加します。
私はそれを考え出した。seheとdrhirschが指摘したように、私の最初の質問のコードは、私が実際に行っていることの滅菌バージョンでした。テストフィクスチャクラスでgtestユニットテストを使用してレクサーをテストしています。そのクラスのメンバーとして、指定された文字列から最初と最後のイテレータ(フィクスチャのデータメンバー)を割り当てるvoid scan(const std :: string&str)があります。問題は、この関数を終了するとすぐに、const std :: string&strパラメーターがスタックからポップされて存在しなくなり、フィクスチャーのデータメンバーであってもこれらのイテレーターが無効になることです。
話の教訓:イテレータがlexer :: begin()が参照するオブジェクトは、トークンを読み取ることを期待している限り存在する必要があります。
私はインターネットで私のばかげた間違いを文書化するよりもこの質問を削除したいのですが、コミュニティを助けるために私はそれを残すべきだと思います。
c++ - boost::spirit::lex を使用してインクルード ディレクティブを実装するにはどうすればよいですか?
私は、spirit::lex と spirit::qi から構築された単純な構成ファイル パーサーを持っています。レクサーがパターンinclude "path"
に到達したら、ファイルのテキストを含める必要があります。ご存じのとおり、spirit::lexer::begin() はスキャン プロセスを開始します。
私の考えは、構造体として表されるレクサー状態を格納するスタックを持つことです:
字句解析器は、パターンを認識include "path"
し、セマンティック アクションでインクルード ファイルへのパスを抽出します。次に、現在のレクサー状態がスタックにプッシュされ、ファイルの内容が文字列にロードされ、lexer::begin() を使用して上記のように新しい状態が初期化されます。
レクサーが EOF 文字を検出すると、スタックがポップされ、前のレクサー状態変数を使用して lexer::begin() が呼び出されます。
このように lexer::begin() を繰り返し呼び出しても大丈夫ですか? include "path"
qi パーサーにトークンを返さずに lex::lexer にパターンと EOF 文字を認識させるにはどうすればよいですか?
最後に、これを達成するための代替またはより良い方法はありますか?
c++ - Spirit lex 書き込みトークンの値を入力ストリームに戻す
boost::spirit::lex にトークン値を入力ストリームに書き戻し (おそらく編集後)、再スキャンする方法があるかどうか疑問に思っています。私が基本的に探しているのは、Flex の unput() によって提供されるような機能です。
ありがとう!
c++ - Spirit Lex:このトークンを生成したトークン定義はどれですか?
これが初心者の質問である場合は申し訳ありませんが、どのトークン定義が特定のトークンを生成したかを知る必要があります。トークンIDを出力すると、整数が得られます。どの正規表現がこのトークンを生成したかを知る必要があります。
編集:
トークンを定義する方法は次のとおりです。
ありがとう、ハイサム
boost - Spirit.Lex を使用して独特の単項マイナス記号を解析する
記号の周りに存在する空白によって、単項マイナスがバイナリマイナスと区別される言語を解析しようとしています。以下は、この言語でマイナス記号がどのように解釈されるかを定義するいくつかの疑似ルールです。
注:最後の規則の開きかっこは、「identifier」、「number」、および「close_paren」を除く言語の任意のトークンに置き換えることができます。
注: 4 番目のケースでは、x は識別子です。識別子は、独自のステートメントを構成できます。そして -y は別のステートメントです。
マイナス記号の型は空白に依存するため、レクサーから 2 つの異なるトークンが返されると考えました。1 つは単項マイナス用、もう 1 つはバイナリ マイナス用です。どうすればこれを行うことができますか?
コード:これは私にとってはうまくいくコードですが、十分に堅牢かどうかはよくわかりません。関係のないレクサー規則をすべて削除して、単純化しようとしました。
基本的に、バイナリ マイナス (difference
コード内で呼び出される) を両側に空白がある任意のマイナス記号として定義し、この規則を確実にするためにunputを使用しました。また、単項マイナスを記号または開き括弧の直前のマイナス記号として定義し、この規則が確実に維持されるように unput を使用しました (数値の場合、マイナス記号はトークンの一部です)。