• 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的部分了。

  • 相关阅读:
    江西财经大学第一届程序设计竞赛 F题 -解方程
    HDU2553 N皇后问题
    2018年长沙理工大学第十三届程序设计竞赛 G 题:逃离迷宫
    Codeforces #475 div2
    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 L题 K序列
    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 I题 二数
    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F题 1+2=3 ?
    埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 Wasserstein Distance
    hdu 5685
    hdu 5512 Pagodas
  • 原文地址:https://www.cnblogs.com/jason0529/p/13731782.html
Copyright © 2020-2023  润新知