出处:http://www.phppan.com/2011/09/php-lexical-re2c/ 作者: 胖胖 re2c是一个扫描器制作工具,可以创建非常快速灵活的扫描器。它可以产生高效代码,基于C语言,可以支持C/C代码。 与其它类的扫描器不同,它偏重于为正则表达式产生高效代码(和他的名字一

出处:http://www.phppan.com/2011/09/php-lexical-re2c/

作者:胖胖

re2c是一个扫描器制作工具,可以创建非常快速灵活的扫描器。它可以产生高效代码,基于C语言,可以支持C/C++代码。 与其它类似的扫描器不同,它偏重于为正则表达式产生高效代码(和他的名字一样)。因此,这比传统的词法分析器有更广泛的应用范围。 你可以在sourceforge.net获取源码。

PHP在最开始的词法解析器是使用的是flex,后来PHP的改为使用re2c。 在源码目录下的Zend/zend_language_scanner.l 文件是re2c的规则文件, 如果需要修改该规则文件需要安装re2c才能重新编译。

re2c调用方式:

re2c [-bdefFghisuvVw1] [-o output] [-c [-t header]] file

我们通过一个简单的例子来看下re2c。如下是一个简单的扫描器,它的作用是判断所给的字符串是数字/小写字母/大小字母。 当然,这里没有做一些输入错误判断等异常操作处理。示例如下:

#include

char *scan(char *p){

#define YYCTYPE char

#define YYCURSOR p

#define YYLIMIT p

#define YYMARKER q

#define YYFILL(n)

/*!re2c

[0-9]+ {return "number";}

[a-z]+ {return "lower";}

[A-Z]+ {return "upper";}

[^] {return "unkown";}

*/

}

int main(int argc, char* argv[])

{

printf("%s\n", scan(argv[1]));

return 0;

}

如果你是在ubuntu环境下,可以执行下面的命令生成可执行文件。

re2c -o a.c a.l

gcc a.c -o a

chmod +x a

./a 1000

此时程序会输出number。

我们解释一下我们用到的几个re2c约定的宏。

YYCTYPE 用于保存输入符号的类型,通常为char型和unsigned char型

YYCURSOR 指向当前输入标记, -当开始时,它指向当前标记的第一个字符,当结束时,它指向下一个标记的第一个字符

YYFILL(n) 当生成的代码需要重新加载缓存的标记时,则会调用YYFILL(n)。

YYLIMIT 缓存的最后一个字符,生成的代码会反复比较YYCURSOR和YYLIMIT,以确定是否需要重新填充缓冲区。

参照如上几个标识的说明,可以较清楚的理解生成的a.c文件,当然,re2c不会仅仅只有上面代码所显示的标记, 这只是一个简单示例,更多的标识说明和帮助信息请移步 re2c帮助文档:http://re2c.org/manual.html。

更多编译器相关算法: Compiler Algorithms

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

re2c php,PHP的词法解析器:re2c相关推荐

  1. PHP的词法解析器:re2c

    http://www.phppan.com/2011/09/php-lexical-re2c/ PHP的词法解析器:re2c 胖胖 PHP 2011/09/26 1 条留言 147 views re2 ...

  2. 词法解析器 | 从零实现一门语言

    从这一节开始,进行词法解析器的原理分析和代码实现,我们以C的语法为模板,用C++来进行编译器的代码开发,开发语言任意选择自己熟悉的一种都行. 观察以下代码块,分析其结构. int main(){ in ...

  3. 自己动手实现一个简单的JSON解析器

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...

  4. 手把手教你实现一个 JSON 解析器!

    1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等. 在 ...

  5. MySQL内核源码解读-SQL解析之解析器浅析

    MYSQL服务器接收SQL格式的查询,首先要对sql进行解析,内部将文本格式转换为二进制结构,这个转换就是解析器,解析的目的是为了让优化器更好的处理指令,以便以最优的路径,最少的耗时返回我们想要的结果 ...

  6. mysql ddl 语法解析工具_sharding-sphere之语法解析器

    语法解析器,根据不同类型的语句有不同的语法解析器去解析成成SQLStatement,SQL解析器的类图我用脑图画出来如下: SQLParser.png 可以看到,不同的sql有不同的处理解析器去解析, ...

  7. json string 格式_自己动手实现一个简单的JSON解析器

    作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  8. json解析对应的value为null_徒手撸一个JSON解析器

      Java大联盟 致力于最高效的Java学习 关注 作者 | 田小波 cnblogs.com/nullllun/p/8358146.html1.背景JSON(JavaScript Object No ...

  9. 手写了一个简单的JSON解析器,网友直乎:牛!

    作者 | 田小波 来源 | http://r3m2u.cn/4455O 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 X ...

最新文章

  1. 200多位专家热议“智慧城市” 建议尽快完善标准体系
  2. 将Jquery序列化后的表单值转换成Json
  3. 150929.js过完
  4. python从txt拿取数据_python requests + xpath 获取分页详情页数据存入到txt文件中
  5. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步...
  6. uml分析考勤系统设计
  7. python计算无穷级数求和常用公式_幂级数n=0到∞∑ x^n/的和函数怎么求 级数求和问题:求:∑1/...
  8. 【云原生】—— 学习云计算应用开发你需要掌握的五大技能
  9. Android自定义按钮样式
  10. 第1章第17节:如何使用备注功能对内容进行注释补充 [PowerPoint精美幻灯片实战教程]
  11. 手机风波(二)の惊喜篇
  12. 【转】完美解决iphone连电脑蓝牙出现bluetooth外围设备无法正确安装
  13. [转] JS实例操作QQ空间自动点赞方法
  14. 西乔说要把「神秘的程序员们」当做一个文化产品来做
  15. Android Studio NKD开发之 FFmpeg库的引入--简单播放器(主要验证是否正确引入ffmpeg库)
  16. 图像处理-005模糊
  17. 数据库对象名无效 解决方法总结
  18. 【直播回顾】Hello HarmonyOS应用篇第六课——短视频应用开发
  19. FPGA:基础入门按键控制蜂鸣器
  20. codewars练习记录3 (javascript)

热门文章

  1. 她说要介绍10000个开源项目?来!我们一起监督!
  2. 不想 CRUD 干到老,就来看看这篇 OOM 排查的实战案例!
  3. 面试:字符串拼接,什么时候用StringBuilder?
  4. 超级干货:关于数据中台的深度思考与总结
  5. JDK8特性--Stream(求和,过滤,排序)
  6. sql中join的各种用法
  7. 微信小程序tabBar不显示的问题描述解决
  8. 中山大学提出SimAM:无参Attention!助力分类/检测/分割涨点!
  9. PyTorch中AdaptiveAvgPool函数总结
  10. Linux下给挂载U盘或者SD卡