这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
内容源于青训营课堂视频以及一些go文档和自己的经验、理解,若有错误欢迎及时指出
1 认识规则引擎
- 什么是规则引擎
- 规则引擎的组成
- 应用场景
定义
规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策,接受数据输入,解释业务规则,并根据业务规则做出业务决策。
解决开发人员重复编码问题,业务决策与服务本身解耦,提高服务的可维护性缩短开发路径,提高效率
组成
- 数据输入:支持接受使用预定义的语义编写的规则作为策略集,接受业务数据作为执行过程中的参数
- 规则理解:能够按照预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的语义
- 规则执行:根据参数对规则进行正确的解释和执行,同时检查数据类型
应用场景
- 风控对抗
- 活动策略运营
- 数据分析和清洗
2 编译原理基本概念
2.1 词法分析
- 由词法分析器(Lexical Analyzer)完成,词法分析器又称为扫描器(scanner)
- 词法分析器从左到右扫描字符串,并将其转换成单词串;同时要查词法错误,进行标识符登记(符号表的管理)
- 输入:字符串
- 输出:种别码,属性值——序对
- 属性值——token的机内表示
2.2 语法分析
- 由语法分析器(Syntax Analyzer)完成,又叫做Parser
- 功能:
- 组词成句:将词组成各类语法成分,例如因子、项、表达式、语句、子程序
- 构造分析树
- 指出语法错误
- 指导翻译
- 输入:token序列
- 输出:语法成分
2.3 语义分析
- 一般和语法分析同时进行,称为语法制导翻译
- **功能:**分析由语法分析器识别出来的语法成分的语义
- 获取标识符的属性:类型、作用域等
- 语义检查:运算的合法性、取值范围等
- 子程序的静态绑定:代码的相对地址
- 变量的静态绑定:数据的相对地址
2.4 中间代码生成
- 语义分析通常以中间代码形式表达操作
- 特点:
- 简单规范
- 与机器无关
- 易于优化与转换
2.5 代码优化
过早的优化是万恶之源,让正确的程序更快,要比让快速的程序正确容易得多
将最多的努力投入到运行消耗时间最多的那部分代码中
- 尽量节省存储空间、更快、更高效
- 优化变换必须是等价的
- 分为与机器无关的优化、与机器有关的优化
2.6 目标代码生成
- 编译程序的最后一个阶段
- 为中间代码中出现的运算对象分配存储单元、寄存器等
- 将中间代码转为目标机的机器指令代码或汇编代码
2.7 错误处理
- 进行各种错误的检查、报告、纠正以及相应的续编译处理(错误的定位与局部化)
- 词法分析阶段:拼写方面的错误,出现非法字符等
- 语法分析阶段:表达式、句子或程序结构等错误
- 语义分析阶段:类型匹配错误、参数匹配错误、非法转移问题等
2.8 表格管理
各种符号表
“数据结构与算法”的应用
3 设计一个规则引擎
目标
设计一个规则引擎,支持特定的词法、运算符、数据类型和优先级。并支持基于以上预定义语法的规则表达式的编译和执行
- 词法
- 运算符
- 数据类型
- 优先级
词法分析
设计词法分析的状态机
语法分析
- 优先级的表达
- 语法树的结构
语法树执行与类型检查