分解复杂IronPython表达式为简单表达式

    平台中内嵌了 IronPython,需求希望产品在运行或设计时,高级或设计人员可察看表达式各个部分执行的结果,有助于排错,或察看运行结果是否是想要的。

   

    思路:复杂表达式可分解为多个较简单的表达式,较简单的表达又可分解为简单表达式,直到不能分解为止。因此,可以把分解的结果以树结构形式显示:较简单表达式是复杂表达的子节点,简单表达式又是较简单表达式的子节点,。。。。

 

    为了实现上面的需求,用到了 IronPython中的语法分析类 PythonWalker,先从PythonWalke继承进行表达式分解处理,处理比较简单,override 三个方法,这三个方法中调用同一个处理方法实现,这里只是演示,很简单的处理,用缩进空格来表示级别,更复杂的要靠自己了。

处理类代码如下:

 

 

然后调用:

 

 

测试示例:

 

第一个表达式:

context.c.max(1,cont.min(45,23)).sub(23) + min(2,max(3, unique('ActiveObject.TC001'))) + IIF(2<1,1,2) + (3 if 3>2 else 2 if 4>3 else 5)

 

输出结果:

  context.c.max(1,cont.min(45,23)).sub(23) + min(2,max(3, unique('ActiveObject.TC001'))) + IIF(2<1,1,2)

    context.c.max(1,cont.min(45,23)).sub(23) + min(2,max(3, unique('ActiveObject.TC001')))

      context.c.max(1,cont.min(45,23)).sub(23)

        context.c.max(1,cont.min(45,23))

          cont.min(45,23)

      min(2,max(3, unique('ActiveObject.TC001')))

        max(3, unique('ActiveObject.TC001'))

          unique('ActiveObject.TC001')

    IIF(2<1,1,2)

      2<1

  3 if 3>2 else 2 if 4>3 else 5

    3>2

    2 if 4>3 else 5

      4>3

 

第二个表达式:

'MMDD'.rjust(ActiveObject.MQ005+4, 'Y').ljust(ActiveObject.MQ005+4+ActiveObject.MQ006, '9') if ActiveObject.MQ004 == 1 else ('MM'.rjust(ActiveObject.MQ005+2, 'Y').ljust(ActiveObject.MQ005+2+ActiveObject.MQ006, '9') if ActiveObject.MQ004 == 2 else ''.ljust(ActiveObject.MQ006, '9'))

 

输出结果:

  ActiveObject.MQ004 == 1

  'MMDD'.rjust(ActiveObject.MQ005+4, 'Y').ljust(ActiveObject.MQ005+4+ActiveObject.MQ006, '9')

    'MMDD'.rjust(ActiveObject.MQ005+4, 'Y')

      ActiveObject.MQ005+4

    ActiveObject.MQ005+4+ActiveObject.MQ006

      ActiveObject.MQ005+4

  'MM'.rjust(ActiveObject.MQ005+2, 'Y').ljust(ActiveObject.MQ005+2+ActiveObject.MQ006, '9') if ActiveObject.MQ004 == 2 else ''.ljust(ActiveObject.MQ006, '9')

    ActiveObject.MQ004 == 2

    'MM'.rjust(ActiveObject.MQ005+2, 'Y').ljust(ActiveObject.MQ005+2+ActiveObject.MQ006, '9')

      'MM'.rjust(ActiveObject.MQ005+2, 'Y')

        ActiveObject.MQ005+2

      ActiveObject.MQ005+2+ActiveObject.MQ006

        ActiveObject.MQ005+2

    ''.ljust(ActiveObject.MQ006, '9')

 

 

后续设计思想:用树图形式显示编写的表达式的分解结果,当点击任意节点时,可察看此节点表达式的运行情况(返回值,或错误详细信息);

也可一次性从上下到运行所有节点的表达式,而后输出每个节点的运行情况。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值