Go语言进阶(二) -- 编译原理基础、规则引擎设计与实现 词法分析 语法分析 语法数 上下文无关语法 巴科斯范式

Golang 规则引擎原理及实战 随着业务代码的不断迭代,诞生出了越来越多的 if-else,并且 if-else 中的逻辑越来越复杂,导致代码逻辑复杂、维护性差、可读性差、修改风险高等缺陷。 复杂的 if-else 逻辑其实对应的是一条条的规则,满足对应的规则在执行对应的操作,即 if-else 中的条件就是一个对应的 bool 表达式:... 阅读详情

Go 规则引擎设计与实现

1.认识规则引擎

1.1 背景

在这里插入图片描述

1.2 目标

​ 直接把计算规则输入进去,直接输出积分,规则简单容易配置、可扩展

在这里插入图片描述

1.3 规则引擎定义:

​ 规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

在这里插入图片描述

1.4 组成部分:

数据输入

支持接受使用预定义的语义编写的规则作为策略集。比如“price > 500”
接受业务的数据作为执行过程中的参数,比如价格、标签等

规则理解

能够按照预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的语义。

规则执行

根据执行时输入的参数对策略集中的规则进行正确的解释和执行。同时对规则执行过程中的数据类型进行检查,确保执行结果正确。

在这里插入图片描述

1.5 应用场景

风控对抗
与黑灰产的对抗过程中,策略研发和产品需要能够根据黑灰产特征进行快速识别和对抗。规则引擎作为风控系统的核心,使产研人员能够不断的调整和优化对抗策略,以实现最好的风控识别效果。

活动策略运营
业务活动的运营需要及时根据用户效果反馈进行运营策略的优化和调整。引入规则引擎后,可以将服务代码与业务运营逻辑解耦,提高运营策略的迭代效率。方便新玩法的探索和效果验证

数据分析和清洗

在数据分析系统中使用规则引擎可以便捷的实现对数据进行整理、清洗和转换。数据分析师可以根据不同的需求来自定义数据处理的规则,方便快捷的产出所需要的数据。

2.编译原理基本概念

2.1 规则引擎编译流程:

在这里插入图片描述

2.2 词法分析

​ 词法分析就是把源代码字符串转换为词法单元(Token)的过程。

​ 如下,以空格分割的词法分析:
在这里插入图片描述

引擎如何识别 Token ? – 有限自动机(Finite-State Automaton)

​ 有限自动机是一个状态机,它的状态数量是有限的,该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态转换。

2.3 语法分析 Syntax Analysis

​ 语法分析就是在词法分析的基础上,识别表达式的语法结构的过程。

在这里插入图片描述

在这里插入图片描述

2.3.1 抽象语法树

​ 表达式的语法结构可以用树来表示,其每个节点(子树)是一个语法单元,这个单元的构成规则就叫"语法"。每个节点还可以有下级节点。

在这里插入图片描述

  • 上下文无关语法

在这里插入图片描述

编程语言为什么不用人类的语言(自然语言),而是用上下文无关的文法呢? 因为

  1. 便于设计编译器。 客观上技术目前无法实现,如果使用了上下文相关文法,那就是真正实现了人工智能,NLP领域将会有重大突破。

  2. 便于代码开发维护。 如果开发出来的代码像高考的语文阅读理解一样,每个人都有不同的理解,那么,到底哪个才是作者真正想要表达的?如果人类都确定不了含义,那计算机同样也确定不了,最终结果就是错误执行或无法执行。

  3. 汇编语言/机器语言是上下文无关的。CPU执行指令时,读到哪条执行哪条。如果CPU需要考虑上下文,来决定一个语句到底要做什么,那么CPU执行一条语句会比现在慢千倍万倍。考虑上下文的事情,完全可以用户在编程的时候用算法实现。既然机器语言是上下文无关的,那高级语言也基本上是上下文无关的,可能有某些个别语法为了方便使用,设计成了上下文相关的,比如脚本语言的弱类型。在便于使用的同时,增加了解析器的复杂度。

巴科斯范式

BNF是描述上下文无关理论的一种具体方法,通过BNF可以实现上下文无关文法的具体化、公式化、科学化,是实现代码解析的必要条件。

<expr> ::= <expr> + <term>
         | <expr> - <term>
         | <term>

<term> ::= <term> * <factor>
         | <term> / <factor>
         | <factor>

