zoukankan      html  css  js  c++  java
  • Urule开源版系列5——RuleSetParser解析过程

    接上期Urule开源版系列4——Core包核心接口之规则解析过程

    之前源码到了Parser,这期详细解析下RuleSetParser的解析过程

    1.主流程

    1. 特殊处理一个属性
    2. 循环处理元素
    3. 当元素名称是规则时,调用ruleParser
    4. 当元素名称是循环规则时,调用loopRuleParser
    5. 当元素名称时import-variable-library时,添加变量库
    6. 当元素名称时import-constant-library时,添加常数库
    7. 当元素名称时import-action-library时,添加动作数库
    8. 当元素名称时import-parameter-library时,添加参数库
    9. 当元素名称时remark时,设置备注信息
    10. 调用RulesRebuilder.rebuildRules 重构所有的规则
      上面的流程意味着如果要增加一类库文件,RuleSetParser必需配合进行修改。

    1.1 RuleParser.parse

    这个方法其实没有任何逻辑,处理逻辑直接交给了抽象类的方法-parseRule

    1.2 AbstractRuleParser.parseRule

    这个方法有点长,大概有60行左右,但逻辑就是两大段

    1. 处理属性,处理各个属性赋值给Rule对象实例
    2. 循环处理if then else 分布交给对应的parse去处理

    1.2.1 LhsParser.parse

    双重遍历,外层迭代元素,内层迭代处理器,总共有三个处理器可选:JunctionParser(and or ) , NamedJunctionParser(),CriteriaParser(atom 原子条件)

    JunctionParser NamedJunctionParser CriteriaParser
    名称 条件处理器 原子条件处理器
    符号 and or named-atom atom op="In"

    注意:属性op即表达了操作符,in , > < = 等逻辑
    接下来分别调用三个parse方法分别处理

    criterionParsers=applicationContext.getBeansOfType(CriterionParser.class).values();
    
    1.2.1.1 JunctionParser.parse 为例
    1. 递归调用CriterionParser.parseCriterion 方法,处理元素递归解析
    2. 处理and or 问题
    1.2.1.2 CriterionParser.parseCriterion

    递归核心,部分逻辑同LhsParser.parse , 递归element子元素,调用CriterionParser 接口去解析,再度回归

    for(Object obj:element.elements()){
        for(CriterionParser parser:criterionParsers){
            if(parser.support(name)){
                Criterion criterion=parser.parse(ele);
            }
        }
    }
    
    1.2.1.3 CriteriaParser.parse

    到了这个解析器,意味着递归到了结束,下面不再需要递归的子元素,分别处理left , value两个标签,获取到比较的数据对象。这里不在单独解析LeftParser 和 ValueParser 的处理逻辑。

    <atom op="In">
        <left var-category="姓名" var="properties" var-label="属性" datatype="List" type="variable"></left>
        <value content="a,b" type="Input"></value>
    </atom>
    

    1.2.2 RhsParser.parse

    与LhsParser不同的时,Rhs解析的是动作,所以注入的解析器从 CriterionParser 变成了 ActionParser

    actionParsers=context.getBeansOfType(ActionParser.class).values();
    

    ActionParser有4个实现类

    CommonFunctionActionParser ConsolePrintActionParser ExecuteMethodActionParser VariableAssignActionParser
    名称 函数动作 控制台 方法 变量赋值
    标记 execute-function console-print execute-method var-assign

    ActionParser不需要处理递归问题

    1.2.3 OtherParser.parse

    逻辑同RhsParser

    总结

    xml解析到规则对象的流程基本完成,下一步重点整理rebuildRule流程,应该会是大量调用antlr的部分了。

  • 相关阅读:
    家庭记账本开发进度6
    家庭记账本开发进度5
    家庭记账本开发进度4
    家庭记账本开发笔记3
    大道至简阅读笔记01
    个人作业 数组(续)
    二维数组
    个人作业1-数组
    软件工程第一周开课微博
    第一周学习进度条报告
  • 原文地址:https://www.cnblogs.com/jason0529/p/13731782.html
Copyright © 2011-2022 走看看