我是C#的新手,并且最近了解到可以发出IL来实现一个简单的评估堆栈:
stack [ B C * A + ] ==> push B, push C, DO MULT, push A, DO ADD, POP return value
this example arises from the string "A + ( B * C )"
有人可以提供基本操作的一些建议和/或示例IL片段 - 即推送1,2或3个双精度并调用它们上的一元,二元或三元函数或算术运算符。
您的建议可能包括发射IL是否是一个好主意。表达式是蒙特卡罗模拟的假设 - 因此有充分的理由考虑加速它们,但如果它被视为可行但不安全,我不想这样做。
答案 0 :(得分:1)
有关如何执行此操作的详细说明,请参阅http://msdn.microsoft.com/en-us/library/exczf7b9.aspx。非常好的评论&写得很好。
答案 1 :(得分:0)
如果您正在进行解析以提取表达式中的操作数和运算符,为什么不调用特定函数来执行各种操作?它比发射和发射更简单。即时编译IL。举个例子,你可以这样做:
MyStack<object> m_oStack = new MyStack<object> ();
double Add () // takes 2 params from stack
{
return ( m_oStack.Pop () + m_oStack.Pop () );
}
double Multiply () // takes 2 params from stack
{
return ( m_oStack.Pop () * m_oStack.Pop () );
}
// during evaluating the expression:
... // parse
m_oStack.Push ( fB );
... // parse
m_oStack.Push ( fC );
... // parse
m_oStack.Push ( Multiply () );
... // parse
m_oParamStack.Push ( fA );
... // parse
m_oParamStack.Push ( Add () );
// you're done with evaluating the expression, the result is
// on top of the stack
因此,当您评估表达式的各个部分时,只需将值保存在堆栈中,并在解析各个子表达式时调用自己的函数。
这一切都可以通过发射IL来实现,但它会变得更加复杂,因为你仍然需要进行所有的解析,管理所有的输入参数等,但最重要的是,你还必须发出IL然后在运行中执行它。