EOFアクション(Ragelドキュメントのセクション3.2.2 EOFアクション)を使用して、Ragelを使用してその場で式をチェックできます。これらは、入力バッファーの終わりが有効な状態(非ファイナルを含む)で検出されたときにトリガーされます。
簡単な例:
main := ([a-z]{2,5}'ABC'[0-9]+) @/{correct = 1;} %{correct = 1;};
アクション「@/」は、すべての非最終状態に適用されます。開始状態が含まれているため、この場合は空の文字列が正しいです。アクション「%」は、入力バッファ全体がパターンに一致した場合の最終状態です。上記の例では、両方のアクションのコードは同じですが、実際には最終状態が別々に処理されることがよくあります。不要な場合は、上記のサンプルを簡略化できます。
main := ([a-z]{2,5}'ABC'[0-9]+) $/{correct = 1;};
提供されたパターンをチェックするためのC出力を備えた完全なRagelサンプルを以下に示します。Javaに変換しても問題ないことを願っています。
#include <stdio.h>
%%{
machine checker;
write data;
}%%
unsigned char checker( const char *str )
{
/* standart Ragel variables */
const char *p = str, *pe = str + strlen( str ) - 1; //-1 to strip "\n"
const char *eof = pe;
int cs;
unsigned char correct = 0;
%%{
action final { printf("entire match"); correct = 1; }
action partial { printf("partial match"); correct = 1; }
main := ([a-z]{2,5}'ABC'[0-9]+) @/partial %final;
write init;
write exec;
}%%
return correct;
};
#define BUFSIZE 1024
int main()
{
char buf[BUFSIZE];
while ( fgets( buf, sizeof(buf), stdin ) != 0 ) {
printf( "%d\n", checker( buf ));
}
return 0;
}