1

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

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

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

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

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

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

4

1 に答える 1

0

あなたの最善の策は、おそらくfbreak各トークンの後に呼び出してから、再初期化せずにマシンを再度呼び出すことpですcs

(Ragel 6.9)マニュアルから:

fbreak;–進みp、ターゲットの状態を保存しcs、すぐに実行ループから抜け出します。このステートメントは、noend書き込みオプションと組み合わせると便利です。peに到達するまで入力を処理するのではなく、fbreakステートメントを使用してアクションからの処理を停止できます。fbreakステートメントの後、p変数は入力の次の文字を指します。現在の状態が現在の遷移のターゲットになります。fbreakターゲット状態の to-state アクションがスキップされることに注意してください。

このオプションは実際には必要ないことに注意してくださいnoend。このオプションは を無視するためのpeものですが、パーサーが解析している文字列の末尾を検出できるようにするため、この場合はおそらくやりたくないでしょう。

于 2016-01-07T01:16:01.983 に答える