PHP的词法解析器:re2c
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相关推荐
- re2c php,PHP的词法解析器:re2c
出处:http://www.phppan.com/2011/09/php-lexical-re2c/ 作者: 胖胖 re2c是一个扫描器制作工具,可以创建非常快速灵活的扫描器.它可以产生高效代码,基于 ...
- 词法解析器 | 从零实现一门语言
从这一节开始,进行词法解析器的原理分析和代码实现,我们以C的语法为模板,用C++来进行编译器的代码开发,开发语言任意选择自己熟悉的一种都行. 观察以下代码块,分析其结构. int main(){ in ...
- 自己动手实现一个简单的JSON解析器
1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 ...
- 手把手教你实现一个 JSON 解析器!
1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等. 在 ...
- MySQL内核源码解读-SQL解析之解析器浅析
MYSQL服务器接收SQL格式的查询,首先要对sql进行解析,内部将文本格式转换为二进制结构,这个转换就是解析器,解析的目的是为了让优化器更好的处理指令,以便以最优的路径,最少的耗时返回我们想要的结果 ...
- mysql ddl 语法解析工具_sharding-sphere之语法解析器
语法解析器,根据不同类型的语句有不同的语法解析器去解析成成SQLStatement,SQL解析器的类图我用脑图画出来如下: SQLParser.png 可以看到,不同的sql有不同的处理解析器去解析, ...
- json string 格式_自己动手实现一个简单的JSON解析器
作者:田小波 原文:http://cnblogs.com/nullllun/p/8358146.html 1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数 ...
- json解析对应的value为null_徒手撸一个JSON解析器
Java大联盟 致力于最高效的Java学习 关注 作者 | 田小波 cnblogs.com/nullllun/p/8358146.html1.背景JSON(JavaScript Object No ...
- 手写了一个简单的JSON解析器,网友直乎:牛!
作者 | 田小波 来源 | http://r3m2u.cn/4455O 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 X ...
最新文章
- 5个相见恨晚的神器网站
- 使用 Newtonsoft.Json; 序列化正常,反序列化异常的一点思考
- debian安装搜狗
- 零基础学习 Python 之文件
- kohana3 数据库模块配置
- php上传商品信息并显示,第37课 thinkphp5添加商品基本信息及通过前置钩子上传商品主图 模型事件(勾子函数)...
- 【BCS2021】软件供应链完整演讲回看
- 大规模数据生成 (500万条数据)
- php 替换alt,PHP 实现自动添加或者替换 内容的IMG标签的 alt title 属性
- Windows Azure AppFabric应用程序
- Spss-kmeans聚类分析操作
- 基于websocket的跨平台通信——iPhone/iPad/Mac控制树莓派(二):Swift控制端搭建,网络延迟显示
- 从零开始编写minecraft光影包(1)基础阴影绘制
- 提问 html文件谁来解析执行,2019年上初中信息技术教师资格考试面试真题
- html绘制直角坐标系,几何画板如何画直角坐标系并描点
- h5页面调用百度地图获取当前位置并在地图上标注出来
- Learning latent geometric consistency for 6D object pose estimation in heavily cluttered scenes
- 随机数Math.random()公式
- 如何优雅的用Axure绘制高保真原型心得分享
- Amazfit跃我GTR 3 Pro:150余款表盘+AOD,把个性玩到极致