<factor> ::= ( <expr> )
           | Num

如下演示递归下降算法流程:

​ 1. 一层一层往下推, 找出当前符号属于什么类型表达式;

​ 2. 下层表达式同时也是上层表达式 例如:pri 也是 cmp 表达式。
在这里插入图片描述

  • 类型检查

    • 类型综合法:

      • 根据子表达式的类型构造出父表达式的类型。例如 表达式 A + B是根据A和B的类型定义的。
        在这里插入图片描述
    • 检查时机:

      • 类型检查可以发生在表达式的编译阶段,即在构造语法树的阶段;也可以发生在执行时的阶段。

3.设计规则引擎

3.1 设计目标:

​ 设计一个规则引擎,支持特定的词法、运算符、数据类型和优先级。并且支持基于以上预定义语法的规则表达式的编译和执行。

3.2 词法分析:

  • 词法(合法 Token)

    参数 : 由字母数字下划线组成 eg:_ab2、user_name

    布尔值:true、false
    字符串:“abcd”、'abcd’、`abcd

    十进制int:1234

    十进制float:123.5

    预定义运算符:±

  • 运算符

    一元运算符:+ -
    二元运算符:+ - * / % > < >= <= == !

    逻辑操作符:&& || !

    括号:()

  • 数据类型

    字符串

    布尔值

    十进制int

    十进制float

  • 优先级

在这里插入图片描述

  • 词法状态机

在这里插入图片描述

3.3 语法分析

  • 巴科斯范式

在这里插入图片描述

​ 说明: expr - 表达式; log - 逻辑运算符;cmp - 比较表达式;add - 加法式;mul - 乘法式;pri - 基础表达式

  • 优先级的表达

    type precedence struct {
    	validSymbols []Symbol // 当前优先级支持的运算符类型 
    	nextPrecedence *precedence // 更高优先级的 
    	planner planner // 当前优先级的处理函数 
    }
    
  • 语法树结构

    一元运算符:左子树为空,右子树为右操作树

    二元运算符:左子树为左操作数,右子树为右操作数

    括号:左子树为空,右子树为内部表达式的 AST

  • 语法树的执行和类型检查

    • 语法树执行

      预先定义好每种操作符的执行逻辑。对抽象语法树进行后续遍历执行,即:

      先执行左子树,得到左节点的值;再执行右子树,得到有节点的值;

      最后根据根节点的操作符执行得到根节点的值。

    • 类型检查

      检查时机: 执行时检查

      检查方法: 在一个节点的左右子节点执行完成后,分别校验左右子节点的类型是否符合对应操作符的类型检查预设规则。

      '>’ 符号要求左右子节点的值都存在且为 int或float

      '!’ 符号要求左节点为空且右节点的值为 bool

    在这里插入图片描述

    4. 实现规则引擎

    字节大佬写的简易版的规则引擎,后续再出个代码解析文档。
    规则引擎

图片均来自字节青训营课程,博客作为自己学习记录,如有侵权,麻烦联系删除。

B站新一代golang规则引擎设计实现 曾经,我所在的一个在某行业属独角兽的公司,做风控,以据过规则的模式来实现风控防刷,使用java实现的drools规则引擎规则中加载了一个随机森林模型,需要取十几个指标,这些指标还是从redis中取回来的,因为drools只支持顺序执行模式,加载的所有规则都以顺序模式执行,规则内的取指标也不例外。)的时候,据就会发生严重堆积,最后经确认,就是这个加载了随机森林的规则导致的,因此,只要把随机森林这个模型规则一停,堆积瞬间消除。规则引擎选择一个优先级最高规则的最先执行,剩下的规则并发执行。 阅读详情

相关推荐

编译原理初学者入门指南

