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 mainimport ("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
输出各个参数及其含义。
参考
- A Hello World for Ruby on Ragel
- A simple intro to writing a lexer with Ragel
转载于:https://www.cnblogs.com/shanpow/p/4183215.html
Hello Ragel -- 生成状态机的神器相关推荐
- matlab生成代码veri,一种自动生成状态机RTL代码的方法
1 引言 电子设计自动化(Electronic Design Automatic,EDA),在集成电路设计中扮演了重要的角色,无论前端还是后端设计都需要熟练掌握和使用各种EDA工具,现今EDA软件主要 ...
- 正则-生成验证规则神器
正则的创建 字面量创建方式 let reg = /^$/ 实例创建 RegExp 构造函数创建方式,可以实现正则的拼接 传递的参数是一个字符串 利用字符串可以拼接的特点,能够实现正则传递变量 可以引入 ...
- 感谢飞书放过幕布!GPT-4平替Poe;100个GPT-4实战案例;AI绘画新手指南之SD篇;new Bing靠谱教程;AI生成视频摘要神器 | ShowMeAI日报
- unity2d随机生成物体_2020 年最好用的一键生成设计神器,全在这里了!
对于很多新手设计师来说,要高效率地完成一件看上去还不错的设计作品,其实并不是一件容易的事.特别是在现实的工作中,对于临危受命的任务,更是很少有人会耐心地等你慢慢去摸索的.-- 不慌,今天就掏出一份私藏 ...
- 如何自动生成『状态机』代码?
关注.星标公众号,直达精彩内容 来源:网络素材 有限自动机(Finite Automata Machine)是计算机科学的重要基石,它在软件开发领域内通常被称作有限状态机(Finite State M ...
- Python实战案例,pygame模块,Python实现套路表白神器VS无套路表白神器
前言 利用Python实现套路表白神器VS无套路表白神器.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pygame模块: random模块 sys模块: ...
- 零散专题32 生成PDF
生成pdf的方案 (1)JSPDF(前端生成 ) 优点:不需要服务端安装无头浏览器,使用CSS方便控制样式,生成的PDF文字可复制 缺点:对中文支持不好 (2)PDFKit( 服务端生成) 优点:服务 ...
- QP状态机的优势以及QM的使用
https://zhuanlan.zhihu.com/p/375285086 QP状态机的优势以及QM的使用mp.weixin.qq.com 本文主要着重于讲解如何使用QM来绘制状态机图,现代分层状 ...
- QP状态机学习①——QP状态机架构
QP是一个实时嵌入式框架(RTEF),事件驱动的实时内核(RTOS内核)以及一套基于主机的互补工具相结合的,可实现事件驱动的体系结构,并且基于模型设计可以自动代码生成. QP-bundle,是QM建模 ...
- 根据Spine动画自动创建代码状态机
Spine创建状态机的方法 导入Spine的三个文件,然后会生成SkeletonData.asset文件,然后将SkeletonData.asset文件拖动到Hierarchy下,选择Skeleton ...
最新文章
- Kali Linux 2020.1安装桌面
- 回《笔试常见的“阶乘”编程题,你写对了么?》
- 2022年全球及中国面粉混合物行业发展态势与消费需求前景调查报告
- fatal: unable to access ‘‘: TCP connection reset by peer
- [云炬python3玩转机器学习笔记] 3-7Numpy中的矩阵运算
- 《Effective C#》的读书笔记
- 发现不错的文章,推!
- windows 禁用ipv6服务_在 Windows 7 中禁用IPv6协议/IPv6隧道
- python生成json_生成动态嵌套JSON对象和数组-python - python
- ios实例开发精品文章推荐(8.5)
- 2018-11-16
- 跟我一起学docker(14)--docker swarm的使用
- 橡胶柱压缩_橡胶=汽车半条命:浅谈ABAQUS橡胶大变形仿真5大注意事项
- Mac实用软件及功能吐血总结
- bzoj2286: [Sdoi2011]消耗战
- Twitter上热门的技巧与思路
- 通往财富自由之路详细笔记(11)
- MySQL基础架构:一条SQL“查询语句”是如何执行的
- Python求均值,方差,标准差
- 一些笔记本电脑的简单配置和价格
热门文章
- BOS v2.0后台管理系统 JQuery Easyui 相关知识讲解
- 偏最小二乘法_实例讲解:简明扼要最小二乘法计算过程
- XX市核酸检测软件开发基本方案
- 电商数据库核心表设计
- 基于Python+Django的微博评论热点舆情分析可视化系统的设计与实现-计算机毕业设计选题题目推荐
- 宽度学习(一):宽度学习体系:有效和高效的无需深度架构的增量学习系统
- 城市应急指挥系统详情分析及建设方案概述
- allegro17.4绘制PCB封装-R0603
- 电池测试系统连接服务器失败,服务器报电池故障
- 把js封装到html,什么是javascript封装?