平臺中內嵌了 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')
後續設計思想:用樹圖形式顯示編寫的表達式的分解結果,當點擊任意節點時,可察看此節點表達式的運行情況(返回值,或錯誤詳細信息);
也可一次性從上下到運行所有節點的表達式,而後輸出每個節點的運行情況。