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

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
數(shù)據(jù)加載中……

Ragel 狀態(tài)機(jī)簡(jiǎn)介

從今天開始我把我前一段時(shí)間用到的狀態(tài)機(jī)工具Ragel的使用方法做一些總結(jié),希望大家斧正!


(
如果大家對(duì)狀態(tài)機(jī)概念有模糊的話,請(qǐng)參考<<編譯原理>>一書,基本上有詳盡的介紹)

好閑言少敘,言歸正傳

Ragel
可以從正規(guī)表達(dá)式生成可執(zhí)行有限狀態(tài)機(jī),它可以生成C,C++,Object-C,D,JavaRuby可執(zhí)行代碼

官方網(wǎng)站:http://www.cs.queensu.ca/home/thurston/ragel/

第一回

Ragel
是一個(gè)可以生成協(xié)議處理代碼的工具. 

先舉個(gè)例子,簡(jiǎn)簡(jiǎn)單單的幾行代碼,實(shí)現(xiàn)的功能為將一個(gè)數(shù)字字符串轉(zhuǎn)換成整數(shù):

[Copy to clipboard] [ - ]

CODE:

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

%%{       //Ragel
的關(guān)鍵字,用于聲明狀態(tài)機(jī)代碼段的開始
  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;                                  //
狀態(tài)機(jī)關(guān)鍵字,這個(gè)會(huì)再接下來的內(nèi)容中介紹
  write exec noend;                     //
同上
}%%                                        //
狀態(tài)機(jī)代碼段結(jié)束標(biāo)記

if ( neg )
  val = -1 * val;

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

return val;
};


c里面那500多行實(shí)現(xiàn)的atoi函數(shù)更加高效

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

[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;
};


對(duì)應(yīng)的狀態(tài)圖如下圖所示:

clip_image001

 

正則表達(dá)式廣泛應(yīng)用于解析器中。它們通常被用來作為黑盒與程序邏輯聯(lián)系在一起。對(duì)正則表達(dá)式引擎在執(zhí)行某些解析工作之后,調(diào)用用戶自定義行為。加入新的自定義行為,需要重新定義原來的格局,然后粘貼到程序邏輯中。自定義行為越多,正規(guī)表達(dá)式的優(yōu)勢(shì)越小。

Ragel
是一個(gè)可以根據(jù)用戶定義的正則表達(dá)式或是由正則表達(dá)式生成的狀態(tài)圖來生成健壯的,無依賴的可執(zhí)行代碼,包括CC++Object-C, Java, Ruby 等等. 可以靈活控制已經(jīng)生成狀態(tài)機(jī)的變動(dòng),利用已經(jīng)嵌入自定義行為的模式重構(gòu)掃描器

Ragel
基于任何正規(guī)語(yǔ)言能被轉(zhuǎn)化為有限狀態(tài)自動(dòng)機(jī)的原理

基本的使用步驟如下:

首先,根據(jù)你的業(yè)務(wù)流程邏輯與需要,按照ragel提供的語(yǔ)法與關(guān)鍵字編寫.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>

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

