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

woaidongmao

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

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

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


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

好閑言少敘,言歸正傳

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ī)代碼段的開(kāi)始
  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ì)再接下來(lái)的內(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)用于解析器中。它們通常被用來(lái)作為黑盒與程序邏輯聯(lián)系在一起。對(duì)正則表達(dá)式引擎在執(zhí)行某些解析工作之后,調(diào)用用戶(hù)自定義行為。加入新的自定義行為,需要重新定義原來(lái)的格局,然后粘貼到程序邏輯中。自定義行為越多,正規(guī)表達(dá)式的優(yōu)勢(shì)越小。

Ragel
是一個(gè)可以根據(jù)用戶(hù)定義的正則表達(dá)式或是由正則表達(dá)式生成的狀態(tài)圖來(lái)生成健壯的,無(wú)依賴(là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)鍵字編寫(xiě).rl文件

1
        編寫(xiě).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ù)聲明,用于在用戶(hù)自定義行為中調(diào)用,用到了參數(shù)的傳遞,此函數(shù)也可以是類(lèi)成員函數(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)鍵字,用于說(shuō)明當(dāng)明狀態(tài),以整型值標(biāo)識(shí)(current status的縮寫(xiě))
                //
狀態(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;
}


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

CODE:

ragel -o test.cpp test.rl


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

CODE:

rlcodegen -o hello.cpp test.cpp


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


 

 

