规则引擎设计与实现 | 青训营笔记

95 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第3天
之前的go语言学习,代码练习这几天计划做一下,不过感觉都是代码...看看再说

01.规则引擎

根据业务规则做业务决策
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。 业务人员可以直接修改规则,减少开发人员的工作量

  • 数据输入
    • 接受参数,比如标签,价格
  • 规则理解
    • 按照预先定义的语法、优先级、运算符理解业务规则所表达的语义
  • 规则执行 应用场景:1.风控对抗,灰黑产对抗2.活动策略运营3.数据分析和清洗,快捷产出需要的数据

02.编译原理基本概念

抽象语法树:表达式抽象结果的树状表示,对于一个表达式,抽象语法树唯一确定
理解(词法分析:将源代码字符串转换为语法单元(Token),语法分析:在词法分析基础上识别出表达式语法结构)-〉执行-〉输入输出(参数注入:计算语法树标识符节点值、类型检查:检查是否合法)

  • 词法分析
    • 有限自动机识别Token,有限自动机就是一个状态机,该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态转换.
  • 语法分析
    • 抽象语法树 上下无关语法:无需考虑上下文即可判断正确性,可以使用巴科斯范式(BNF)来表达
    • 递归下降算法 自顶向下构造语法树,不断的对Token进行语法展开(下降),展开过程可能会遇到递归的情况
  • 类型检查
    • 类型综合 根据子表达式的类型构造出父表达式的类型.例如,表达式A+B的类型是根据A和B的类型定义的
    • 编译时检查&运行时检查 类型检查可以发生在表达式的编译阶段,即在构造语法树的阶段;也可发生在执行时的阶段

03.设计规则引擎

  • 词法(合法Token)
    • 参数:由字母数字下划线组成
    • 布尔值:true、flase
    • 字符串:’abcd‘、‘abcd’
    • 十进制int:1234
    • 十进制float:123.5
    • 预定义运算符:+ -
  • 运算符
    • 一元运算符:+ -
    • 二元运算符: + - * / & > < >= <= == !=
    • 逻辑操作符:&& || !
    • 括号:()
  • 数据类型
    • 字符串
    • 布尔值
    • 十进制float
    • 十进制float
  • 优先级 ||, &&, ! - +, > >= < <= == !=, + -, * /, ()
  • 语法树执行与类型检查
    • 执行——后续遍历
    • 检查——在一个节点的左右子节点执行完成后,分别检验左右子节点的类型是否符合对应操作符的类型检查建设规则.

04.规则引擎实现

github.com/qimengxingy… 项目地址