这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
引擎类型
什么是规则引擎
业务规则引擎是在运行时生产环境中执行一个或多个**业务规则**的软件系统。
这些规则可能来自法律法规(“员工可以因任何原因或无理由被解雇,但不能出于非法原因”)、
公司政策(“所有一次花费超过 100 美元的客户将获得 10% 的折扣”)或其他来源。
业务规则系统使这些公司策略和其他操作决策能够独立于应用程序代码进行定义、测试、执行和维护。
应用场景
- 风控对抗
- 活动策略运营
- 数据分析和清洗
-
数据输入。接受使用预定义的语义编写的规则作为策略集,比如
price > 500,接受业务的数据作为执行过程中的的参数,比如价格、标签等; -
规则理解。能够按照预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的语义;
-
规则执行。根据执行时输入的参数对策略集中的规则进行正确的解释和执行。同时对规则执行过程中的数据类型进行见擦汗,确保执行结果正确。
词法分析 Lexical Analysis
token
语法分析 Syntax Analysis
抽象语法树 Abstract Tree
-
上下文无关语法 Contex-Free Grammar
- 唯一正确 可使用巴科斯范式(BNF)
exp : log ;
log : log ('&&'|'||') cmp |cmp
cmp : cmp '>' add | add
add : add '+' mul | mul
mul : mul '*' pri | pri
pri : const | id | (exp)
一层层递归
类型检查
编译检查&运行检查
设计引擎
- 词法
- 运算符
- 数据类型
- 优先级
例:
expr: logOr EOF;
logOr: logOr '||' logAnd | logAnd
logAnd: logAnd '&&'logNot | logNot
logNot: '|' logNot | cmp;
cmp: cmp '>' add | '>=' add | cmp '<' add | cmp '==' add | cmp '!-' add | add;
add: add '+' mul |add '-' mul | mul;
mul: mul '*'pri | mul '/' pri | mul '%' pri | pri;
实现引擎
kind token 部分
package token
import(
"errors"
"fmt"
"strconv"
)
type Kind int
const (
Illegal=0 Kind = iota liyy
Eof=1
kindBegin=2
//bool
Identifier=3 //variables
BoolLiteral=4 //true
IntegerLiteral=5 //12345
FloatLiteral=6 //123.45
StringLiteral=7 //"abc"
OpenParen=8
CloseParen=9
Addition=10 // +
Subtraction=11 // -
Multiply=12 // *
Divide=13 // /
Modulus=14 // %
GreaterThan=15 // >
LessThan=16 // <
GreaterEqyal=17 //>=
LessEqual=18 //<=
Equal=19 //==
NotEqual=20 //!=
And=21
Or=22
Not=23
kindEnd=24
)
var token = [...]string{
Illegal: "Illegal",
Eof: "Eof",
Identifier: "Ifentifier",
BoolLiteral: "BoolLiteral",
IntegerLiteral: "IntegerLiteral",
FloatLiteral: "FloatLiteral",
StringLiteral: "StringLiteral",
OpenParen: "(",
CloseParen: ")",
Addition: "+",
Subtraction: "-",
Multiply: "*",
Divide: "/",
Modulus: "%",
GreaterThan: ">",
LessThan: "<",
GreaterEqyal: ">=",
LessEqual: "<=",
Equal: "==",
NotEqual: "!=",
And: "&&",
Or: "||",
Not:"!",
}