woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

Ragel状态机生成器

Ragel可以把正则表达式翻译成有限状态机(FA)的各种语言表示,包括CC++Objective-CDJavaRubyRegular ExpressionFA的用途很广,可以用于协议分析、数据解析、词法分析、用户数据校验等。在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;
}

 

posted on 2008-12-24 14:13 肥仔 阅读(702) 评论(0)  编辑 收藏 引用 所属分类: 状态机 & 自动机 & 形式语言


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理