問題タブ [ragel]
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++ - C と C++ のポインターの違い
次の C コードは「警告: 初期化によりポインター ターゲット型から修飾子が破棄されます」が表示されることに注意しましたが、それでもコンパイルして期待どおりに動作します (「W」文字を出力します)。
C++ では、同様のコードがまったくコンパイルされず、「エラー: 'const char*' から 'char*' への変換が無効です」というエラーが表示されます。
理由は何ですか?
C++ コードを修正して、C コードと同じようにコンパイル (および動作) させることはできますか?
より良い説明:すべての回答に感謝しますが、ほとんどの人は私の本当の問題を理解していないので、もっと詳しく説明しようと思います.
私は C で書かれたライブラリを使用しています。ヘッダーの関数プロトタイプは次のようなものです。
この関数の実装内では、たまたま次のようなコードが実行されます。
コードを C で記述し、このライブラリに対してコンパイルすれば、すべて問題ありません。
C++ プロジェクトで必要なので、このライブラリを C++ に移植したいと思います。関数パラメーターを定数ではなく変数として再定義することで、ライブラリの移植に成功しました。しかし、p
ポインターは実際には変更する必要がないので、元の C ライブラリのように定数として定義することをお勧めします。定数ではなく変数を配置すると、元のセマンティクスをすべて保持せずにライブラリを移植することになります。C++ ライブラリが元の C ライブラリと同じように動作するかどうかわからないので、これは悪いことです。
これが十分に明確であることを願っています。
(うまくいけば)さらに良い説明:
AVR チュートリアル - [コード][C] Ragel を使用して文字列を柔軟に/効率的に解析するのチュートリアルに従っていますが、問題はparse_microscript()
関数に関連しています。
Arduino コード (つまり ) をパーサーに埋め込みたいのでSerial.println();
、チュートリアルで提案されている C ではなく、C++ ホスト言語でこの Ragel パーサーをコンパイルしようとしています。
まず、Arduino.h
生成された C コードに含めようとしましたが、Arduino IDEはコンパイルされません (C と C++ コードが混在しているためだと思います)。
次に、同じ Ragel スクリプトから C++ コードを生成しようとしましたが、コンパイル時に複数の「'const char*' から 'char*' への無効な変換」エラーが発生し、生成されたコードがターゲットになりました。
C++ で機能させる唯一の方法は、すべての定数キーワードを削除することでした。C コードの元のセマンティックを変更しているので、これは悪いことですが、動作します。
上記の C および C++ のスニペットを提供して問題を切り分けようとしましたが、おそらくその点の説明が不十分でした。
受け入れられた答えは、C++ スニペットをコンパイルできるものですが、このソリューションを Arduino コードで試してもうまくいきません。
コマンドでコンパイルされた作業 Ragel スクリプトを配置しますragel -G2 -o microscript.cpp microscript.rl
。
ご覧のとおり、parse_microscript
関数の最初のパラメーターを constchar* p
からchar*p
、およびconst char* pe
に変更する必要がありましたchar* pe
。
c++ - Ragel での解析の一時停止と再開
Ragel を使用して、C++ で文字列を解析しています。解析を無期限に一時停止し、中断したところから解析を再開できるようにする必要があります。
fbreak
現在、仕上げアクションの最後に を付けることで、これを実行しようとしています。これは正常に機能しているようで、制御を親プログラムに戻します。ただし、解析を再開する方法がわかりません。で生成されたコードを呼び出すだけで十分だと思っていました%write exec
が、そうではないようです。解析に戻ると、元の文字列への参照が間違っているか失われているようです。
ここで C++ で何か間違ったことをしているのか (それは私の母国語ではありません)、それとも Ragel で間違ったアプローチをとっているのかはわかりません。
これが私の開始コードと再開コードです。
初めて を呼び出すstart()
と、ステートマシンは最終的に終了し、 (できれば) 解析を続行するためにfbreak
呼び出します。resume()
私が間違っているかもしれないことについての指針はありますか?
c - Ragel EOF アクションを機能させる方法
私は Ragel と協力して FSA を評価しており、マシンが入力のテストを終了するたびに実行されるユーザー アクションを埋め込みたいと考えています。マシンが受け入れ状態で終了するかどうかに関係なく、このアクションを実行する必要があります。私が何をしようとしているのかを説明する Ragel ガイドから取られたこの変更された例があります。
この例の私の目標は、入力が 'foo' または 'bar' の場合に res が 1 になるようにすることです。一方、finished は入力に関係なく 1 になります。ただし、これを機能させることはできません-resが1の場合は1、resが0の場合は0のようです。
どんな助けでも素晴らしいでしょう。
c - ラーゲルはどのようにしてファイルからソースを読み取ったのですか?
ラーゲルがファイルからソースをどのように読み取ったかはわかりません。私が見たすべての例は、標準入力から読み取られました。
プログラムが標準から読み取らない Ragel とのインターフェースの C の例を教えてください。
state-machine - Ragel、最終状態、EOF
Ragel が「最終」状態と見なすものを理解できません。IIRC のユーザーズ ガイドによると、マシンの単純化の前に最終的な状態は、その後も最終的なままです。状態が最終的なのはいつで、これをどのように認識しますか?
応用:
ステート マシンの構文を使用して、文字列ファインダーを実装しています。n より大きい長さの ASCII 文字列を見つけて、それらを出力します。これは、以下のように最大長マッチャーを実装することを意味します。
ドット出力が最終状態を示さないという事実にもかかわらず、EOF 遷移は、使用されるフレーバーによって異なる動作をします{$%@}eof
。なぜこれが必要なのかわかりません。たとえば、has_string
以下の状態では、%eof
代わりにを使用すると、とアクション@eof
の両方が、一致する状態を終了する生成/合成状態の 1 つから呼び出されます。commit_nonstring_eof
commit_string_eof
これが動作中のステートマシンです。右端のノードの終了アクションには、アクションが 1 つだけあることに注意してくださいcommit_nonstring_eof
。
これは壊れたステートマシンです。右端のノードの exit アクションは、 と の両方
commit_string_eof
を呼び出すことに注意してください。commit_nonstring_eof
d - この Ragel ファイルが暗黙的な変換エラーを生成するのはなぜですか? (ラゲル with D)
次の(非常に単純な) Ragel ファイルがありますscanner.rl
。
を使用して変換scanner.rl
します。結果のファイルをでコンパイルしようとすると、次のエラー メッセージが表示されます。scanner.d
ragel -D scanner.rl
D
dmd scanner.d
scanner.d(97): エラー: const(byte)* 型の式 (&_scanner_actions[cast(ulong)_scanner_from_state_actions[cast(ulong)cs]]) を byte* に暗黙的に変換できません scanner.d(110): エラー: できませんconst(char)* 型の式 (&_scanner_trans_keys[cast(ulong)_scanner_key_offsets[cast(ulong)cs]]) を char* に暗黙的に変換する scanner.d(166): エラー: 式を暗黙的に変換できません (&_scanner_actions[cast(ulong) _scanner_trans_actions[cast(ulong)_trans]]) 型 const(byte)* から byte* への scanner.rl(22): エラー: immutable(char)* 型の式 (ts) を ulong scanner.d(186) に暗黙的に変換できません): エラー: const(byte)* 型の式 (&_scanner_actions[cast(ulong)_scanner_to_state_actions[cast(ulong)cs]]) を byte* に暗黙的に変換できません
おそらく私は何か重要なものを見逃していますか?
eclipse - Eclipse:実行可能ファイルはどこで検索しますか?
解析にラゲルを使用するプロジェクトがあります。コンパイルしようとすると、このエラーが発生します。
/bin/sh: ragel: コマンドが見つかりません
だから私は日食がラゲルのためのいくつかのパスを見ていると推測しています. 現在、ragel は /usr/local/bin にあります。日食がラゲルを検索しようとしている場所を見つけることができません。