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

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
是一個可以根據用戶定義的正則表達式或是由正則表達式生成的狀態圖來生成健壯的,無依賴的可執行代碼,包括CC++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| 亚洲免费一在线| 国产精品高清网站| 亚洲一区二区三区免费视频| 91久久精品国产91久久性色tv| 欧美在线电影| 国内外成人免费视频| 久久久噜噜噜久噜久久| 欧美一区二区三区在线视频| 国产欧美日韩视频在线观看 | 欧美日本一区二区三区| 亚洲国内自拍| 亚洲激情欧美激情| 欧美成人一区二区| 日韩视频免费观看高清完整版| 亚洲国产精品视频| 欧美美女福利视频| 亚洲影视九九影院在线观看| 亚洲视频久久| 国产视频亚洲| 免费观看久久久4p| 欧美成人午夜视频| 亚洲一区二区三区免费观看| 亚洲一区二区三区四区视频 | 欧美成人精品福利| 免费的成人av| 99精品国产一区二区青青牛奶| 亚洲精品国产日韩| 欧美午夜宅男影院在线观看| 欧美与黑人午夜性猛交久久久| 欧美在线国产精品| 亚洲精品视频一区| 亚洲一区高清| 亚洲国产成人av好男人在线观看| 亚洲高清免费在线| 国产精品九九久久久久久久| 久久精品理论片| 欧美成人免费网站| 性高湖久久久久久久久| 久久成人一区| 一本色道久久综合精品竹菊 | 亚洲一级二级| 欧美亚洲一区| 亚洲美女黄网| 亚洲一区二区在线免费观看视频 | 亚洲国产一区二区视频| 欧美视频在线观看一区| 美女国产一区| 在线亚洲自拍| 激情综合久久| 亚洲一本视频| 亚洲动漫精品| 欧美亚洲免费电影| 一本久道久久综合婷婷鲸鱼| 欧美在线影院| 亚洲女同精品视频| 欧美喷水视频| 久久夜色精品国产亚洲aⅴ| 欧美日韩中文字幕在线视频| 欧美成人免费一级人片100| 国产精品爽爽爽| 日韩亚洲欧美综合| 亚洲欧洲精品一区二区精品久久久| 亚洲欧美一区二区视频| 亚洲视频免费| 欧美电影在线播放| 另类尿喷潮videofree| 国产精品免费一区二区三区观看| 欧美大尺度在线观看| 国产一区二区三区免费在线观看| 亚洲伦理一区| 日韩视频一区二区三区在线播放免费观看 | 巨乳诱惑日韩免费av| 欧美一区二区三区四区在线观看地址| 欧美国产乱视频| 欧美国产综合视频| 136国产福利精品导航网址| 欧美亚洲尤物久久| 欧美一区视频在线| 国产精品香蕉在线观看| 一区二区三区精品视频在线观看| 亚洲精一区二区三区| 欧美va亚洲va国产综合| 免费亚洲网站| 亚洲国产老妈| 欧美1区2区视频| 欧美电影免费观看| 91久久久一线二线三线品牌| 裸体素人女欧美日韩| 欧美激情视频在线播放| 亚洲精选91| 欧美日韩在线播放一区| 一区二区三区免费在线观看| 亚洲一区二区三区四区五区黄| 欧美日韩色综合| 中文欧美字幕免费| 宅男精品视频| 国产精品久久久久7777婷婷| 亚洲午夜视频在线观看| 香蕉久久国产| 国产一区二区三区成人欧美日韩在线观看| 亚洲欧美国产毛片在线| 欧美中文日韩| 激情丁香综合| 欧美成人69av| 一区二区免费看| 久久精品亚洲一区二区| 在线精品国产成人综合| 欧美激情91| 亚洲一区bb| 久久久精品午夜少妇| 欧美激情国产精品| 一区二区三区四区五区精品| 欧美一区日韩一区| 影音先锋亚洲一区| 欧美日本一区| 欧美一区二区视频97| 欧美bbbxxxxx| 一区二区三区高清在线| 国产精品久久久久国产a级| 性欧美1819性猛交| 亚洲国产精品一区| 欧美自拍偷拍午夜视频| 91久久精品www人人做人人爽| 欧美日韩亚洲网| 亚洲欧美成人在线| 欧美激情亚洲激情| 羞羞视频在线观看欧美| 亚洲国内欧美| 国产日韩在线看| 欧美精品在线免费观看| 校园激情久久| 亚洲毛片在线| 母乳一区在线观看| 亚洲欧美三级在线| 亚洲激情自拍| 国产精品永久在线| 欧美精选一区| 久久午夜av| 亚洲欧美网站| 亚洲免费高清| 欧美激情精品久久久久| 欧美一区二区黄色| 在线视频你懂得一区| 亚洲国产欧美精品| 国产午夜精品全部视频在线播放| 欧美精品情趣视频| 久久久噜噜噜久久中文字幕色伊伊| 夜夜爽www精品| 亚洲乱码国产乱码精品精天堂 | 久久色在线播放| 亚洲在线不卡| 一本大道久久a久久精品综合 | 美女精品在线| 久久精品国产精品| 亚洲免费在线电影| 99视频精品在线| 亚洲激情在线观看| 狂野欧美激情性xxxx| 欧美亚洲在线观看| 亚洲男女毛片无遮挡| 中日韩午夜理伦电影免费| 亚洲精品日本| 亚洲精品日韩欧美| 91久久精品国产91性色tv| 伊人久久亚洲热| 激情欧美日韩| 狠狠色综合网| 极品少妇一区二区三区精品视频 | 久热精品视频在线观看一区| 久久精品国产69国产精品亚洲| 亚洲综合色丁香婷婷六月图片| 99精品久久久| 夜夜嗨av色综合久久久综合网| 91久久精品美女高潮| 亚洲精品婷婷| 一区二区91| 亚洲制服丝袜在线| 欧美亚洲免费电影| 久久经典综合| 麻豆国产va免费精品高清在线| 久久久久久久999精品视频| 久久久噜噜噜久久人人看| 久久综合久久久| 欧美大片18| 亚洲午夜三级在线| 亚洲一区久久久| 午夜精品福利视频| 久久精品国产清高在天天线| 久久精品国产免费看久久精品| 久久久99国产精品免费| 免费一区二区三区| 亚洲日本国产| 亚洲免费影视| 久久久久久久97| 欧美福利一区二区三区|