青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

Ragel 狀態機簡介

從今天開始我把我前一段時間用到的狀態機工具Ragel的使用方法做一些總結,希望大家斧正!


(
如果大家對狀態機概念有模糊的話,請參考<<編譯原理>>一書,基本上有詳盡的介紹)

好閑言少敘,言歸正傳

Ragel
可以從正規表達式生成可執行有限狀態機,它可以生成C,C++,Object-C,D,JavaRuby可執行代碼

官方網站:http://www.cs.queensu.ca/home/thurston/ragel/

第一回

Ragel
是一個可以生成協議處理代碼的工具. 

先舉個例子,簡簡單單的幾行代碼,實現的功能為將一個數字字符串轉換成整數:

[Copy to clipboard] [ - ]

CODE:

int atoi( char *str )
{
char *p = str;
int cs, val = 0;
bool neg = false;

%%{       //Ragel
的關鍵字,用于聲明狀態機代碼段的開始
  action see_neg {
   neg = true;
  }

  action add_digit {
   val = val * 10 + (fc - '0');
  }

  main :=
   ( '-'@see_neg | '+' )? ( digit @add_digit )+
   '\n' @{ fbreak; };

  # Initialize and execute.
  write init;                                  //
狀態機關鍵字,這個會再接下來的內容中介紹
  write exec noend;                     //
同上
}%%                                        //
狀態機代碼段結束標記

if ( neg )
  val = -1 * val;

if ( cs < atoi_first_final )
  cerr << "atoi: there was an error" << endl;

return val;
};


c里面那500多行實現的atoi函數更加高效

上面這段代碼,生成的C語言代碼如下:

[Copy to clipboard] [ - ]

CODE:

int atoi( char *str )
{
char *p = str;
int cs, val = 0;
bool neg = false;

#line 27 "atoi.c"
{
cs = atoi_start;
}

#line 31 "atoi.c"
{
switch ( cs )
{
case 1:
switch( (*p) ) {
  case 43: goto st2;
  case 45: goto tr2;
}
if ( 48 <= (*p) && (*p) <= 57 )
  goto tr3;
goto st0;
st0:
goto _out0;
tr2:
#line 23 "atoi.rl"
{
   neg = true;
  }
goto st2;
st2:
p += 1;
case 2:
#line 52 "atoi.c"
if ( 48 <= (*p) && (*p) <= 57 )
  goto tr3;
goto st0;
tr3:
#line 27 "atoi.rl"
{
   val = val * 10 + ((*p) - '0');
  }
goto st3;
st3:
p += 1;
case 3:
#line 63 "atoi.c"
if ( (*p) == 10 )
  goto tr4;
if ( 48 <= (*p) && (*p) <= 57 )
  goto tr3;
goto st0;
tr4:
#line 33 "atoi.rl"
{ goto _out4; }
goto st4;
st4:
p += 1;
case 4:
#line 74 "atoi.c"
goto st0;
}
_out0: cs = 0; goto _out;
_out4: cs = 4; goto _out;

_out: {}
}
#line 38 "atoi.rl"


if ( neg )
  val = -1 * val;

if ( cs < atoi_first_final )
  cerr << "atoi: there was an error" << endl;

return val;
};


對應的狀態圖如下圖所示:

clip_image001

 

正則表達式廣泛應用于解析器中。它們通常被用來作為黑盒與程序邏輯聯系在一起。對正則表達式引擎在執行某些解析工作之后,調用用戶自定義行為。加入新的自定義行為,需要重新定義原來的格局,然后粘貼到程序邏輯中。自定義行為越多,正規表達式的優勢越小。

Ragel
是一個可以根據用戶定義的正則表達式或是由正則表達式生成的狀態圖來生成健壯的,無依賴的可執行代碼,包括C,C++Object-C, Java, Ruby 等等. 可以靈活控制已經生成狀態機的變動,利用已經嵌入自定義行為的模式重構掃描器

Ragel
基于任何正規語言能被轉化為有限狀態自動機的原理

基本的使用步驟如下:

首先,根據你的業務流程邏輯與需要,按照ragel提供的語法與關鍵字編寫.rl文件

1
        編寫.rl文件, 如下所示:

[Copy to clipboard] [ - ]

CODE:

/*
* to parse a string started with “table” or “div”
*/

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

