导航

.net XML引擎驱动事件概述(二)

Posted on 2006-09-11 13:21  Phono  阅读(176)  评论(0编辑  收藏  举报
这次说解析器,像所有最基础的操作一样,解析器的最终目的是为了返回需要的值,而通过读取配置文件到引擎而获得的这些数据还不能马上用于操作,通过解析器内部的  方法集,返回对类型的判断,或对四则运算的命令作出相应,这里要说一说优先度的问题,按照优先度的由低到高依次调用调用,如:在加减法方法中调用乘方法,在乘方方法中调用成除运算,而后是正负符号运算,括号预算,每种方法中都会带一个默认为的”0”的参数,如果当真有操作,这个零值就会被替代,再巧妙的运用任何数的0次方都是1来避免除零的出现的同时,类似递归的把所有运算操作都完成了一遍。解析器这里起个专业名叫表达式状态机。
    public class ExpressionMachine
    
{
        
Instance data members

        
Ctors

        
is 'a' methods

        
Math functions

        
Evaluation functions
说到这里外围的这些都已经介绍到了,现在就来看看核心的构造吧
    [Serializable]
    
public class RulesEngine: CollectionBase
    
{
        
Instance data members

        
Properties

        
Delegates and events

        
Ctors

        
Trigger Management

        
Variable management

        
Run Rules

        
Inference Methods

        
Expression Evaluation

        
Trigger methods

        
List management

        
Indexer

        
Find and Sort
    }

}

在其中Trigger Management,Variable management用来获取相应的触发器和变量,而所有的RUNRULE方法最后都落实到了  private void RunRule(RuleObject oRule)这个方法上来,该方法被调用时应该已经确认了触发器,变量等RULE的组成部分都没有逻辑上的错误,这个方法首先会把RULE中含有表达式的成分进行解析,然后再循环对所有的ACTION进行遍历,按照ACTION的类型作出相应的处理,如果这个ACTION是一个驱动RULE运行的话我们就必须要知道对应的RULE ID来调用,如果是嵌套的情况还要递归调用RUNRULE方法,一个运行时中在引擎内部只有ID是被唯一识别的,管理好几大重要类型的ID体系是很重要的,这种管理包括新增,识别,判重,修改和删除。在这种需求的前提下LIST比堆栈更灵活可靠。当然,为了判断该RULE已经完成作业,引擎会给出一个事件public event RuleCompleteDelegate RuleComplete;并在完成的时候调用它,这样,我们就可以在实际程序中重写这个事件,来满足日志,跳转,状态转换等UI需求。