作者:pixelcao,腾讯 IEG 后台开发工程师一、引子最近的工作需要用表达式做一些参的配置,然后发现大脑一片空白,在 Google 里试了几个关键词(起初搜了下“符号引擎”,发现...

腾讯技术工程 3818

Golang中的规则引擎实现-Golang开发

Gopher掌握规则” Grule导入“ github.com/hyperjumptech/grule-rule-engine” Go规则引擎Golang编程语言规则引擎库。 受著名的JBOSS Drools的启发,完成了“ Gopher掌握规则”,Grule导入了“ github.com/hyperjumptech/grule-rule-engine”。Go的Rule Engine是Golang编程语言规则引擎库。 受到备受赞誉的JBOSS Drools的启发,该操作以非常简单的方式完成。 像Drools一样,Grule也有自己的DSL,可比性如下。 Drools的DRL就像:$ TestCar:TestCarClass(s​​peedUp == true && speed <maxSpeed)$ DistanceRecord:DistanceRecordClass()时,规则“ SpeedUp”显着性10

gengine源码解析

概要 关于gengine是干什么的,请参考B站新一代golang规则引擎设计实现 - 云+社区 - 腾讯云 本文主要通过两部分来解析gengine源码,一是介绍框架代码,理清楚该系统的架构;是以跟随实际例子,看看在编译环节和执行环节分别做了哪些工作 gengine是基于antlr4来实现编译和执行的,之前也对该工具进行过介绍,可以参考Antlr4简介_zhanglehes的专栏-CSDN博客 框架代码 RuleBuilder.go文件 RuleBuilder.go 用于从字符串中解析出具体

zhanglehes的专栏 1841

yql:Golang规则引擎的另一种查询语言

YQL(但另一个查询语言) YQLsql的where部分非常相似。 您可以将其视为另一个也支持两组比较的sql。 YQL几乎没有新概念,因此您可以在阅读示例后很短的时间内使用它。尽管它是为规则引擎设计的,但可以在您的代码逻辑中广泛使用。 安装 go get github.com/caibirdme/yql 枫树 请参见yql_test.gogodoc中的更多示例。 rawYQL := `name='deen' and age>=23 and (hobby in ('soccer', 'swim') or score>90))` result , _ := yql . Match ( rawYQL , map [ string ] interface {}{ "name" : "deen" , "age" : int64 ( 23 ), "hobby" : "

Gengine规则引擎

最近对B站开源的gengine规则引擎进行了入门级的研究。现在整理的资料记录如下。(欢迎交流讨论) 原博客地址:https://www.cnblogs.com/feixiang-energy/p/15572292.html 一:简介:   Gengine是一款基于golang和AST(抽象语法)开发的规则引擎, Gengine支持的语法是一种自定义的DSL, Gengine通过内置的解释器对规则文件进行解析,构建规则模型,进行相应的规则计算和据处理。Gengine于2020年7月由哔哩哔哩(bi.

hellozhxy的博客 4287

golang 规则引擎gengine

gengine支持的语法,是完整的DSL语法(也可以当作是一门完整的语言),gengine规则执行出错时,gengine会指出具体的出错在哪一行.尽量帮助用户在使用gengine的每一个流程细节上,都有丝滑体验。在规则体中使用@id含义是,如果当前的规则名是可以转化为整的字符串,则@id就是规则名的整值,如果规则名字符串不可转化为整,则@id的值为0.这个是为了方便用户以规则名作为整型参规则内定义的变量,只对当前规则可见,对其他规则不可见(局部变量)@name 主要是获取规则的名字的。

a...Z 1624

Gengine:基于Golang的高性能规则引擎

**Gengine**是一款基于AST(抽象语法树)和Golang语言实现规则引擎,专为动态化加载框架设计。它能够在不停服务的情况下,实现规则的动态加载配置,为Golang开发者提供了一种高效、灵活的解决方案。Gengine不仅支持多种执行模式,还具备规则池功能,能够满足各种复杂的业务场景需求。 ## 项目技术分析 Gengine的核心技术在于其基于AST的规则解析和执行机制。通过将规则语...

gitblog_00718的博客 1237

【亲测免费】 掌握规则Go语言中的Grule引擎

![Gopher持有规则](https://github.com/hyperjumptech/grule-rule-engine/blob/master/gopher-grule.png?raw=true) Grule-Rule-Engine是一个专为GoGolang设计规则引擎库,灵感来源于知名的JBOSS Drools,但以更为简洁的方式实现。它拥有自己的领域特定语言(DSL),即Gr...

gitblog_00028的博客 1567

规则引擎go

嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。作为开发人员会遇到需求变动的情况,比如if a >b then c改成 if a < b then c又要改成 if a

哇哦~ 1415

golang规则引擎-expr

Expr是一个语法解析器,可以便捷的解析一些语法并获取结果。

慢行的蜗牛 1742

GoRules:Go的业务规则引擎

Switch 节点有效地管理图中的分支,增强 GoRules JDM 中决策模型的整体复杂性和现实性,使其成为构建智能和自适应系统的关键组件。相关的所有据的入口,而输出节点则产生决策过程的结果。据的传输遵循从输入节点到输出节点的路径,遍历其间所有互连的节点。当决策表中的一行满足其指定条件时,输出列确定将返回的信息的性质和结构。每个输出列代表一个不同的字段,这些字段的集合形成已验证行关联的输出或结果。表格提供了决策过程的结构化表示,允许开发人员和业务用户以清晰简洁的方式表达复杂的规则

极道Jdon的技术博客 2506

Golang规则引擎 Gengine

本文介绍了规则引擎的概念及其在电商行业中的应用,重点讲解了基于Go语言的Gengine规则引擎。文章首先通过价格计算示例说明规则引擎如何将业务逻辑从代码中抽离,实现动态配置。然后详细介绍了Gengine的使用方法,包括规则定义语法、API调用流程和实际应用场景。Gengine通过抽象语法树将规则转换为可执行代码,支持动态加载。文章最后推荐了两个功能更强大的替代库。这种技术方案特别适合需要频繁修改业务规则的场景,如电商促销和风控系统。

坚持做正确的事情! 723

Go轻量级表达式执行引擎

注:go语言中用法不同或者增加的都予以注明三元操作符:?(其他语言中用法一致, eg:逻辑表达式?表达式1 : 表达式2)(注意表达式1表达式2的执行结果类型可以不同)元操作符:逻辑操作符:||&&比较操作符:==!<=>=in(可以类比sql中的in, 用法例子: 1 in [1, 2, 3],其将返回true)运算操作符:**()位运算操作符:(按位异或,注意在引擎中其不能作为按位取反, 按位取反为)、&^<<>>一元操作符:++--

qq_45091883的博客 1311

golang实现一个规则引擎,功能包括实时增加、修改、删除规则

本文介绍了一个用Go实现的轻量级规则引擎,核心功能包括:1) 支持实时增删改规则;2) 基于条件函评估触发动作;3) 使用读写锁保证并发安全。引擎采用map存储规则,通过Data类型传递上下文据,并提供了规则执行的基本流程。文章还提出了扩展方向(如优先级、持久化)和优化建议(索引、并行执行)。示例代码展示了温度监控场景的应用,演示了规则管理全流程。该实现简洁高效,适合需要灵活规则管理的应用场景。

weixin_42738495的博客 207

详解golang的Gengine规则引擎

Gengine是一款基于golang和AST(抽象语法)开发的规则引擎, Gengine支持的语法是一种自定义的DSL, Gengine通过内置的解释器对规则文件进行解析,构建规则模型,进行相应的规则计算和据处理。Gengine于2020年7月由哔哩哔哩(bilibili.com)授权开源。Gengine现已应用于B站风控系统、流量投放系统、AB测试、推荐平台系统等多个业务场景。官网上给出的Gengine相比于Java领域的著名规则引擎drools优势如下:对比droolsgengine。

JineD的博客 760

Grule-Rule-Engine:基于Go语言规则引擎

Grule-Rule-Engine 是一个基于 Go 语言的开源项目,其目的是实现一个功能强大的规则引擎。该项目受到了业界知名的 JBOSS Drools 的启发,但以更加简洁的方式实现。Grule 提供了自己的领域特定语言(DSL),使得规则的定义更加直观和易于理解。 ## 2. 核心功能 Grule-Rule-Engine 的核心功能是作为一个生产规则系统(Production Rule ...

gitblog_00277的博客 744

RuleGo:基于go的轻量级规则引擎

RuleGo是一款基于Go语言开发的轻量级、高性能、嵌入式组件编排规则引擎。它不仅能帮你轻松应对物联网的复杂场景,还能作为“胶水”连接各种系统和协议,处理你的据流、自动化流程等业务逻辑需求。用简单的话说,RuleGo就像是一个为物联网场景量身定做的“瑞士军刀”,小巧而多功能。​RuleGo是一款极具潜力的规则引擎,不仅轻量高效,还能灵活应对物联网的各种复杂场景。如果你正在寻找一个可靠的规则引擎来管理你的物联网项目,RuleGo绝对值得一试。

brizer的博客 2603
上一篇: Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解
下一篇: Go 语言进阶(三) -- 后端架构基础概念 架构发展 SOA(面向服务架构)、微服务架构、云计算、微服务服务治理
异已
博客等级 码龄8年 4粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值