规划引擎设计 l 青训营笔记

52 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

引擎类型

什么是规则引擎

业务规则引擎是在运行时生产环境中执行一个或多个**业务规则**的软件系统。
这些规则可能来自法律法规(“员工可以因任何原因或无理由被解雇,但不能出于非法原因”)、
公司政策(“所有一次花费超过 100 美元的客户将获得 10% 的折扣”)或其他来源。
业务规则系统使这些公司策略和其他操作决策能够独立于应用程序代码进行定义、测试、执行和维护。

应用场景

  1. 风控对抗
  2. 活动策略运营
  3. 数据分析和清洗
  • 数据输入接受使用预定义的语义编写的规则作为策略集,比如 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)

一层层递归

类型检查

编译检查&运行检查

设计引擎

  • 词法
  • 运算符
  • 数据类型
  • 优先级

例:

2023-01-31.png

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:"!",

}