re2c使用小结(1)
来源:互联网 发布:淘宝店铺的名称 编辑:程序博客网 时间:2024/06/10 03:49
re2c是一个根据正则表达式子,生成对应c代码的程序,类似于lex。
使用的时候,他的功能比python的正则表达式功能要弱一点,一次只能解析一个定义的符号,而且对于解析 .* 这样的表达式会产生越界错误。
使用时要非常小心。初步总结如下。
#include <stdio.h>#include <stdlib.h>/* * 定义符号 */enum{ T_UNKNOWN = -1, T_DVB, T_NUMBER, T_DOT,};/* * 扫描 * 使用re2c:yyfill:enable = 0; 关闭越界检查功能,代码可以精简 */int scan(char *buf, int *length){#define YYCTYPE char YYCTYPE * YYCURSOR = buf; YYCTYPE * YYSTART = buf; YYCTYPE * YYMARKER = NULL; unsigned int ret = 0; if(YYCURSOR==NULL) { return T_UNKNOWN; } else {/*!re2cre2c:yyfill:enable = 0; "dvb://" { *length = YYCURSOR - YYSTART; return T_DVB; } [0-9a-fA-F]+ { *length = YYCURSOR - YYSTART; return T_NUMBER; } [.] { *length = YYCURSOR - YYSTART; return T_DOT; } [^] { return T_UNKNOWN; }*/ }}static char buf[] = "dvb://888.12.12a";int yylex(){ int token = 0; char *tmp = buf; char *start; int length; token = scan(tmp, &length); while(token!=T_UNKNOWN) { 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;}
re2c -is dvb.re > dvb.out.c或者re2c -i dvb.re > dvb.out.c加上-s 系统会Generate nested ifs for some switches.
运行结果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:12a
0 0
- re2c使用小结(1)
- re2c使用小结(2)
- re2c使用小结(3)
- 使用小结(1)
- re2c安装
- SecureCRT使用小结(1)
- Latex使用小结(1)
- c#.NET使用小结(1)
- c#.NET使用小结(1)
- Lucene2.9.1使用小结 (注释1)
- SQLite使用小结1
- SQLite使用小结 1
- Git使用小结(1)
- 使用小结(2)
- 使用小结(3)
- re2c编译选项的说明
- MD5 ,SHA-1使用小结
- ListView使用技巧小结(1)
- glusterfs分析-系列一:glusterfs整体分析
- 读取项目中classpath下的路径以及一些扩展
- 关于jsp在火狐浏览器中实现视频预览的思考
- 总拙最踪着缀
- notepad++如何修改字体?
- re2c使用小结(1)
- 关于海量数据处理的各种常用数据结构浅谈
- LeetCode Two Sum
- 妆作渍组专尊
- opencv 2 cookbook
- 新做了几个网站,都是关于“美缝剂”的,欢迎交流~~
- Oracle Sql语句长度限制问题及解决
- java基础——多线程(传统定时器)
- Server_本地IIS发布网站后如何输入网址访问网站;