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工具包,目标是普及自然语言处理在生产环 ...
随机推荐
- VC 编程ANSI环境下读写Unicode文件
没有注意到文件编码的不同会产生这么多的问题,在动手以前查询了很多资料,在本博客中收藏了不少先辈的成果,在这里一并表示致敬! 关于ANSI和Unicode编码的原理在这里也不说了,主要讲下如 ...
- 关于Symfony2+nginx搭建过程总结
关于Symfony2+nginx搭建过程总结 最近在试着用nginx+symfony搭建公司的网站,由于nginx不支持pathinfo模式,所以必须修改nginx(我使用的是nginx1.5.1)的 ...
- hdu 1217
判断通过货币的兑换能否获利,,最短路,这里是乘法,, #include<stdio.h> #include<string.h> double map[31][31],ans[3 ...
- struts升级到最高版本后遇到的问题。关于actionmessage传递问题。
Struts2升级到最新版本遇到的一些问题 首先是更换对应的jar,如asm.common.ongl.struts等等.更换后发现系统启动不了,按照网上的介绍,先后又更新了slf4j-log4j12- ...
- 【汇编语言】新手第一步——HelloWorld & A+B
国际惯例,HelloWorld. 这个程序是masm for windows里面的样例程序.按照我自己的理解,对其加上了注释. ;完整段的Hello World程序 DATAS SEGMENT STR ...
- eclipse 中导入 maven项目 启动报错
导入Maven项目到Eclipse中时,出现问题如下: java.lang.ClassNotFoundException: org.springframework.web.context.Contex ...
- 利刃 MVVMLight 2:Model、View、ViewModel结构以及全局视图模型注入器的说明
上一篇我们已经介绍了如何使用NuGet把MVVMLight应用到我们的WPF项目中.这篇我们来了解下一个基本的MVVMLight框架所必须的结构和运行模式. MVVMLight安装之后,我们 ...
- 搭建PHP建站环境
PHP是一种网站后端脚本语言,通常在web开发中使用apache+PHP+MYSQL这种黄金搭档来建立支持PHP的站点,PHP运行环境或者说任何技术的运行环境都不是简单的加法,即使是安装有apache ...
- Debian 8 安装BtSync
声明,此方法是Btsync的官网resilio提供的方法 传送门:https://help.getsync.com/hc/en-us/articles/206178924 第一,在如下文件中添加: 1 ...
- (二)Python是一门什么样的语言?
在学习python是一门什么样的语言之前首先需要知道什么是编译和解释? 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 而 ...