re2c使用小结(2)

来源:互联网 发布:linux源码目录 编辑:程序博客网 时间:2024/05/19 05:03

第一次写的re2c代码对于处理某些字符串还是不够智能,不能确保把字符串一次性解析完成。

下面这个写法用到了condition,确保在正确的状态下把整个字符串解析正确,即使不正确状态也会把字符解析出来。


#include <stdio.h>#include <stdlib.h>/* * 定义符号 */enum{    T_EOL = -1,    T_DVB,    T_NUMBER,    T_DOT,    T_UNKNOWN,};/*!types:re2c *//* * 扫描 */enum ScanContition cond = 0;int scan(char *buf, int *length){#define YYCTYPE char    YYCTYPE * YYCURSOR = buf;    YYCTYPE * YYSTART = buf;    YYCTYPE * YYMARKER = NULL;    YYCTYPE * YYCTXMARKER = NULL;    unsigned int ret = 0;    if(YYCURSOR==NULL)    {        return T_EOL;    } else {/*!re2cre2c:yyfill:enable = 0;re2c:condenumprefix              = EState;re2c:define:YYCONDTYPE           = ScanContition;re2c:define:YYSETCONDITION       = "cond = #;";re2c:define:YYSETCONDITION@cond  = #;re2c:define:YYGETCONDITION       = cond;re2c:define:YYGETCONDITION:naked = 1;<> :=> DVB<DVB> "dvb://" => NUM {        *length = YYCURSOR - YYSTART;         return T_DVB;    }<NUM> [0-9a-fA-F]+ => DOT {         *length = YYCURSOR - YYSTART;         return T_NUMBER;    }<DOT> [.] => NUM {         *length = YYCURSOR - YYSTART;         return T_DOT;    }<*> [^\x00] {        *length = YYCURSOR - YYSTART;        return T_UNKNOWN;    }<*> [\x00] {        return T_EOL;        }*/    }}static char buf[] = "dvd:/dvb://888.12.12a/adf";int yylex(){    int token = 0;    char *tmp = buf;    char *start;    int length;    token = scan(tmp, &length);    while(token!=T_EOL) {        printf("token:%d,len:%u,str:%.*s\n",token,length,length,tmp);        tmp = tmp+length;        length = 0;        token = scan(tmp, &length);    }    return 0;}int main (int argc,char ** argv){        yylex();        return 0;}

编译的时候加入-c,表示支持condition逻辑。re2c -ics dvb02.re >dvb02.out.c

运行结果:可以看到由于condtion的影响,程序在不是正确状态时,会自动使用默认动作。token:3,len:1,str:dtoken:3,len:1,str:vtoken:3,len:1,str:dtoken:3,len:1,str::token:3,len:1,str:/token:0,len:6,str:dvb://token:1,len:3,str:888token:2,len:1,str:.token:1,len:2,str:12token:2,len:1,str:.token:1,len:3,str:12atoken:3,len:1,str:/token:3,len:1,str:atoken:3,len:1,str:dtoken:3,len:1,str:f



0 0
原创粉丝点击