如何在编译器中解析阶段与规则引擎不同?

时间:2010-05-06 08:22:47

标签: parsing compiler-construction rule-engine

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

谢谢, 阿比纳夫。

1 个答案:

答案 0 :(得分:3)

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

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

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

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