这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天,今天重点回顾了下编译原理的相关知识。
什么是规则引擎
规则引擎是一种嵌入在应用程序里的组件,实现了业务决策和应用程序代码解耦。接收输入,解释业务规则,根据业务规则做出业务决策。
- 输入:根据预定义语义编写规则,用作策略集。
- 规则理解:按照语法、词法正确理解语义。
- 规则执行:策略集规则执行,保证结果正确
场景
- 风控对抗,黑灰产对抗
- 活动策略运营,及时通过用户反馈进行策略调整
- 数据分析
编译原理基本概念
什么是编译
不改变语义的条件下,将某种语言源代码转化成目标语言的程序。
解释型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;
}
}