posted on 2008-12-24 15:18 肥仔 閱讀(3187) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): 狀態(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>
            妖精视频成人观看www| 欧美亚男人的天堂| 亚洲精品国产精品乱码不99 | 久久精品亚洲国产奇米99| 午夜视频精品| 国产精品入口66mio| 亚洲三级观看| 亚洲一区美女视频在线观看免费| 亚洲精品资源| 亚洲欧美在线磁力| 久久青草欧美一区二区三区| 免费观看国产成人| 在线亚洲欧美视频| 久久天天躁狠狠躁夜夜av| 欧美伦理一区二区| 国产一区日韩欧美| 这里只有精品电影| 久久综合电影| 一区二区三区高清| 久久久噜噜噜久久人人看| 欧美日韩国产综合网| 国产夜色精品一区二区av| 亚洲精品网址在线观看| 欧美一区=区| 亚洲国产精品一区二区第一页| 中文高清一区| 欧美国产精品人人做人人爱| 国产伦理精品不卡| 亚洲作爱视频| 亚洲电影在线免费观看| 欧美专区18| 国产精品白丝av嫩草影院| 一区在线播放视频| 欧美在线视频免费播放| 亚洲精选大片| 美女尤物久久精品| 国内成+人亚洲+欧美+综合在线| 99精品国产热久久91蜜凸| 美国成人毛片| 欧美一区二区视频在线观看2020| 欧美日韩精品欧美日韩精品| 亚洲国产aⅴ天堂久久| 久久九九免费| 小辣椒精品导航| 国产精品视频区| 亚洲视频图片小说| 亚洲国产日韩欧美在线动漫| 久久久久久九九九九| 国产婷婷成人久久av免费高清| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲另类春色国产| 欧美不卡视频一区发布| 亚洲国产99精品国自产| 久久综合给合久久狠狠狠97色69| 午夜在线视频一区二区区别| 国产精品久久久久久久久久ktv| 最新国产乱人伦偷精品免费网站 | 亚洲欧美精品suv| 亚洲精品美女久久7777777| 欧美jjzz| 99精品视频一区二区三区| 欧美激情精品久久久久久免费印度| 久久精品国产综合| 亚洲成色777777女色窝| 欧美电影在线观看完整版| 久久综合免费视频影院| 亚洲青色在线| 亚洲看片一区| 国产精品一区二区久久久久| 欧美在线亚洲在线| 久久久久88色偷偷免费| 亚洲国产清纯| 日韩亚洲综合在线| 国产精品在线看| 另类天堂av| 欧美精品成人91久久久久久久| 一本到12不卡视频在线dvd| 一本久久a久久精品亚洲| 国产日韩欧美精品| 欧美福利视频在线观看| 欧美日韩精品欧美日韩精品一 | 欧美精品一区在线发布| 中文一区字幕| 性感少妇一区| 亚洲日本成人网| 在线综合亚洲| 在线色欧美三级视频| 亚洲三级电影全部在线观看高清| 欧美性猛交视频| 久久综合色综合88| 欧美日韩在线另类| 久久久免费av| 欧美日韩国产二区| 久久人人爽人人爽| 欧美三级电影一区| 欧美ed2k| 国产精品社区| 亚洲黄页视频免费观看| 国产噜噜噜噜噜久久久久久久久| 免费短视频成人日韩| 欧美日韩免费观看一区三区| 久久一区中文字幕| 国产精品久久久久一区| 亚洲成人在线视频播放 | 噜噜噜噜噜久久久久久91| 亚洲香蕉网站| 久久青草久久| 欧美一区二区女人| 欧美日本在线| 麻豆成人在线播放| 欧美一区二区视频在线| 男女激情视频一区| 久久精品国产久精国产爱| 欧美日韩成人在线播放| 欧美激情1区2区| 激情久久婷婷| 欧美影院在线| 欧美在线在线| 国产精品久久久久高潮| 亚洲伦理在线| 亚洲精品久久久久久一区二区| 久久岛国电影| 久久久91精品| 国产人成一区二区三区影院| 亚洲天堂成人在线视频| 一本色道久久综合狠狠躁篇怎么玩| 久久婷婷人人澡人人喊人人爽| 久久精品主播| 国产亚洲欧美另类一区二区三区| 一本色道久久99精品综合| 亚洲少妇自拍| 国产精品成人久久久久| 一本一本久久a久久精品牛牛影视| 亚洲精选大片| 欧美连裤袜在线视频| 亚洲日本aⅴ片在线观看香蕉| 亚洲人成人99网站| 欧美福利一区二区| 亚洲精品一区二区三区婷婷月| 亚洲三级影院| 欧美裸体一区二区三区| 日韩午夜中文字幕| 亚洲欧美日韩一区在线观看| 国产精品毛片a∨一区二区三区| 亚洲视频欧美视频| 久久国产视频网站| 在线成人www免费观看视频| 久久久综合网| 亚洲国产欧美一区二区三区同亚洲 | 久久久久中文| 欧美黄色aaaa| 一本一本久久a久久精品综合妖精| 欧美精品成人91久久久久久久| 亚洲老司机av| 久久九九精品99国产精品| 在线观看日韩av电影| 欧美激情网友自拍| 亚洲欧美国产高清| 美女啪啪无遮挡免费久久网站| 亚洲国产一区二区三区在线播 | 欧美日韩一区二区视频在线| 亚洲一区欧美二区| 久久最新视频| 一区二区三区日韩精品| 国产视频在线观看一区| 免费影视亚洲| 亚洲专区欧美专区| 欧美福利视频| 欧美在线看片a免费观看| 亚洲国产毛片完整版| 国产精品久久久久天堂| 久久一区中文字幕| 中日韩在线视频| 亚洲国产一区二区三区在线播| 午夜精品福利电影| 欧美不卡高清| 欧美一区二区免费观在线| 亚洲国产人成综合网站| 国产精品免费电影| 欧美不卡视频一区| 欧美一区永久视频免费观看| 亚洲高清精品中出| 久久免费黄色| 亚洲欧美日韩系列| 亚洲免费电影在线观看| 国产亚洲一区二区三区在线观看 | 一区二区三区自拍| 国产精品成人观看视频免费| 六十路精品视频| 欧美影院在线播放| 亚洲视频网站在线观看| 亚洲国产日韩欧美在线图片| 久久久一二三| 欧美一级一区| 亚洲欧美日韩视频二区| 中日韩高清电影网| 亚洲最黄网站| 日韩图片一区| 亚洲美女诱惑| 亚洲精品一区二区三区不|