博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hello Ragel -- 生成状态机的神器
阅读量:5234 次
发布时间:2019-06-14

本文共 1052 字,大约阅读时间需要 3 分钟。

是个很 NB 的能生成状态机的编译器,而且支持一堆语言:C、C++、Object-C、C#、D、Java、Go 以及 Ruby。

原来的文本解析器是用正则表达式实现的,随着状态(if-else)越来越多,修改越来越麻烦。。。

安装

Mac OS 安装很简单,直接

brew install Ragel

其他系统没有试过,不过官网提供压缩包 ,里边有个 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 输出如下:

console out

对 Ragel 参数感兴趣,可以使用 ragel -h 输出各个参数及其含义。

参考

转载于:https://www.cnblogs.com/shanpow/p/4183215.html

你可能感兴趣的文章
sql script: Graphs, Trees, Hierarchies and Recursive Queries
查看>>
Paper Reading: Relation Networks for Object Detection
查看>>
Android中点中overlay弹出带尾巴的气泡的实现
查看>>
Mybatis接口中传递多个参数
查看>>
Dreamweaver层使用八定律
查看>>
Java IO流学习总结
查看>>
day22 01 初识面向对象----简单的人狗大战小游戏
查看>>
数组的几种常用方法总结
查看>>
递归函数,二分运算,正则表达式
查看>>
阅读软件工程的问题
查看>>
【Netty】UDP广播事件
查看>>
(4)Numpy+矩阵计算+和生成
查看>>
ttt
查看>>
[置顶] java处理office文档与pdf文件(一)
查看>>
Flutter之内置动画(转)
查看>>
MySql优化相关概念的理解笔记
查看>>
sql索引影响数据存储位置的示例
查看>>
数据库解决方案
查看>>
备份U盘分区表,未雨绸缪
查看>>
Eclipse配置 自动补全功能 快捷键 alt+/
查看>>