分解複雜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')

 

 

後續設計思想:用樹圖形式顯示編寫的表達式的分解結果,當點擊任意節點時,可察看此節點表達式的運行情況(返回值,或錯誤詳細信息);

也可一次性從上下到運行所有節點的表達式,而後輸出每個節點的運行情況。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章