%%{
                #
狀態機的名字(必須有一個名字而且必須符合命名規則,和變通的變量聲明一樣)
        machine par_str;
        write data;
}%%
//
函數聲明,用于在用戶自定義行為中調用,用到了參數的傳遞,此函數也可以是類成員函數
void printtable(int len)
{
   printf("there is a table,length is:%d\n",len);
}

//
另外一個函數,功能同上,只是參數傳遞用的是引用傳遞
void printdiv(char *p)
{
  printf("%s\n",(*p));
}
//
主處理函數
void par_str( char *str,int len )
{
        char *p = str, *pe = str + strlen( str );
        int cs;        //
狀態機關鍵字,用于說明當明狀態,以整型值標識(current status的縮寫)
                //
狀態機自定義行為塊
        %%{
                        #
調用自定義函數
                        action see_table {
                                 printtable(len);
                }
               #invoke prindiv function to show the table information, as same as above
               action see_div {
                                  printdiv(p);
               }
               #
正則表達式聲明,用于在狀態機初始化時,按照此規則匹配目標
               main :=
                                ([t][a][b][l][e]@see_table) ([d][i][v]@see_div)+'\n';
               #
初始化
               write init;
               write exec;
        }%%

                if ( cs < par_str_first_final )
                fprintf( stderr, "par_str: there was an error\n" );
};

#define BUFSIZE 1024
//
主函數,用于測試生成的狀態機
int main()
{
        char buf[BUFSIZE];
        while ( fgets( buf, sizeof(buf), stdin ) != 0 )
{
par_str(buf,10);
}
                return 0;
}


接下來,ragel命令生成目的語言文件

CODE:

ragel -o test.cpp test.rl


用代碼生成工具,直接生成可執行代碼

CODE:

rlcodegen -o hello.cpp test.cpp


最后編寫對此代碼的Makefile,make........


 

 

posted on 2008-12-24 15:18 肥仔 閱讀(3192) 評論(1)  編輯 收藏 引用 所屬分類: 狀態機 & 自動機 & 形式語言

評論

# re: Ragel 狀態機簡介  回復  更多評論   

