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 -- 生成状态机的神器相关推荐

  1. matlab生成代码veri,一种自动生成状态机RTL代码的方法

    1 引言 电子设计自动化(Electronic Design Automatic,EDA),在集成电路设计中扮演了重要的角色,无论前端还是后端设计都需要熟练掌握和使用各种EDA工具,现今EDA软件主要 ...

  2. 正则-生成验证规则神器

    正则的创建 字面量创建方式 let reg = /^$/ 实例创建 RegExp 构造函数创建方式,可以实现正则的拼接 传递的参数是一个字符串 利用字符串可以拼接的特点,能够实现正则传递变量 可以引入 ...

  3. 感谢飞书放过幕布!GPT-4平替Poe;100个GPT-4实战案例;AI绘画新手指南之SD篇;new Bing靠谱教程;AI生成视频摘要神器 | ShowMeAI日报

  4. unity2d随机生成物体_2020 年最好用的一键生成设计神器,全在这里了!

    对于很多新手设计师来说,要高效率地完成一件看上去还不错的设计作品,其实并不是一件容易的事.特别是在现实的工作中,对于临危受命的任务,更是很少有人会耐心地等你慢慢去摸索的.-- 不慌,今天就掏出一份私藏 ...

  5. 如何自动生成『状态机』代码?

    关注.星标公众号,直达精彩内容 来源:网络素材 有限自动机(Finite Automata Machine)是计算机科学的重要基石,它在软件开发领域内通常被称作有限状态机(Finite State M ...

  6. Python实战案例,pygame模块,Python实现套路表白神器VS无套路表白神器

    前言 利用Python实现套路表白神器VS无套路表白神器.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pygame模块: random模块 sys模块: ...

  7. 零散专题32 生成PDF

    生成pdf的方案 (1)JSPDF(前端生成 ) 优点:不需要服务端安装无头浏览器,使用CSS方便控制样式,生成的PDF文字可复制 缺点:对中文支持不好 (2)PDFKit( 服务端生成) 优点:服务 ...

  8. QP状态机的优势以及QM的使用

    https://zhuanlan.zhihu.com/p/375285086 QP状态机的优势以及QM的使用​mp.weixin.qq.com 本文主要着重于讲解如何使用QM来绘制状态机图,现代分层状 ...

  9. QP状态机学习①——QP状态机架构

    QP是一个实时嵌入式框架(RTEF),事件驱动的实时内核(RTOS内核)以及一套基于主机的互补工具相结合的,可实现事件驱动的体系结构,并且基于模型设计可以自动代码生成. QP-bundle,是QM建模 ...

  10. 根据Spine动画自动创建代码状态机

    Spine创建状态机的方法 导入Spine的三个文件,然后会生成SkeletonData.asset文件,然后将SkeletonData.asset文件拖动到Hierarchy下,选择Skeleton ...

最新文章

  1. Kali Linux 2020.1安装桌面
  2. 回《笔试常见的“阶乘”编程题,你写对了么?》
  3. 2022年全球及中国面粉混合物行业发展态势与消费需求前景调查报告
  4. fatal: unable to access ‘‘: TCP connection reset by peer
  5. [云炬python3玩转机器学习笔记] 3-7Numpy中的矩阵运算
  6. 《Effective C#》的读书笔记
  7. 发现不错的文章,推!
  8. windows 禁用ipv6服务_在 Windows 7 中禁用IPv6协议/IPv6隧道
  9. python生成json_生成动态嵌套JSON对象和数组-python - python
  10. ios实例开发精品文章推荐(8.5)
  11. 2018-11-16
  12. 跟我一起学docker(14)--docker swarm的使用
  13. 橡胶柱压缩_橡胶=汽车半条命:浅谈ABAQUS橡胶大变形仿真5大注意事项
  14. Mac实用软件及功能吐血总结
  15. bzoj2286: [Sdoi2011]消耗战
  16. Twitter上热门的技巧与思路
  17. 通往财富自由之路详细笔记(11)
  18. MySQL基础架构:一条SQL“查询语句”是如何执行的
  19. Python求均值,方差,标准差
  20. 一些笔记本电脑的简单配置和价格

热门文章

  1. BOS v2.0后台管理系统 JQuery Easyui 相关知识讲解
  2. 偏最小二乘法_实例讲解:简明扼要最小二乘法计算过程
  3. XX市核酸检测软件开发基本方案
  4. 电商数据库核心表设计
  5. 基于Python+Django的微博评论热点舆情分析可视化系统的设计与实现-计算机毕业设计选题题目推荐
  6. 宽度学习(一):宽度学习体系:有效和高效的无需深度架构的增量学习系统
  7. 城市应急指挥系统详情分析及建设方案概述
  8. allegro17.4绘制PCB封装-R0603
  9. 电池测试系统连接服务器失败,服务器报电池故障
  10. 把js封装到html,什么是javascript封装?