問題タブ [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 SQL 文法/レクサーの失敗
次の SQL 文法には 2 つの問題があります。
問題 1: コメントから始める
ファイルがコメントで始まる場合、解析はすぐに失敗します。
この失敗したツリーでは:
しかし、直前に改行を追加すると機能します。どちらのタイプのコメント ("--" と "/**/") も失敗します。
問題 2: 一意のキーワードが認識されない
キーワードが unique の非常に特殊な条件下では、解析が失敗します。unique が大文字で、直後にコンマが続く場合は機能しません。
次のすべてのケースが成功します。
しかし、これはそうではありません:
何が悪いのか考えはありますか?ありがとう!
c++ - ブースト::スピリット::レックス; トークン "||" を指定するにはどうすればよいですか?
したがって、私の質問は非常に単純です。私のレクサークラス(extending lex::lexer<T>
)には、次のものがあります。
私のコンストラクター内では、コンパイルは問題なく実行されますが、実行時に SegFault がトリガーされます。問題は、正規表現システムの「or」演算子であることは明らか|
ですが、どうすればこの問題を回避できますか?
c++ - Boost::spirit 非ターミナルから値を取得
これは私のboost::spirit grammarにあります。
これらは次のように定義されています。
関数build_paren
には、次のプロトタイプがあります (コンパイラのキャスト エラーで見つかりました)。
ここで、ベクトルはそれぞれ 2 つの文字列を保持"(\0"
し")\0"
、これは予想どおりですが、どのようにしてchar
一致する文字を取得できますか?
本当に、私のbuild_paran
関数に欲しいプロトタイプは次のとおりです。
または、同じですchar
が、リストの最後の引数として引数を使用します。
token - boost::spirit::lex、エンド オブ ファイル トークンを生成するにはどうすればよいですか?
質問はかなり単純です。boost::spirit を使用してレクサーを作成しましたが、EOF
トークンを生成する方法が見つからないようです。- では、これを行うにはどうすればよいでしょうか?
c++ - Boost::spirit illegal_backtracking 例外
私は単純な電卓プロジェクトに Boost.Spirit.Lex と .Qi を使用していますが、(いつものように) デバッグして使用するのに苦労します。デバッグ出力:
この例外がスローされ、その理由がわかりません。私は自分のコードでマクロを使用していますが、最小限の例を示すのは面倒なので、プロジェクト全体を示します。ルートで「make」を実行し、./sash を起動すると、プロンプトが表示されます。テストする場合は、「-echo $5-8」を実行します。
Google は、この例外について同様の問題を見つけられなかったようです...
パーサーは算術/にあり、パーサーの呼び出しは算術/evaluator.cppの最後にあります
どれも大歓迎です。
c++ - Boost Spirit Lex のさまざまなタイプのセマンティック アクション
Boost の Spirit Lex は、トークン定義に対して複数のセマンティック アクションを持つことができますか?
次のレクサー構造を考えてみましょう。
ただし、状態切り替えのみが通過しますが、状態 single_line_comment で終わる行はカウントされません。
順序を入れ替えると、たとえば次のようになります。
行末がカウントされて状態スイッチが通らない。コンマで区切られた複数のセマンティックアクションを持つことは可能ですか?それとも、状態の切り替えやその他の必要なアクションを実行するために単一のファンクターを作成する必要がありますか?
c++ - ストリームのブースト スピリット レクサーが「早期」に十分にトークン化しない (先読みが多すぎる?)
Boost::spirit::lex lexer を使用して、入力ストリームをトークン化し、「Boost.Spirit.Lex とストリーム イテレータの使用」で説明されているように、spirit::istream_iterators を使用しています。
私の問題は、lex::tokenize が (入力ストリームに沿って) トークンを「早期」に出力しているように見えないことです。前のトークンを取得する前に、追加のトークン (または 2 つ?) 全体が使用可能になるのを待ちます。これは先読み遅延だと思いますが、なぜそれが必要なのか、それを回避する方法がわかりません。
次に例を示します。
セッションの例: (cin は私の OS によって行バッファリングされるため、最初の「行」がレクサーですぐに使用可能になることに注意してください)
lexer に最初の行を受け取ってもらいたいのですが、<NEWLINE>
. 代わりに、さようならを得る前に、さらに入力を待っているようです。
c++ - C++ boost::spirit lexer 正規表現
私は簡単なレクサー/パーサーをboost::spiritでやっています。
これはレクサーです:
WORD と NAME_CONTENT という 2 つの同一のパターンを定義しました。
これは文法です:
このコードは文法上 tok.word で動作しますが、tok.word を tok.name_content に置き換えると動作しません。しかし、tok.word == tok.name_content.
このコードの問題は何ですか?
PS:解析したいのは次のようなものです:.name "this is my name"
parsing - セマンティック アクションにおける Boost::Spirit トークン テキストの大文字と小文字を区別しない文字列の比較
トークナイザーとパーサーがあります。パーサーには、キーワード用の特別なトークン タイプ KEYWORD があります (最大 50 あります)。私のパーサーでは、トークンが期待どおりであることを確認したいので、それぞれにルールがあります。そのようです:
これは十分に機能しますが、大文字と小文字を区別しません (そして、私が処理しようとしている文法はそうです!)。boost::iequals を使用したいのですが、_1 を std::string に変換しようとすると、次のエラーが発生します。
これらのキーワードを文字列として扱い、大文字と小文字に関係なく期待されるテキストであることを確認するにはどうすればよいですか?