这是我参与「第五届青训营 」笔记创作活动的第6天
【实践课】规则引擎设计与实现
课程目标
课前预习部分
规则引擎
规则引擎的本质呢就是我们自己定义一套语法,然后去解析用这套语法写的表达式,然后根据解析的内容执行表达式。这个过程其实就是编译和执行的过程。
编译过程经历的四个阶段
预处理——编译——汇编——链接
编译:将预处理后的文件经过词法分析、语法分析、语义分析、代码优化后转换为汇编代码文件
汇编:将汇编代码解释为二进制的机器指令
链接:把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接
在linux下执行一段C代码,可以将这四个步骤依次进行, 各阶段的指令如下:
预处理:gcc -E test.c -o test.i 编译:gcc -S test.i -o test.s 汇编:gcc -c test.s -o test.o 链接:gcc test.o -o test.exe 运行:./test.exe
课中
规则引擎(简而言之就是可以直接输入需求,然后直接实现业务逻辑)
组成部分
数据输入
规则理解
规则执行
应用场景
编译原理基本概念
词法分析
将源代码字符串转化为词法单元(Token)的过程
语法分析
在词法分析的基础上,识别表达式的语法结构的过程。语法结构一般用抽象语法树来表示,如图:
图中的每个结点都是第一步词法分析中产生的Token
抽象语法树
:左边的式子可以由:右边已知的式子推出
如下图,mul可以由pri表示或者由mul ‘*’ pri表示
利用递归下降算法来自顶向下构造出抽象语法树
类型检查
类型综合:根据子表达式的类型构造出父表达式类型。例如,A+B的类型是由A和B的类型定义
编译时检查&&运行时检查
设计一个规则引擎
目标:设计一个规则引擎,支持特定词法、运算符、数据类型和优先级。并且支持基于以上预定义语法的规则表达式的编译和执行
词法(合法Token)
词法分析
利用有限状态机来实现
快速上手Hertz(Windows)
1.首先安装命令行工具hz
2.创建新文件夹hertz_demo,进入文件夹后创建main.go文件,并添加以下代码
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
)
func main() {
h := server.Default()
h.GET("/ping", func(c context.Context, ctx *app.RequestContext) {
ctx.JSON(consts.StatusOK, utils.H{"message": "pong"})
})
h.Spin()
}
3.生成mod文件、整理&拉取依赖(直接在项目终端执行)
go mod init hertz_demo
go mod tidy
4.运行示例代码
$ go build -o hertz_demo && ./hertz_demo
推荐做法
在GOPATH/src目录下创建项目
1.进入目录终端,直接使用hz new命令
2.整理&拉取依赖
go mod tidy
只需两步即可体验hertz框架(非常简单)
3.运行测试
在Goland中的终端会失败,但是在cmd中就能成功
在PS时输入cmd即可进入传统cmd模式,即可测试成功
对接口进行测试
curl http://127.0.0.1:8888/ping
不出意外可以得到以下输出
到现在,我们已经成功启动了 Hertz Server,并完成了一次调用
PS和cmd的区别
1、在PS中,继承了cmd管道符号的表示方法:1表示管道。 2、PS与cmd的管道有本质的区别,cmd中的管道传递的是文本信息,而PS中传递的是对象,因此PS中的管道更加易于使用。