ラーゲルがファイルからソースをどのように読み取ったかはわかりません。私が見たすべての例は、標準入力から読み取られました。
プログラムが標準から読み取らない Ragel とのインターフェースの C の例を教えてください。
Ragel は、いくつかの変数がスコープ内にあり、スキャンしているバッファーのさまざまな重要な部分を指していると想定しています。それらが何と呼ばれることが期待されているか、およびRagel User Guideでそれらを変更する方法を見つけることができます。セクション 5、ホスト プログラムへのインターフェイスは、ここでの友達です。
最初の引数でスキャナーを実行するマニュアルの例:
#include <stdio.h>
#include <string.h>
%%{
machine foo;
write data;
}%%
int main( int argc, char **argv )
{
int cs;
if ( argc > 1 ) {
char *p = argv[1];
char *pe = p + strlen( p );
%%{
main := [0-9]+ ( '.' [0-9]+ )?;
write init;
write exec;
}%%
}
printf("result = %i\n", cs >= foo_first_final );
return 0;
}
基本的cs
に、マシンの状態を保持し、バッファの先頭と末尾をそれぞれポイントしますp
。pe
マニュアルからの定義:
• cs - 現在の状態。これは整数である必要があり、データが個別に処理されるブロックに分割される場合、マシンの呼び出し間で持続する必要があります。この変数は、実行ループの外側から変更できますが、内側から変更することはできません。
• p - データ ポインタ。C/D コードでは、この変数は処理する文字データへのポインターであると想定されます。マシンを実行するたびに、データ ブロックの先頭に初期化する必要があります。Go、Java、および Ruby では、データへの Oset として使用され、整数でなければなりません。この場合、マシンを実行するたびにゼロに初期化する必要があります。
• pe - データ終了ポインタ。これは、マシンの実行ごとに p にデータ長を加えた値に初期化する必要があります。Go、Java、および Ruby コードでは、これはデータ長に初期化する必要があります。
• eof - ファイル ポインターの終わり。これは、処理中のバッファ ブロックが最後のものである場合は pe に設定する必要があり、それ以外の場合は null に設定する必要があります。Go、Java および Ruby コードでは、null の代わりに -1 を使用する必要があります。nal buer ブロックが処理された後にのみ EOF イベントを知ることができる場合は、p = pe = eof を設定して実行ブロックを実行することができます。
• data - この変数は、Go、Java、および Ruby コードでのみ必要です。処理するデータを含む配列でなければなりません。
• stack - これは整数の配列でなければなりません。状態を表す整数値を格納するために使用されます。スタックのサイズを動的に変更する必要がある場合は、Pre-push および Post-Pop ステートメントを使用してこれを行うことができます (セクション 5.6 および 5.7)。
• top - これは整数値である必要があり、スタックの oset として使用され、スタックの一番上に次に使用可能なスポットを提供します。
• act - これは整数値でなければなりません。これは、最近成功したパターン マッチを追跡するためにスキャナー コードで使用されることがある変数です。
• ts - 文字データへのポインタである必要があります。Go、Java、および Ruby コードでは、これは整数でなければなりません。詳細については、セクション 6.3 を参照してください。