re2c实例
#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实例的更多相关文章
- 最近学习工作流 推荐一个activiti 的教程文档
全文地址:http://www.mossle.com/docs/activiti/ Activiti 5.15 用户手册 Table of Contents 1. 简介 协议 下载 源码 必要的软件 ...
- js-静态、原型、实例属性
本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- EntityFramework Core 1.1是如何创建DbContext实例的呢?
前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...
- redis集成到Springmvc中及使用实例
redis是现在主流的缓存工具了,因为使用简单.高效且对服务器要求较小,用于大数据量下的缓存 spring也提供了对redis的支持: org.springframework.data.redis.c ...
- 流程开发Activiti 与SpringMVC整合实例
流程(Activiti) 流程是完成一系列有序动作的概述.每一个节点动作的结果将对后面的具体操作步骤产生影响.信息化系统中流程的功能完全等同于纸上办公的层级审批,尤其在oa系统中各类电子流提现较为明显 ...
- UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)
前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...
- echarts+php+mysql 绘图实例
最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...
- 【HanLP】HanLP中文自然语言处理工具实例演练
HanLP中文自然语言处理工具实例演练 作者:白宁超 2016年11月25日13:45:13 摘要:HanLP是hankcs个人完成一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环 ...
随机推荐
- 单一职责原则SRP
定义: There should nerver be more then one reason for a class to change. 优点: 1.类的复杂性降低,实现什么职责都有清晰明确的定义 ...
- JAVA多线程经典问题 -- 生产者 消费者
工作2年多来一直也没有计划写自己的技术博客,最近辞职在家翻看<thingking in JAVA>,偶尔看到了生产者与消费者的一个经典的多线程同步问题.本人在工作中很少使用到多线程以及高并 ...
- dm3730和dm6437,dm6446,AM335x启动过程的不同
dm3730的启动流程为RBL+X-loader+uboot+uImage分别在片内ROM(fireware),片内SRAM,片外的DDR,片外的DDR. 之所以建立这样一个复杂的启动过程,我个人的理 ...
- linux主机load average的概念&&计算过程&&注意事项
最近开发的一个模块需要根据机房各节点的负载情况(如网卡IO.load average等指标)做任务调度,刚开始对Linux机器load average这项指标不是很清楚,经过调研,终于搞清楚了其计算方 ...
- php+redis实现多台服务器内网存储session并读取
大型网站由于大并发的问题会导致系统出现诡异的崩溃性问题这着实让人很是蛋疼,首先考虑的就是负载均衡服务器来处理这个,当然数据库的性能也是非常非常重要的,今天就说下在负载均衡情况下对于session这个问 ...
- twemproxy接收流程探索——twemproxy代码分析正编
在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份优秀的c语言,为此,在twemproxy的代码中会大篇幅使用c指针.但是不论是普通类型的指针还是函数指针,都可以让我们这 ...
- JMeter在Linux系统中的环境变量配置
下载: 在线下载jmeter(或者本地上传): wget http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmet ...
- svn服务器搭建-SuSE Linux Enterprise Server 11 SP3
svn存储版本数据也有2种方式: 1.bdb: 2.fsfs. 因为BDB方式在服务器中断时,有可能锁住数据(搞ldap时就深受其害,没法根治),所以还是FSFS方式更安全一点,我也选择这种方式. ...
- 程序启动的目录不一样.ajax请求的地址跳转会出现的问题
程序启动的目录不一样.ajax请求的地址跳转会出现的问题启动 frontend/web/启动 frontend/ $.ajax({ url:"<?php echo Yii::$app- ...
- C# Volatile 类
关于C#中Volatile类的具体信息,请访问MSDN: https://msdn.microsoft.com/en-us/library/system.threading.volatile(v=vs ...