规则引擎设计与实现注意点 | 青训营笔记

49 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天

这篇文章主要是收集了笔者在学习今天的课程,在学习了一些golang的规则引擎设计与实现课程后,总结了一些注意点。

规则引擎设计与实现注意点

编译型语言和解释性语言

编译就是把一份代码从源程序的形式转换为其他语言程序。

可以对代码一边执行一边编译的语言就是编译型语言;对代码只能编译后才能执行的就是解释型语言。

编译型语言的代表有:Java、Python、Javascript。

解释型语言的代表有:C++、C、Go。

词法分析

DFA(确定的有限自动机)介绍

在有限自动机的表示中,有外部箭头射入的为初态,加粗或有两层圈的为终态。

当自动机中出现死循环(即可不断地加上某字符)时,则该自动机为不确定的;否则则为确定的。

判断有限自动机能否跑某字符串,只需要把该有限自动机看成类似一棵trie即可,看看字符串能不能正常从初态跑到终态即可。而要确定该自动机可以确定的所有字符串,则应该使用遍历算法,逐一确定每个节点,最终得到所有情况。

语法分析

词法分析解决词语的识别问题,而语法分析则是判断这个语句的正确性是否出现偏差。语法分析的一个重要特点就是:上下文无关——即一条语句是否正确与这条语句周围的其他语句是否正确无关,它的正确性是完全由本身决定的。

为了语法分析执行的效率以及确保机器编译代码时的正确性,这个重要特点是一定要保证的。

语法分析树例题:

image-20221025232119843.png 对于句型aabAa,由于根是S(默认),故分析,应构造:

S=aAS;————对应,建一棵树,第一层根为S,第二层三个子节点为a、A、S。

再通过对比目标aabAa,发现应将A转换为abA,S转换为a;

故先将A先转换为SbA,再考虑转换为abA,而S可以直接转换为a;————对应,第二层的A的第三层子节点S、b、A,第二层S的子节点a。

再将SbA的S转换为a,就可以得到abA,最终得到目标句型aabAa。————对应,第三层子节点S的第四层子节点a,整棵语法推导树构建完成。