#include <stdio.h>
#include "demo_def.h" #define T_BEGIN 0
#define T_NUMBER 1
#define T_LOWER_CHAR 2
#define T_UPPER_CHAR 3
#define T_EXIT 4
#define T_UNKNOWN 5
#define T_INPUT_ERROR 6
#define T_END 7
#define T_WHITESPACE 8 typedef struct _scanner {
char *yy_cursor;
int yy_state;
char *yy_limit;
char *yy_marker;
} Scanner; Scanner scanner_globals; #define YYCTYPE char
#define YYFILL(n)
#define STATE(name) yyc##name
#define BEGIN(state) YYSETCONDITION(STATE(state))
#define LANG_SCNG(v) (scanner_globals.v)
#define SCNG LANG_SCNG #define YYGETCONDITION() SCNG(yy_state)
#define YYSETCONDITION(s) SCNG(yy_state) = s
#define YYCURSOR SCNG(yy_cursor)
#define YYLIMIT SCNG(yy_limit)
#define YYMARKER SCNG(yy_marker) int scan(){
/*!re2c <INITIAL>"<?php" {BEGIN(ST_IN_SCRIPTING); return T_BEGIN;}
<ST_IN_SCRIPTING>[0-9]+ {return T_NUMBER;}
<ST_IN_SCRIPTING>[ \n\t\r]+ {return T_WHITESPACE;}
<ST_IN_SCRIPTING>"exit" { return T_EXIT; }
<ST_IN_SCRIPTING>[a-z]+ {return T_LOWER_CHAR;}
<ST_IN_SCRIPTING>[A-Z]+ {return T_UPPER_CHAR;}
<ST_IN_SCRIPTING>"?>" {return T_END;} <ST_IN_SCRIPTING>[^] {return T_UNKNOWN;}
<*>[^] {return T_INPUT_ERROR;}
*/
} void print_token(int token) {
switch (token) {
case T_BEGIN: printf("%s\n", "T_BEGIN");break;
case T_NUMBER: printf("%s\n", "T_NUMBER");break;
case T_LOWER_CHAR: printf("%s\n", "T_LOWER_CHAR");break;
case T_UPPER_CHAR: printf("%s\n", "T_UPPER_CHAR");break;
case T_EXIT: printf("%s\n", "T_EXIT");break;
case T_UNKNOWN: printf("%s\n", "T_UNKNOWN");break;
case T_INPUT_ERROR: printf("%s\n", "T_INPUT_ERROR");break;
case T_END: printf("%s\n", "T_END");break;
}
} int main(int argc, char* argv[])
{
int token;
BEGIN(INITIAL); // 全局初始化,需要放在scan调用之前
scanner_globals.yy_cursor = argv[]; //将输入的第一个参数作为要解析的字符串 while() {
if(*YYCURSOR == '\0') break;
token = scan();
print_token(token);
} return ;
}

编译,运行,结果

[root@bhu les5]# re2c -o demo.c -c -t demo_def.h demo.l

[root@bhu les5]# gcc -o demo demo.c -g

[root@bhu les5]# ./demo "<?php 3ee344SDEFeee@#?>"

T_BEGIN

T_NUMBER

T_LOWER_CHAR

T_NUMBER

T_UPPER_CHAR

T_LOWER_CHAR

T_UNKNOWN

T_UNKNOWN

T_END

re2c实例的更多相关文章

  1. 最近学习工作流 推荐一个activiti 的教程文档

    全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...

  2. js-静态、原型、实例属性

    本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...

  3. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  4. EntityFramework Core 1.1是如何创建DbContext实例的呢?

    前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...

  5. redis集成到Springmvc中及使用实例

    redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...

  6. 流程开发Activiti 与SpringMVC整合实例

    流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...

  7. UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)

    前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...

  8. echarts+php+mysql 绘图实例

    最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...

  9. 【HanLP】HanLP中文自然语言处理工具实例演练

    HanLP中文自然语言处理工具实例演练 作者:白宁超 2016年11月25日13:45:13 摘要:HanLP是hankcs个人完成一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环 ...

随机推荐

  1. Alfred工具

    神兵利器——Alfred 有人的地方就有江湖,有江湖就有纷争. 很多人说我的文字风格相对轻松和温和,那是因为我很早就认识到,我们没有教育脑残和喷子的义务.在网际多年,看过太多虚拟的刀锋和鲜血,很多人被 ...

  2. hdu4277 USACO ORZ

    USACO ORZ Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. 长轮询实现Chat并迁移到Azure测试

    长轮询实现Chat并迁移到Azure测试 公司的OA从零开始进行开发,继简单的单点登陆.角色与权限.消息中间件之后,轮到在线即时通信的模块需要我独立去完成.这三周除了逛网店见爱*看动漫接兼职,基本上都 ...

  4. c# 项目带皮肤一起打包发布解决办法

    c# 项目带皮肤一起打包发布解决办法 前提:c#语言   winform应用程序  皮肤为IrisSkin2 目标:在打包发布独立应用 程序时,将皮肤也一起打包发布,实现程序在其它机子安装时,皮肤效果 ...

  5. 反向代理(Reverse Proxy)

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...

  6. dm3730和dm6437,dm6446,AM335x启动过程的不同

    dm3730的启动流程为RBL+X-loader+uboot+uImage分别在片内ROM(fireware),片内SRAM,片外的DDR,片外的DDR. 之所以建立这样一个复杂的启动过程,我个人的理 ...

  7. 关于ABP——领域服务的思考

    我在刚接触ABP的时候一直有一个疑问--有了应用服务,为什么还需要领域服务呢? 领域服务和应用服务对比 领域服务 应用服务 返回值 Entity DTO 被表现层调用 不可以(非强制) 可以 在ABP ...

  8. [ios2] ios7UI适配 【转】

    http://blog.csdn.net/toss156/article/details/11843873#comments (1)如果应用程序始终隐藏 status bar 那么恭喜呢,你在UI上需 ...

  9. php钩子程序设计

      序   作为程序员,设计出优雅而完美的系统,永远是让我们非常兴奋的事情.高手不在于你会多少语言,而在于你有多高的思想.   在设计中,怎么体现自身价值,那就是要比别人多想几步.   讲钩子程序,起 ...

  10. zabbix 布署实践【7 H3C网络设备监控模版制作思路】

    我们知道,zabbix安装后自带Template OS Linux 模版已满足了绝大部分Linux服务器的基础环境监控,只是我们在其模版上稍微修改,可配合将SWAP监控取消,另存为一个叫OS Linu ...