规则引擎设计与实现(二) | 青训营

62 阅读2分钟

那我们书接上回

juejin.cn/post/719481…

接下来是编译原理和设计规则引擎的部分

  • 词法分析

就是将源代码字符串转化为词法单元(Token)的过程

那么,如何去识别token呢 如何识别Token 就要通过有限自动机(Finite-State Automaton)了,那这有限自动机又是何方神圣?

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

  • 语法分析

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

表达式的语法结构可以用树来表示,,其每个节点(子树)是一个语法单元,这个单元的构成规则就叫“语法”。每个节点还可以有下级节点。那,问题来了,怎么得到这个树的结构呢? 对于 上下文无关语法 (Context-Free Grammar) ,由于语言句子无需考虑上下文,就可以判断正确性。可以使用巴科斯范式(BNF)来表达。我们所了解的产生式的定义是这样的一个表达式可以由另外已知类型的表达式或者符号推导产生 eg.内置符号:字面量(string、bool、number)标识符、运算符 一个基础表达式可以由常量(string、bool、number)或标识符(identifier)S个乘法表达式可以由基础表达式或者乘法表达式基础表达式组成,可以放一些运算符的优先级信息进去。

image.png

那么如何根据巴科斯范式(BNF)去生成Token呢

递归下降算法(Recursive Descent Parsing) 会自顶向下构造语法树,不断对Token进行语法展开,展开过程中可能会遇到递归的情况。

image.png

执行的时候要做类型检查,防止一些低级错误,但是不同的语言有不同的规则,所以会出现不同的情况

设计一个规则引擎

从零开始设计一个规则引擎YoungEngine,明确其对词法、语法的支持,设计编译和执行的流程。
  • 设计目标

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

    • 词法,运算符,类型,优先级

    • 语法分析 -- 优先级

实现规则引擎

暂未实现