Hello Ragel -- 生成状态机的神器
Ragel 是个很 NB 的能生成状态机的编译器,而且支持一堆语言:C、C++、Object-C、C#、D、Java、Go 以及 Ruby。
原来的文本解析器是用正则表达式实现的,随着状态(if-else)越来越多,修改越来越麻烦。。。
安装
Mac OS 安装很简单,直接
brew install Ragel
其他系统没有试过,不过官网提供压缩包 ragel-6.9.tar.gz,里边有个 install.sh,想必是可以完成安装的。
格式
Ragel 通过将状态语句嵌入宿主语言,与宿主语言(Go、Ruby 等)共同组成可执行程序。其基本格式如下:
- 使用
%%{}%%包裹多行 Ragel 语句,或使用%%表示单行 Ragel 语句 - 必须使用
machine定义一个状态机名称(可以继承自其他 .rl 文件) write data生成数据write init生成初始化代码write exec生成执行代码
Hello World
package main
import (
"fmt"
)
%%{
machine hello;
write data;
}%%
func main(){
run_machine("h")
run_machine("w")
}
func run_machine(data string){
cs, p, pe := 0, 0, len(data)
fmt.Println("Running the state machine with input ",data)
%%{
exp1 = "h";
exp2 = "w";
main:=(exp1 @ {fmt.Println("Hello world")} | exp2 @ {fmt.Println("welcome")});
write init;
write exec;
}%%
fmt.Println("Finished. The state of the machine is: ",cs)
fmt.Println("p: ",p," pe: ",pe)
}
保存为 hello.rl 然后执行 ragel -Z hello.rl 则生成 hello.go,执行 go run hello.go 输出如下:

对 Ragel 参数感兴趣,可以使用 ragel -h 输出各个参数及其含义。
参考
Hello Ragel -- 生成状态机的神器的更多相关文章
- Yarn中如何生成状态机图
原文 http://xiguada.org/yarn_state_picture/ 在Hadoop2.0系列的版本里,采用了状态机的方式处理ResourceManager,NodeManager,Ma ...
- YARN 状态机可视化,生成状态机图
由于在windows下面,配置好所有 编译hadoop2.4.1源码 的环境会很麻烦,好在我之前已经把hadoop2.4.1的源码成功导入eclipse,并解决了所有错误提示,所以我就可以在eclip ...
- yarn状态机的可视化
YARN为了实现多个状态机的对象,控制ResourceManager中间RMAppImpl.RMApp-AttemptImpl.RMContainerImpl和RMNodeImpl,NodeManag ...
- unity5之代码创建状态机,玩的666
http://blog.csdn.net/litaog00/article/details/50483189 最近做项目的时候用到了状态机,网上搜了一下帖子,大部分都是简单介绍使用方法的,讲解的详细的 ...
- 一个人独立开发 3D 游戏引擎可能吗?
作者:孙志超链接:https://www.zhihu.com/question/24733255/answer/42000966来源:知乎著作权归作者所有,转载请联系作者获得授权. 当然可以,但难道有 ...
- 代码生成AnimatorController
0.出发点 现在的项目需要设置多套动画组合,全部是由策划在XML文件中设置完成,如果完全的手动在AnimatorController中去做不但工作量大而且如果将来有配置修改了还要一个个去找到对应的自状 ...
- codemirror和ace editor的语法高亮
两个javascript库用做在线代码编辑器都是非常优秀的选择 我这两天对这两个类库做了简单的研究,重点是语法高亮的自定义: ace editor的主要思路是生成状态机,从一个startstate开始 ...
- ANTLR3完全参考指南读书笔记[02]
前言 程序语言是什么? 用wiki上的描述,程序语言是一种人工设计的语言,用于通过指令与机器交互:程序语言是编程程序的标记,而程序是一种计算或算法的描述.详细介绍和背景信息参考: Programmin ...
- ES6中的迭代器(Iterator)和生成器(Generator)
前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简 ...
随机推荐
- 安装并启用rabbitmq服务器
1.确保Erlang已经安装 2.安装rabbitmq服务器 [root@bogon yum.repos.d]# rpm --import https://dl.bintray.com/rabbitm ...
- [BZOJ2631]tree 动态树lct
2631: tree Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 5171 Solved: 1754[Submit][Status][Discus ...
- ng2-admin安装问题
问题一 启动项目出现如下error: 原理: 暂不清晰, 目前认为是项目本身的问题. 项目作者在博文中给出了相应的解决方案. 具体解决方案: 如果之前装过angular-cli需要先卸载:npm un ...
- Dart基础
dartpad在线调试 :https://dartpad.dartlang.org 运行需要用墙 vscode执行dart 安装 安装dart插件 下载安装dart 配置环境变量 vscode新建 ...
- CF 1009A Game Shopping 【双指针/模拟】
Maxim wants to buy some games at the local game shop. There are n games in the shop, the i-th game c ...
- Android学习--探究服务(二)
服务的基本用法 定义服务: 我们需要先创建服务,我们要使用就的利用一个类去继承它,然后重写它的几个方法,具体的我们看下面的代码: 我们重写了下面三个方法: * onCreate() ...
- 差分数组 and 树上差分
差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易 ...
- Placement new的用法及用途【转】
什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可.举例来说: class foo{ ...
- 简单的INSERT语句
INSERT INTO 语句用来向数据表中插入数据,比如执行下面的语句就可以向T_Person表中插入一条数据: INSERT INTO T_Person(FName,FAge,FRemark) VA ...
- py thon 多线程(转一篇好文章)
http://www.cnblogs.com/fnng/p/3670789.html