Ragel可以把正則表達式翻譯成有限狀態機(FA)的各種語言表示,包括C、C++、Objective-C、D、Java和Ruby。Regular Expression和FA的用途很廣,可以用于協議分析、數據解析、詞法分析、用戶數據校驗等。在Ragel的幫助下,寫一個atoi的函數非常容易,而且比標準庫提供的atoi函數性能要高。
/*
* Convert a string to an integer.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
%%{
machine atoi;
write data;
}%%
long long atoi( char *str )
{
char *p = str, *pe = str + strlen( str );
int cs;
long long val = 0;
bool neg = false;
%%{
action see_neg {
neg = true;
}
action add_digit {
val = val * 10 + (fc - ‘0′);
}
main :=
( ‘-’@see_neg | ‘+’ )? ( digit @add_digit )+
‘\n‘;
# Initialize and execute.
write init;
write exec;
}%%
if ( neg )
val = -1 * val;
if ( cs < atoi_first_final )
fprintf( stderr, "atoi: there was an error\n" );
return val;
};
#define BUFSIZE 1024
int main()
{
char buf[BUFSIZE];
while ( fgets( buf, sizeof(buf), stdin ) != 0 ) {
long long value = atoi( buf );
printf( "%lld\n", value );
}
return 0;
}