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

71 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天,今天重点回顾了下编译原理的相关知识。

什么是规则引擎

规则引擎是一种嵌入在应用程序里的组件,实现了业务决策和应用程序代码解耦。接收输入,解释业务规则,根据业务规则做出业务决策。

  1. 输入:根据预定义语义编写规则,用作策略集。
  2. 规则理解:按照语法、词法正确理解语义。
  3. 规则执行:策略集规则执行,保证结果正确

场景

  1. 风控对抗,黑灰产对抗
  2. 活动策略运营,及时通过用户反馈进行策略调整
  3. 数据分析

编译原理基本概念

什么是编译

不改变语义的条件下,将某种语言源代码转化成目标语言的程序。

解释型vs编译型

解释性:一边执行一边转化,转化工具是虚拟机或解释器,如python
编译型:一次性转换完毕,如cpp,go

词法分析

源代码字符串转token。
如何识别token?有限自动机。有限自动机是一个状态机,其状态数量有限,该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态转换。

语法分析

token转化成抽象语法树,每个节点是一个语法单元
利用递归下降算法,自顶向下构造语法树

AST抽象语法树

上下文无关语法,语句无需考虑上下文可判断其正确性。是用BNF巴科斯范式来表达。一个表达式可以由另外已知类型的表达式或者符号推导产生。

类型检查

编译时,提前声明参数类型;
执行时,检查输入参数值类型。

实践

我认为lc的2331. 计算布尔二叉树的值是一个最简单的例子,核心思想就是自下而上推断值。

    bool evaluateTree(TreeNode* root) {
        if (!root->left && !root->right) {
            return root->val == 1 ? true : false;
        }
        bool left = evaluateTree(root->left);
        bool right = evaluateTree(root->right);
        if (root->val == 2) {
            return left || right;
        } else {
            return left && right;
        }
    }