这是我参与「第五届青训营」伴学笔记活动的第六天,今天了解到了词语法分析,和一些规则引擎设计的基础
组成
根据业务规则做出业务决策,使用预定义的语义模块编写业
词法分析
词法分析将源代码字符串转换为词法单元。基于状态机依次遍历表达式并根据输入的的字符进行状态转换最后输出一系列token以供下一阶段使用。
语法分析
(1)上下文无关语法 语言无需考虑上下文即可判断正确性,可以使用BNF表达,对于产生式需要由另外已知类型的表达式或者符号推导。
(2)递归下降算法 不断递归直到识别到内置符。逻辑语>比较表达式>加>乘>基础表达式。最终会构成一棵语法树,并对语法树进行后续遍历执行
(3)类型检查 根据子表达式构造父表达式类型。可以通过提前声明在语法树构建造中完成,也可以在执行中根据具体值检查。 需要首先定义扫描器
type Scanner struct{
xxxx []run //规表达式字符串
xxxx int // 遍历规则表达式中的位置
xxx int // 长度用来判断扫描是否结束
xxx rune // 位置对应的字符
接下来是词法分析
for {
tok,err=scanner.Scan()
tokens=append(tokens,tok)
if err!=ni|| tok.Kind==token.Eof{
break}
}
skipWhitespce跳过空白字符。
设计引擎
包括token,数据类型,运算符,数据类型,优先级。一般选择执行时检查。!符号需要左节点为bool类型。
type precedence struct{
xxxx []Symbol //当前优先级类型
xxxx *precedence//更高级别
xxxx planner//当前级别函数
总结
今天浅层了解了规则引擎,主要学习了词法分析,语法分析,尔规则引擎也是主要基于此构造语法树来实现。