問題タブ [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.
c++ - このboost::spirit :: qiルールが入力と一致しないのはなぜですか?
前の例で作業を続け、ルールを拡張しようとしました。私の問題は、ID_IDENTIFIERを使用するルールが機能しないことです。ただし、レクサーが機能していることはわかっています(単体テストを使用)。
次に例を示します。
ID_INTEGERを使用した同様のルールは、「1234」に適切に一致します
c++ - このboost::spirit :: qiルールが機能しないのはなぜですか?
次のルールを定義する文法があります。
次の文字列と一致させたい:
test [1] testident.ident
そしてそれは一致するべきではありません
test [1.2] testident.5
ただし、最初の2つの文字列とは一致しません。
レクサーコンストラクターは次のとおりです。
上記の文字列に一致しないのはなぜですか?
ありがとうトビアス
c++ - spirit::qi を使用しているときに、spirit::Lex からトークン属性を無視するにはどうすればよいですか?
Lex からトークンを受け取るこの qi 文法を使用すると、次のようになります。
このフュージョン/タプル マッピングと組み合わせて、キャプチャを支援します。
すべて正常に動作します。
ID_MARKER
しかし、解析のためにだけを使用したいと思います。私は本当にそれをキャプチャする必要も、キャプチャしたくもありません。
そこで、次を使用して属性を無視しようとしましたqi::lit
:
キャプチャから削除するm_dummy
だけでなく、テンプレート エラーの壁が表示されます。
これをクリーンアップするには、代わりに何をすべきですか?
c++ - 精神のqi::as_stringを繰り返しで動作させる方法は?
qi::as_string[]
どういうわけか、私はと仕事をすることができませんrepeat()[]
。
解析std::string str = { "{ +100S+++ ;\n }" };
すると、次の出力が得られます
これは、解析+
がうまくいったことを示しています+++
。
注three_plus_or_minus
: 1 ~ 3 個のプラスまたはマイナスを連続して文字列としてキャプチャしようとしています。使用しない代替ソリューションas_string[]
も高く評価されます。
リストが長くなって申し訳ありませんが、実際のコードではレクサーとパーサーの両方を使用する必要があります。
コード
c++ - token_defの値型への変換
字句解析器で定義するとき
そしてそれをいくつかの文法で次のように使用します
では、文字列はどのようにして正しいトークン値タイプ(unsigned int
この場合)の値に変換されますか?カスタム型または浮動小数点型をトークン値型として指定するとどうなりますか?変換ルーチンの存在はどこにありますか(私は変換のようなものだと思いますboost::iterator_range
)double
?
c++ - Boost.Spirit を使用してトークン化された自由形式の文法を解析する
valgrind の一部である callgrind ツールの出力用の Boost.Spirit パーサーを作成しようとして行き詰まりました。Callgrind はドメイン固有の組み込みプログラミング言語 (DSEL) を出力します。これを使用すると、合成カウンターのカスタム式など、あらゆる種類の優れた機能を実行できますが、解析するのは簡単ではありません。
サンプルの callgrind 出力をhttps://gist.github.com/ned14/5452719#file-sample-callgrind-outputに配置しました。https://gist.github.com/ned14/5452719#file-callgrindparser-hppおよびhttps://gist.github.com/ned14/5452719で、Boost.Spirit lexer およびパーサーに現在の最善の試みを行いました。 #file-callgrindparser-cxx . レクサー部分は簡単です。タグ値、空白以外のテキスト、コメント、行末、整数、16 進数、浮動小数点数、および演算子をトークン化します (サンプル コードの句読点は無視してください。これらは使用されていません)。空白はスキップされます。
ここまでは順調ですね。問題は、トークン化された入力ストリームの解析です。私はまだ主要なスタンザを試みていませんが、ファイル内の任意の場所で発生する可能性のあるタグ値を解析しようとしています。タグの値は次のようになります。
自由形式のテキストでもかまいません。
この状況では、一連のトークンを文字列、つまり iterator_range に変換して抽出する必要があります。
ただし、式の場合もあります。
これは、これから、イベント EPpsec は、I1mr に 1120 を掛けたものに Ir を掛けた 316 を足したものとして合成されることを意味します。
ここで言いたいのは、タグと値のペアを任意のトークンのセットとして蓄積し、後処理して後で変換する必要があるということです。
そのために、Boost.Spirit の utree() クラスはまさに私が求めていたものであり、それがサンプル コードで使用されています。しかし、VS2012 で 11 月の CTP コンパイラを可変個引数テンプレートとともに使用すると、現在、次のコンパイル エラーが発生しています。
...これは、前方反復子の性質のためのistreambuf_iteratorのBoost.Spirit multi_pass<>ラップである私のbase_iterator_typeが、Boost.Spiritのutree()実装によって何らかの形で理解されていないことを示唆しています。つまり、これが私の悪いコードなのか、それとも悪い Boost.Spirit コードなのかはわかりません。
過去の Stackoverflow ヘルプのおかげで、トークン化されていない純粋な文法を書くことができましたが、それはもろいでしょう。適切な解決策は、トークン化して、かなり任意の入力が可能な自由形式の文法を使用することです。Boost.Spirit の Lex と Grammar を実際の例で連携させてこれを達成した例は、おもちゃの例ではなく、残念ながら非常に少ないです。したがって、どんな助けでも大歓迎です。
ニール
c++ - 精神::レックスでトークンのエスケープ文字を取り除く方法は?
SQL 構文の独自の拡張機能をトークン化したいと考えています。これには、二重引用符で囲まれた文字列内のエスケープされた二重引用符の認識が含まれます。たとえば、MySQL では、これら 2 つの文字列トークンは同等です: """"
(2 番目の二重引用符はエスケープ文字として機能します) と'"'
. さまざまなことを試しましたが、トークンの値を置き換える方法に行き詰まっています。
トークンが見つかった"
ときにトークンの値を設定するにはどうすればよいでしょうか。""
それとは別に、次の質問もあります: ctx.more() を呼び出すセマンティック アクションのファンクターを記述し、同時にトークンを無視することができます (したがって、「低レベル」トークンを「高レベル」文字列トークンに結合します) )。しかし、これを lex::_state = ".." とエレガントに組み合わせる方法は?
c++ - Phoenix アクターを使用してトークン値を変更するブーストスピリットの例をコンパイルできない
( の例を使用して) 以下のコードをコンパイルしようとするとboost\spirit\home\lex\argument.hpp: value_setter
、次のコンパイラ エラーが発生します。
セマンティック アクションがなければ、すべて正常にコンパイルされます。次に例を示します。
何がうまくいかないのですか?トークンの値を設定/変更するにはどうすればよいですか?
c++ - Boost Spirit Parser をベンチマークする方法は?
私はコンパイラに取り組んでおり、そのパフォーマンスを改善したいと考えています。時間の約 50% がソース ファイルの解析に費やされていることがわかりました。ソースファイルは非常に小さく、その後かなり多くの変換を行っているため、完璧にできるように思えます。
私のパーサーはレクサー (lexer::pos_iterator を使用) を備えたブースト スピリット パーサーであり、中規模の文法を使用しています。ソースを AST に解析しています。
私の問題は、解析中に何が最も時間がかかるのかわからないことです: AST ノード、レクサー、パーサー ルール、またはメモリのコピーです。
私はSSDで作業していて、最初にファイル全体を読み込んでからメモリバージョンのみを使用しているので、I / Oの問題ではないと思います。
プロファイラーを使ってみたのですが、時間のかかるメソッドは何百文字もあるBoostのメソッドで、何をするのかよくわかりません...
では、Boost Spirit Parser とその文法をベンチマークする好ましい方法はありますか? または、特定のポイントで効率を検証するために使用できるルールはありますか?
ありがとう
興味のある人のための情報源:
c++ - Boost Spirit を使用して文法を解析する未処理の例外
Boost Spirit を使用して、次の文法を解析しようとしています: 文: 名詞 動詞 文 接続文
接続詞:「そして」
名詞:「鳥」「猫」
動詞:「飛ぶ」「ニャー」
文法に名詞 >> 動詞ルールのみが含まれている場合、解析は成功します。文法が文 >> 接続 >> 文規則を含むように変更され、「birdsfly」ではなく「birds fly」などの無効な入力を指定すると、プログラムの実行時に未処理の例外が発生します。
これは、boost doc にある例から変更されたコードです