#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. ngx-push-stream模块源码学习(五)——内存清理

    1.定时器         采用nginx自身的定时器管理机制,具体细节待学习过nginx源码后加以补充 2.channel的生成周期 (0).初始(诞生)         发布.订阅均有可能产生ch ...

  2. sql server数据库中删除的过程

    这是在vb中的一个对数据库中数据的删除过程,点击按钮后程序第一句则是将你要删除的那条记录的位置作为书签保存到myBookmark这个变量里面,然后选择确定删除的话,首先执行if语句下的第一句 mrc. ...

  3. 横瓜从WP7与WP8不兼容之处预测微软公司在未来20年将会倒闭

    横瓜(601069289)  12:40:50 微软频繁升级操作系统版本捞钱,还不向下兼容,其企业的核心竞争力不再是技术,是钱!除了操作系统,其它产品没有任何核心技术和竞争力,微软必死. 横瓜从WP7 ...

  4. autotools入门笔记(二)——创建和使用静态库、动态库

    带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的.只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文 ...

  5. log4net 开箱即用

    废话少说,先上代码 log4net Demo 好的系统都有日志,log4net 是我在.net平台下用过最爽的日志库,简单易用.功能强大. 基于配置(配置很简单,一看就明,通用,拷去即用): 可同时保 ...

  6. 关于SQL 数据表中的密码加密

    首先,都知道一个字节(byte)等于八位二进制数.在数据表中将密码字段设置为binary类型,再结合哈希散列运算可以实现密码加密. 下面介绍下binary 和 varbinary: binary 和  ...

  7. [ios2]iOS 使用subversion管理iOS源代码 【转】

    使用subversion管理iOS源代码 1.安装和配置subversion服务器 在windows 服务器上安装VisualSVN-Server,下载地址http://www.visualsvn.c ...

  8. Windows Server 2003下配置IIS6.0+php5+MySql5+PHPMyAdmin环境

    配置环境: 操作系统:Windows Server 2003 sp2企业版 Web服务器:系统自带的IIS6.0 所需工具: PHP:php-5.2.12-Win32.zip(官方网址:http:// ...

  9. javascript构造函数以及原型对象的理解

    以下是一个构造函数的例子 如果是实例方法,不同的实例化,它们引用的地址是不一样的,是唯一的. //定义一个构造函数 function People(name,age){ this.name=name; ...

  10. Unity在安卓的一些路径

    APK安装之后找不到路径 公司的测试机(安卓)基本都是不带SD卡的. APK在安卓手机上安装之后,使用手机助手类的软件打开文件管理,打开 内置SDK卡/Android/data/ 在这个目录下却发现 ...