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

PHP的词法解析器:re2c

胖胖 PHP 2011/09/26 1 条留言 147 views

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。如下是一个简单的扫描器,它的作用是判断所给的字符串是数字/小写字母/大小字母。 当然,这里没有做一些输入错误判断等异常操作处理。示例如下:

<span style="color: rgb(189, 72, 179); font-style: italic;">#include <stdio.h></span><br /><br /><span style="color: rgb(18, 153, 218);">char</span> <span style="color: rgb(224, 136, 47);">*</span>scan<span style="color: rgb(255, 255, 255);">(</span><span style="color: rgb(18, 153, 218);">char</span> <span style="color: rgb(224, 136, 47);">*</span>p<span style="color: rgb(255, 255, 255);">)</span><span style="color: rgb(255, 255, 255);">{</span><br /><span style="color: rgb(189, 72, 179); font-style: italic;">#define YYCTYPE char</span><br /><span style="color: rgb(189, 72, 179); font-style: italic;">#define YYCURSOR p</span><br /><span style="color: rgb(189, 72, 179); font-style: italic;">#define YYLIMIT p</span><br /><span style="color: rgb(189, 72, 179); font-style: italic;">#define YYMARKER q</span><br /><span style="color: rgb(189, 72, 179); font-style: italic;">#define YYFILL(n)</span><br />    <span style="color: rgb(189, 72, 179); font-style: italic;">/*!re2c<br />      [0-9]+ {return "number";}<br />      [a-z]+ {return "lower";}<br />      [A-Z]+ {return "upper";}<br />      [^] {return "unkown";}<br />     */</span><br /><span style="color: rgb(255, 255, 255);">}</span><br /><br /><span style="color: rgb(18, 153, 218);">int</span> main<span style="color: rgb(255, 255, 255);">(</span><span style="color: rgb(18, 153, 218);">int</span> argc<span style="color: rgb(224, 136, 47);">,</span> <span style="color: rgb(18, 153, 218);">char</span><span style="color: rgb(224, 136, 47);">*</span> argv<span style="color: rgb(255, 255, 255);">[</span><span style="color: rgb(255, 255, 255);">]</span><span style="color: rgb(255, 255, 255);">)</span><br /><span style="color: rgb(255, 255, 255);">{</span><br />    <a style="color: rgb(18, 153, 218); text-decoration: none;" href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: rgb(226, 57, 45);">printf</span></a><span style="color: rgb(255, 255, 255);">(</span><span style="color: rgb(153, 255, 0);">"%s<span>\n</span>"</span><span style="color: rgb(224, 136, 47);">,</span> scan<span style="color: rgb(255, 255, 255);">(</span>argv<span style="color: rgb(255, 255, 255);">[</span><span style="color: rgb(18, 153, 218);">1</span><span style="color: rgb(255, 255, 255);">]</span><span style="color: rgb(255, 255, 255);">)</span><span style="color: rgb(255, 255, 255);">)</span><span style="color: rgb(224, 136, 47);">;</span><br /><br />    <span style="color: rgb(255, 132, 0);">return</span> <span style="color: rgb(18, 153, 218);">0</span><span style="color: rgb(224, 136, 47);">;</span><br /><span style="color: rgb(255, 255, 255);">}</span>

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

re2c -o a.c a.l<br />gcc a.c -o a<br />chmod +x a<br />./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设计模式,PHP学习笔记,项目管理-胖胖的空间

转载请以链接形式注明原始出处和作者,谢绝不尊重版权者抄袭!

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

  1. re2c php,PHP的词法解析器:re2c

    出处:http://www.phppan.com/2011/09/php-lexical-re2c/ 作者: 胖胖 re2c是一个扫描器制作工具,可以创建非常快速灵活的扫描器.它可以产生高效代码,基于 ...

  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. 5个相见恨晚的神器网站
  2. 使用 Newtonsoft.Json; 序列化正常,反序列化异常的一点思考
  3. debian安装搜狗
  4. 零基础学习 Python 之文件
  5. kohana3 数据库模块配置
  6. php上传商品信息并显示,第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)...
  7. 【BCS2021】软件供应链完整演讲回看
  8. 大规模数据生成 (500万条数据)
  9. php 替换alt,PHP 实现自动添加或者替换 内容的IMG标签的 alt title 属性
  10. Windows Azure AppFabric应用程序
  11. Spss-kmeans聚类分析操作
  12. 基于websocket的跨平台通信——iPhone/iPad/Mac控制树莓派(二):Swift控制端搭建,网络延迟显示
  13. 从零开始编写minecraft光影包(1)基础阴影绘制
  14. 提问 html文件谁来解析执行,2019年上初中信息技术教师资格考试面试真题
  15. html绘制直角坐标系,几何画板如何画直角坐标系并描点
  16. h5页面调用百度地图获取当前位置并在地图上标注出来
  17. Learning latent geometric consistency for 6D object pose estimation in heavily cluttered scenes
  18. 随机数Math.random()公式
  19. 如何优雅的用Axure绘制高保真原型心得分享
  20. Amazfit跃我GTR 3 Pro:150余款表盘+AOD,把个性玩到极致

热门文章

  1. FPGA设计心得(10)关于行为仿真的一点观点
  2. FPGA基础知识极简教程(6)UART通信与移位寄存器的应用
  3. Win7桌面快捷切换技巧?
  4. 【 FPGA 】使用状态机设计一个ADC采样控制电路
  5. 三对角线性方程组的追赶法
  6. 广州富力再引强援 95后潜力中锋桂宏加盟球队
  7. 硬件工程师笔试常见问题
  8. spring cloud 教程前言
  9. 5.数字拆分成4段,怎样使得4段的乘积最小【dp】
  10. Android工程目录