我正在使用Reflection.Emit構建數學表達式分析器(例如2+2
)。一個類採用中綴表達式(例如2+2
),將其轉換爲後綴表達式(例如2 2 +
),然後另一個類將該後綴表達式編譯爲IL並創建一個DynamicMethod
。從那裏,可以評估表達式,就好像它是在編譯時創建的一樣,具有相似的速度。使用Reflection調用使用MethodInfo實例的方法。使用Reflection.Emit
該編譯器也支持隱式乘法,所以像x(2 + 2)
目前計算爲x * (2 + 2)
,我試圖實現用戶自定義函數(例如f(x)
)。當我試圖區分隱式乘法(如上所示)和用戶定義的函數時,會出現問題。例如,如果用戶輸入x(5)
,我如何知道他們是否要將x
乘以5
,或者調用x
函數的參數爲5
?
爲了解決這個問題,在前面的例子中,編譯器在IL流中插入if
語句。它調用一個函數來確定函數是否以x
的標識符定義。如果有的話,它會通過out
變量和本地值將一個MethodInfo
實例插入堆棧。
我的實際問題是,是否有可能執行一個方法使用堆棧上的MethodInfo
實例在編譯過程中等價於調用IlGenerator.Emit(OpCodes.Call, MethodInfo)
?
謝謝。
設計建議:使乘法明確,或具有不同的函數調用語法。含糊不清的語法導致錯誤/難以識別用戶錯誤。你知道標準的算術符號很糟糕,或者你不會轉換爲後綴,這是其中一個原因:) – 2010-08-20 03:27:57