导航

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

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

        Ctors
Ctors

        
is 'a' methodsis 'a' methods

        Math functions
Math functions

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

        Properties
Properties

        Delegates and events
Delegates and events

        Ctors
Ctors

        Trigger Management
Trigger Management

        Variable management
Variable management

        Run Rules
Run Rules

        Inference Methods
Inference Methods

        Expression Evaluation
Expression Evaluation

        Trigger methods
Trigger methods

        List management
List management

        Indexer
Indexer

        Find and Sort
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需求。