2

ラーゲルがファイルからソースをどのように読み取ったかはわかりません。私が見たすべての例は、標準入力から読み取られました。

プログラムが標準から読み取らない Ragel とのインターフェースの C の例を教えてください。

4

1 に答える 1

3

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に、マシンの状態を保持し、バッファの先頭と末尾をそれぞれポイントしますppe

マニュアルからの定義:

• 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 を参照してください。

于 2013-05-06T12:37:16.093 に答える