問題タブ [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.

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

parsing - Ragel - 一度に 1 つのトークンを返す方法

呼び出しごとに 1 つのトークンの ragel 文法 / ものを構築したいと考えています。

私は Ragel には比較的慣れていません (ただし、コンパイラなどは初めてではありません)。

json のような表記法 (深さ 3 レベル) の文法を作成しました。Cコードを発行します。

私の入力は完全な文字列です (バッファ境界を越える必要はありません)。

入力文字列を使用して文法を呼び出し、文法が 1 つのトークンを返すようにします。次に、もう一度呼び出して、次のトークンを返すようにします。文字列の終わりまで。次に、新しい文字列で再度呼び出します。

ステート マシンはこの種の動作に完全に適していると考える人もいるでしょうが、私は Ragel でこれを達成する方法をまだ理解できていません。

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

state-machine - Ragel: 他の何かと一致しないものすべてを一致させるにはどうすればよいですか?

Ragel を使用して非常に単純なパーサーを実装しました。「主な」構造はスキャナーです。

私はこのようなものを実装しています:

他のルールに一致しないものすべてに一致させるにはどうすればよいですか (つまり、基本的にエラー状態、何らかの不正な入力)。不正な入力がある行でエラーを取得できるように実装したいと思います。スキャナーの最後に「any」条件を使用しようとしましたが、それは常に「最長一致」であり、スキャナーは毎回一致するため、もちろん機能しません。他のすべてのトークンを含むリストからある種の否定を取りたいとは絶対に思いません (「any」からそれらを除外するため)。 . Ragel のスキャナーで他のものと一致しないものをすべて一致させるにはどうすればよいですか?

編集:いくつかのテストを行いましたが、スキャナーの最後にある「any」と一致するだけで機能します。文字が一致しない場合は、その式に移動します。ただし、「any+」と一致させようとすると、毎回そこに移動するため機能しません (すべてのデータについて、常にスキャナーで最も長い一致になります)。「任意」に一致するだけの問題は、一致しないデータの連続ブロック全体へのトークン開始ポインターとトークン終了ポインターを取得できないことです。「他に一致しない最長連続文字ブロック」を一致させるにはどうすればよいですか?

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

ragel - 基本 Ragel パーサー

このようなマシンでは:

メイン := (任意の +);

1 バイトを超えるデータのチャンクをフィードすると、%%write exec ブロックから (通常は) 出る前に 1 バイトしか消費しないようです。貪欲で、提供されたすべての入力を消費することを期待しています。

私はいつでも p < pe をチェックして %%write exec の前に移動できますが、それはハックのようです。

どうすればそれを「貪欲」にできますか?

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

c - ネットワーク プロトコルをシミュレートするための C 用有限状態マシン コンパイラ

いくつかのカスタム ネットワーク プロトコルをテストするために、優れたステート マシン コンパイラを探していました。Yakindu、Ragel (コンパイラ)、SCXML (言語) などのいくつかのツールを既に調べましたが、それらのいずれかがネットワーク プロトコルに使用できるかどうかはわかりませんでした。

SCXML(language) は良さそうですが、C 専用のコンパイラは見つかりませんでした (scxmlcc は C++ 用です)。SCXML に基づく C のコンパイラを知っている人はいますか? Yakindu ツールは有望に見えますが、BGP/OSPF などのネットワーク プロトコルをテストできるかどうかはわかりません。誰でもこれについての指針を教えてください。Ragel も良さそうですが、このコンパイラを使用して複雑なネットワーク プロトコル クライアントを生成できるかどうかはわかりません。

特にネットワーク プロトコルについて言及した理由は、「イベント」が発生した後の「アクション」の一部として、packet_create/packet_send (カスタム パケット サイズ) などのカスタム ルーチンを実行できるようにしたいからです。

常に状態グラフからコードを生成する必要がありますか、または状態と直接対話する方法はありますか? 私はFSMに非常に慣れていません。ヘルプ/アドバイス/提案/リンクは大歓迎です。

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

ragel - Ragel: "when" 句関数の冗長な呼び出しを避ける

私はかなり単純なバイナリ プロトコル用の Ragel マシンを作成しています。ここで提示するのは、解決しようとしている問題を示すためだけに、エラー回復を一切行わない、さらに単純化したバージョンです。

したがって、ここで解析されるメッセージは次のようになります。

マシンは次のようになります。

ご覧のとおり、最初に長さを表す 1 バイトを受け取ります。次に、data必要な量のバイトを受信するまでバイトを受信し (チェックは によって行われますis_waiting_for_data)、次の (追加の) バイトを受信すると、それが正しいチェックサムであるかどうかをチェックします ( によってis_checksum_correct)。そうであれば、マシンは次のメッセージを待ちます。そうしないと、この特定のマシンが停止します (図を簡略化するために、ここでは意図的にエラー回復を含めていません)。

その図は次のようになります。

クリックして画像を表示

ご覧のとおり、状態 1 では、ユーザー データを受信して​​いる間、条件は次のとおりです。

そのため、すべてのデータ バイトで冗長に を呼び出しますis_checksum_correctが、結果はまったく問題になりません。

条件は次のように単純にする必要があります。0..255(is_waiting_for_data)

それを達成する方法は?

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

ragel - Ragel のソース リポジトリはどこにありますか

元のアドレス git://git.complang.org/ragel.git は機能しなくなりました。Google 検索では、古いコードの非公式リポジトリのみが表示されます。

その開発は現在 Colm Network の下で行われているため、Colm Networks は引き続き開発リポジトリを公開しますか?