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
- re2c使用小结(2)
- re2c使用小结(1)
- re2c使用小结(3)
- 使用小结(2)
- re2c安装
- Latex使用小结(2)
- sqlite使用小结2
- SQLite使用小结 2
- CxGrid使用小结(2)
- OPENAM使用小结2
- Git使用小结(2)
- 使用小结(1)
- 使用小结(3)
- re2c编译选项的说明
- DBGrideh使用小结(一)
- sqlldr使用小结(zt)
- DB2 使用小结(一)
- DB2 使用小结(二)
- JavaScript 正在表达式对象
- Mt6732 关机时候闪光灯会闪一下
- Adapter(适配器模式)
- vs2010 fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 如何免费在github上托管私有项目?——使用价值¥40的学生优惠
- re2c使用小结(2)
- top 200并发 tomcat 16核 压测
- ubuntu 编译并安装resin3.1.12+nginx1.2.6
- window用ftp上传文件到linux
- Can't load standard profile
- JAVA的文件操作【转】
- js动态加载脚本
- SDUT2040 快排与二分查找
- Codeforces Round #263