2010-05-06 40 views
4

我对编译器的工作原理有粗略的理解(我的意思是语言,语法,词法分析,解析等)。规则引擎具有各种规则和相关的操作,就像您在语法中有规则一样,您可以在解析器生成器工具(如ANTLR)中将操作与它们关联起来。所以我对如何区分这两者有点困惑。谁能给出一个更明确,更正式的解释差异?在编译器中如何解析阶段与规则引擎不同?

谢谢, Abhinav。

+0

目前还不清楚你的问题中“规则引擎”的含义。你能详细说明一下吗? – 2010-05-06 08:33:37

+0

通过规则引擎我的意思是这样的:http://en.wikipedia.org/wiki/Business_rules_engine ...一个例子http://java-source.net/open-source/rule-engines – abhinav 2010-05-06 08:37:47

回答

3

规则引擎有一个事实数据库和一组可以检查数据库元素并修改,插入或删除事实的规则。通常,数据库由相当于一组标记结构(T V1 V2 ... Vn)组成,每个标记结构具有不同类型的值V_i。规则通常是一种模式,规定如果一组结构实例具有属性[对这些结构的值有一些条件,这可能是连接的或分离的],一个或多个匹配结构的值被改变,或者删除一个匹配的结构,或者插入一个具有一些计算出来的值的新结构。一个非常复杂的规则引擎将规则视为这种结构,因此也可以插入和删除规则,但这非常不寻常。规则引擎(有效,而这是困难的部分)确定哪一组规则可以在任何时刻匹配,选择一个并反复执行。这个想法的价值在于,可以有一个任意的“事实”桶(每个都用标记结构表示),它们大致是独立的,还有一组类似的独立规则,并将它们统一地集中在一起。希望定义代表世界各个方面的结构很容易,并且更容易定义规则来操纵它们。这是一种编码大量不同知识的方式,这就是为什么“业务”人喜欢他们。 (这个想法来自AI世界)。

编译器解析器有两个任务纠缠在一个活动中:1)决定输入的文本流(分解为语言标记)是否是特定编程语言的合法实例; 2)如果是,则构造编译器数据结构通常是抽象语法树和符号表),它们代表程序,以便编译器的其余部分可以生成代码。编译器人员花了大约50年的时间研究如何快速实现这一目标,并使用非常专业的算法(例如LALR解析器生成器,每个语法规则使用定制编码操作)来完成工作。我们可以用一个规则引擎来实现一个编译器 - 解析器,您需要一个由令牌流组成的数据类型以及与AST节点和符号表条目相对应的其他数据类型。编码解析器可能会比较困难,并且不太可能接近编译器解析器的速度,这就是为什么没有人这样做。

您不能使用编译器解析器来实现规则引擎句点。所以,规则引擎更加强大。

+0

谢谢,艾拉。这是一个非常全面和明确的答案,它清除了我的怀疑:) – abhinav 2010-05-06 10:34:54