2009-04-19 19:36 | jans2002
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中国av一区| 久久精品首页| 国产精品欧美一区喷水| 欧美精品二区| 欧美剧在线观看| 欧美三级日本三级少妇99| 国产精品麻豆欧美日韩ww| 国产精品视频一区二区三区 | 欧美一区二区播放| 久久精品夜色噜噜亚洲a∨| 久久久综合香蕉尹人综合网| 另类欧美日韩国产在线| 欧美日韩在线视频一区| 国产区在线观看成人精品| 精品91视频| 亚洲卡通欧美制服中文| 香蕉久久一区二区不卡无毒影院| 久久久久天天天天| 亚洲精品在线电影| 欧美一区二区日韩| 欧美精品v国产精品v日韩精品| 国产精品高潮呻吟久久| 在线观看日韩国产| 欧美一区二区高清在线观看| 欧美成人一区二区三区在线观看 | 国产精品xnxxcom| 激情综合色综合久久| 亚洲最新视频在线播放| 久久免费精品视频| 在线一区二区日韩| 欧美国产日韩免费| 精品福利免费观看| 久久精品人人| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美一区二区三区在线看| 欧美专区在线观看| 久久精品视频网| 久久精品国产在热久久| 欧美 日韩 国产一区二区在线视频| 老司机凹凸av亚洲导航| 日韩亚洲综合在线| 免费高清在线视频一区·| 欧美人妖在线观看| 极品尤物一区二区三区| 亚洲免费视频一区二区| 亚洲美女黄网| 欧美剧在线免费观看网站| 国语自产精品视频在线看抢先版结局 | 国产精品专区一| 亚洲国产视频直播| 久久综合狠狠综合久久激情| 亚洲欧美不卡| 国产欧美视频一区二区三区| 亚洲午夜在线观看视频在线| 亚洲欧洲一区二区在线观看| 久久精品国产77777蜜臀| 国产精品欧美一区二区三区奶水| 亚洲视频成人| 亚洲午夜av| 欧美激情国产日韩| 午夜精品久久| 韩日精品视频| 欧美电影在线播放| 久久中文在线| 一区二区av在线| 欧美一级二级三级蜜桃| 亚洲国产91| 午夜精品福利电影| 亚洲国产导航| 欧美亚洲一区| 91久久在线播放| 亚洲尤物精选| 亚洲欧美另类在线| 久久综合久久综合这里只有精品| 亚洲一区二区在| 久久亚洲春色中文字幕| 亚洲永久在线观看| 欧美成人一区二区三区片免费| 亚洲一区二区三区777| 久久精品一区二区| 久久精品91久久香蕉加勒比| 欧美大片在线看| 欧美成人资源网| 国产午夜一区二区三区| 日韩视频免费在线观看| 99精品免费网| 欧美+亚洲+精品+三区| 免费成人av在线| 伊人久久噜噜噜躁狠狠躁| 日韩午夜在线| 亚洲一区在线免费观看| 国产精品一区二区久久久| 亚洲午夜电影网| 欧美一区二区三区四区在线 | 亚洲国产精品女人久久久| 合欧美一区二区三区| 午夜激情亚洲| 免费欧美视频| 亚洲午夜精品一区二区| 国产乱码精品一区二区三区av| 亚洲欧美在线磁力| 亚洲第一精品夜夜躁人人躁| 9久草视频在线视频精品| 欧美三级视频在线| 先锋a资源在线看亚洲| 欧美高清视频一二三区| 亚洲夜晚福利在线观看| 国产亚洲欧美一区在线观看| 美腿丝袜亚洲色图| 亚洲一区二区三区免费在线观看| 久久亚洲精品网站| 99视频在线观看一区三区| 国产日韩欧美在线播放| 欧美精品久久天天躁| 久久精品国产一区二区三区免费看| 欧美激情偷拍| 久久亚洲二区| 亚洲女人av| 91久久精品美女| 18成人免费观看视频| 精品99一区二区| 国产精品久久久久国产精品日日| 欧美二区视频| 欧美性做爰毛片| 国产综合第一页| 91久久在线播放| 99国产精品国产精品久久| 亚洲精品中文字幕在线观看| 激情婷婷欧美| 日韩视频三区| 亚洲欧美日韩国产综合精品二区 | 亚洲高清视频在线观看| 欧美成人免费大片| 亚洲国产欧美不卡在线观看| 国产精品视频久久久| 在线观看欧美一区| 一区二区日本视频| 久久久久久网站| 亚洲最新在线| 久久综合九色综合欧美狠狠| 欧美黄色精品| 一区二区三区在线不卡| 亚洲一区二区久久| 欧美高清不卡| 欧美主播一区二区三区美女 久久精品人 | 黄色日韩网站视频| 一本久道久久综合狠狠爱| 欧美成人免费大片| 久久精品综合一区| 1000部精品久久久久久久久| 久久电影一区| 99热在这里有精品免费| 欧美日韩国产免费| 亚洲一区二区三区午夜| 亚洲免费大片| 在线性视频日韩欧美| 欧美激情网站在线观看| 欧美精品九九99久久| 欧美国产亚洲视频| 牛牛精品成人免费视频| 一二三区精品| 久久国产成人| 久久青草欧美一区二区三区| 欧美视频在线观看一区二区| 久久久国产午夜精品| 亚洲一区二区三区精品视频| 欧美在线观看日本一区| 欧美顶级艳妇交换群宴| 国产在线播放一区二区三区| 久久蜜桃香蕉精品一区二区三区| 亚洲在线视频观看| aaa亚洲精品一二三区| 性欧美18~19sex高清播放| 狠狠久久婷婷| 欧美精品18| 午夜欧美大片免费观看| 欧美激情91| 欧美中文字幕视频| 日韩一级大片在线| 国内不卡一区二区三区| 欧美日韩亚洲高清| 久久人人爽人人| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲日本成人网| 亚洲性视频h| 在线观看亚洲a| 国产精品二区三区四区| 美脚丝袜一区二区三区在线观看| 亚洲少妇最新在线视频| 欧美国产日本| 久久视频精品在线| 亚洲欧美在线免费观看| 亚洲美女中文字幕| 亚洲第一在线视频| 国产欧美一区二区视频| 欧美日韩在线视频一区| 欧美激情按摩| 久久香蕉国产线看观看网| 欧美影院成人| 午夜久久久久|