//
另外一個(gè)函數(shù),功能同上,只是參數(shù)傳遞用的是引用傳遞
void printdiv(char *p)
{
  printf("%s\n",(*p));
}
//
主處理函數(shù)
void par_str( char *str,int len )
{
        char *p = str, *pe = str + strlen( str );
        int cs;        //
狀態(tài)機(jī)關(guān)鍵字,用于說明當(dāng)明狀態(tài),以整型值標(biāo)識(shí)(current status的縮寫)
                //
狀態(tài)機(jī)自定義行為塊
        %%{
                        #
調(diào)用自定義函數(shù)
                        action see_table {
                                 printtable(len);
                }
               #invoke prindiv function to show the table information, as same as above
               action see_div {
                                  printdiv(p);
               }
               #
正則表達(dá)式聲明,用于在狀態(tài)機(jī)初始化時(shí),按照此規(guī)則匹配目標(biāo)
               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
//
主函數(shù),用于測(cè)試生成的狀態(tài)機(jī)
int main()
{
        char buf[BUFSIZE];
        while ( fgets( buf, sizeof(buf), stdin ) != 0 )
{
par_str(buf,10);
}
                return 0;
}


接下來,ragel命令生成目的語(yǔ)言文件

CODE:

ragel -o test.cpp test.rl


用代碼生成工具,直接生成可執(zhí)行代碼

CODE:

rlcodegen -o hello.cpp test.cpp


最后編寫對(duì)此代碼的Makefile,make........


 

 

posted on 2008-12-24 15:18 肥仔 閱讀(3192) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 狀態(tài)機(jī) & 自動(dòng)機(jī) & 形式語(yǔ)言

評(píng)論

# re: Ragel 狀態(tài)機(jī)簡(jiǎn)介  回復(fù)  更多評(píng)論   

強(qiáng)
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>
            激情视频一区| 亚洲私拍自拍| 久久精品麻豆| 久久亚洲电影| 免费日本视频一区| 亚洲国产老妈| 亚洲二区视频| 一本久久知道综合久久| 亚洲新中文字幕| 久久成人久久爱| 欧美**人妖| 国产精品美女久久久免费| 国产性色一区二区| 亚洲精品一区二区网址| 欧美亚洲日本网站| 欧美黄色小视频| 亚洲一区免费在线观看| 麻豆成人在线观看| 国产精品免费小视频| 在线观看不卡| 欧美亚洲日本网站| 亚洲国产日本| 久久不见久久见免费视频1| 欧美区国产区| 精品成人在线观看| 亚洲综合日韩在线| 亚洲国产精品999| 新片速递亚洲合集欧美合集 | 久久高清免费观看| 欧美激情一区二区三区不卡| 国产精品中文在线| 亚洲美女av黄| 国产日韩在线亚洲字幕中文| 亚洲欧美日韩国产| 久久久久久久国产| 一区二区三区|亚洲午夜| 久久精品一区中文字幕| 国产精品免费一区豆花| 亚洲欧洲日韩女同| 久久综合激情| 欧美一级淫片播放口| 欧美日韩亚洲视频一区| 一区视频在线| 噜噜噜91成人网| 欧美在线亚洲在线| 国产精品一区二区久久精品| 亚洲一区二区精品| 99视频超级精品| 欧美另类人妖| 一区二区三区日韩精品视频| 欧美激情亚洲激情| 麻豆精品91| 亚洲国产精品美女| 欧美xxx成人| 久久中文字幕一区二区三区| 激情久久影院| 欧美成人午夜剧场免费观看| 久久久亚洲成人| 亚洲黄页一区| 亚洲精品中文字幕女同| 欧美日韩日日骚| 亚洲欧美国产三级| 亚洲永久精品国产| 国产日韩一区二区| 久久综合国产精品| 欧美粗暴jizz性欧美20| 99视频在线观看一区三区| 亚洲精品影视在线观看| 欧美三级电影网| 亚洲欧美日韩国产成人| 亚洲欧美一级二级三级| 国产亚洲欧美中文| 老巨人导航500精品| 久热国产精品视频| 亚洲精选中文字幕| 在线亚洲激情| 国产综合香蕉五月婷在线| 久久亚洲图片| 欧美成人中文字幕| 亚洲欧美日韩一区在线观看| 午夜精品一区二区三区在线视| 国内揄拍国内精品久久| 亚洲国产日韩欧美在线99 | 久久人人爽人人爽爽久久| 在线日本欧美| 亚洲老司机av| 国产视频一区在线观看一区免费| 狂野欧美激情性xxxx| 欧美黄色网络| 欧美一区在线视频| 免费成人av| 欧美一区二区三区婷婷月色 | 日韩一区二区精品葵司在线| 欧美激情一区二区三区在线| 欧美另类69精品久久久久9999| 亚洲永久免费| 久久久999成人| aa亚洲婷婷| 欧美伊人影院| 日韩视频一区二区在线观看 | 香蕉久久久久久久av网站| 精品成人在线| 亚洲亚洲精品三区日韩精品在线视频| 国产亚洲精品一区二555| 亚洲国产精品高清久久久| 国产精品一区二区欧美| 亚洲国产精品视频| 国产欧美一区视频| 亚洲精品视频啊美女在线直播| 国内精品一区二区| 亚洲一区二区三区免费观看| 亚洲伦伦在线| 另类成人小视频在线| 久久精品国产亚洲精品| 国产精品v日韩精品| 亚洲福利视频在线| 国产欧美一区二区三区久久 | 欧美激情一区三区| 另类天堂av| 国产日韩欧美一区二区| 日韩天堂在线视频| 亚洲精品色婷婷福利天堂| 欧美一区二区三区在| 性欧美办公室18xxxxhd| 国产精品久久久久久久久久妞妞| 亚洲精品网址在线观看| 亚洲精品网站在线播放gif| 久久久99免费视频| 久久先锋影音| 在线观看成人av| 久久人人97超碰人人澡爱香蕉| 久久久久久久久蜜桃| 国产亚洲精品一区二区| 在线一区亚洲| 亚洲欧美视频| 国产伦精品一区二区三区视频黑人 | 午夜激情亚洲| 国产精品高清网站| 亚洲午夜精品在线| 销魂美女一区二区三区视频在线| 欧美中文在线免费| 一区二区久久久久久| 99精品久久免费看蜜臀剧情介绍| 免费亚洲电影在线观看| 欧美激情精品久久久久久| 亚洲国产高清自拍| 美女主播精品视频一二三四| 欧美激情视频一区二区三区免费| 最近中文字幕日韩精品| 欧美成人综合一区| 亚洲美女在线看| 午夜久久资源| 狠狠色狠狠色综合日日91app| 久久久国产精品一区| 欧美激情精品久久久久久久变态 | 久久久夜夜夜| 亚洲大胆女人| 亚洲图片在线观看| 国产欧美精品一区二区三区介绍| 午夜一区二区三视频在线观看| 久久久久综合一区二区三区| 韩国视频理论视频久久| 可以看av的网站久久看| 99人久久精品视频最新地址| 欧美一区免费视频| 尤物99国产成人精品视频| 欧美高清在线精品一区| 正在播放亚洲| 免费观看在线综合色| 亚洲午夜电影在线观看| 国产真实久久| 欧美日韩一区二区三区在线| 性做久久久久久久久| 亚洲国产精品久久久久秋霞影院| 亚洲综合丁香| 亚洲人成人99网站| 国产欧美一区二区三区国产幕精品| 免费人成精品欧美精品| 亚洲一区激情| 亚洲欧洲精品一区| 久久精品国产亚洲aⅴ| 一本大道av伊人久久综合| 国内精品久久久| 国产精品video| 欧美福利一区二区| 欧美在线观看一二区| 妖精视频成人观看www| 欧美成人免费全部| 欧美综合77777色婷婷| 一区二区三区蜜桃网| 亚洲国产精品一区| 国产一区免费视频| 国产精品伦子伦免费视频| 欧美激情精品久久久久久免费印度| 欧美一区高清| 午夜日韩av| 亚洲欧美日韩视频二区| 中文在线不卡视频| 亚洲最新视频在线播放| 亚洲精品视频免费|