4

我对编译器的工作方式有一个粗略的了解(我的意思是语言、语法、词法分析、解析等)。规则引擎有各种规则和相关的动作,就像你在语法中有规则一样,你可以在像 ANTLR 这样的解析器生成器工具中将动作与它们相关联。所以我对如何区分这两者有点困惑。任何人都可以对差异给出更清晰,更正式的解释吗?

谢谢,阿比纳夫。

4

1 回答 1

4

规则引擎有一个事实数据库,以及一组可以检查数据库元素并修改、插入或删除事实的规则。通常,数据库由一组标记结构(T V1 V2 ... Vn)组成,每个结构都有不同类型的值 V_i。规则通常是一种模式,指定如果某些结构实例集具有属性[这些结构的值的某些条件,这可能是合取的或析取的],则匹配结构之一的一个或多个值被更改,或者删除匹配的结构,或者插入带有一些计算值集的新结构。一个非常复杂的规则引擎将规则视为这样的结构,因此也可以插入和删除规则,但这很不寻常。规则引擎(有效地,这是困难的部分)确定哪一组规则可以随时匹配,选择一个并重复执行它。这个想法的价值在于,一个人可以拥有一个大致独立的任意“事实”桶(每个都由标记的结构表示),以及一组类似独立的规则,并将它们以统一的方式汇集在一起​​​​。希望可以很容易地定义代表世界各个方面的结构,并且更容易定义规则来操纵它们。这是一种编码大量不同知识的方式,这就是“商业”人士喜欢它们的原因。(这个想法来自人工智能世界)。(每个由标记结构表示)大致独立,以及一组同样独立的规则,并将它们以统一的方式汇集在一起​​​​。希望可以很容易地定义代表世界各个方面的结构,并且更容易定义规则来操纵它们。这是一种编码大量不同知识的方式,这就是“商业”人士喜欢它们的原因。(这个想法来自人工智能世界)。(每个由标记结构表示)大致独立,以及一组同样独立的规则,并将它们以统一的方式汇集在一起​​​​。希望可以很容易地定义代表世界各个方面的结构,并且更容易定义规则来操纵它们。这是一种编码大量不同知识的方式,这就是“商业”人士喜欢它们的原因。(这个想法来自人工智能世界)。

编译器解析器有两个任务纠缠在一个活动中:1)确定文本输入流(分解为语言标记)是否是特定编程语言的合法实例,以及 2)如果是,则构建编译器数据结构(通常是抽象语法树和符号表)表示程序,以便编译器的其余部分可以生成代码。编译器人员花费了大约 50 年的时间来研究如何快速完成这项工作,并使用非常专业的算法(例如具有每个语法规则的自定义编码操作的 LALR 解析器生成器)来完成工作。

可以说,可以使用规则引擎实现编译器解析器;您需要一个由令牌流组成的数据类型,以及与 AST 节点和符号表条目相对应的其他数据类型。编写解析器可能会更难,并且不太可能接近编译器解析器的速度,这就是为什么没有人这样做。

您不能使用编译器解析器来实现规则引擎,句号。因此,规则引擎严格来说更强大。

于 2010-05-06T08:50:43.207 回答