Przykładowa implementacja oceny wyrażeń
Ważne
W programie Visual Studio 2015 ten sposób implementowania ewaluatorów wyrażeń jest przestarzały. Aby uzyskać informacje na temat implementowania ewaluatorów wyrażeń CLR, zobacz CLR expression evaluators and Managed expression evaluator Sample (Przykład ewaluatora wyrażeń zarządzanych).
W przypadku wyrażenia okna watch program Visual Studio wywołuje metodę ParseText w celu utworzenia obiektu IDebugExpression2. IDebugExpressionContext2::ParseText
tworzy wystąpienie ewaluatora wyrażeń (EE) i wywołuje metodę Parse, aby uzyskać obiekt IDebugParsedExpression.
Program IDebugExpressionEvaluator::Parse
wykonuje następujące zadania:
[Tylko C++ ] Analizuje wyrażenie, aby wyszukać błędy.
Tworzy wystąpienie klasy (nazywanej
CParsedExpression
w tym przykładzie), która uruchamiaIDebugParsedExpression
interfejs i przechowuje w klasie wyrażenie do przeanalizowania.IDebugParsedExpression
Zwraca interfejs zCParsedExpression
obiektu .
Uwaga
W poniższych przykładach i w przykładzie MyCEE ewaluator wyrażeń nie oddziela analizy od oceny.
Kod zarządzany
Poniższy kod przedstawia implementację kodu zarządzanego IDebugExpressionEvaluator::Parse
. Ta wersja metody wyzywuje analizowanie wartości EvaluateSync jako kodu do analizowania jest również obliczane w tym samym czasie (zobacz Ocena wyrażenia zegarka).
namespace EEMC
{
public class CParsedExpression : IDebugParsedExpression
{
public HRESULT Parse(
string expression,
uint parseFlags,
uint radix,
out string errorMessage,
out uint errorPosition,
out IDebugParsedExpression parsedExpression)
{
errorMessage = "";
errorPosition = 0;
parsedExpression =
new CParsedExpression(parseFlags, radix, expression);
return COM.S_OK;
}
}
}
Niezarządzany kod
Poniższy kod jest implementacją IDebugExpressionEvaluator::Parse
kodu niezarządzanego. Ta metoda wywołuje funkcję pomocnika, Parse
, aby przeanalizować wyrażenie i sprawdzić błędy, ale ta metoda ignoruje wynikową wartość. Formalna ocena jest odroczona do funkcji EvaluateSync , gdzie wyrażenie jest analizowane podczas jego obliczania (zobacz Ocena wyrażenia zegarka).
STDMETHODIMP CExpressionEvaluator::Parse(
in LPCOLESTR pszExpression,
in PARSEFLAGS flags,
in UINT radix,
out BSTR *pbstrErrorMessages,
inout UINT *perrorCount,
out IDebugParsedExpression **ppparsedExpression
)
{
if (pbstrErrorMessages == NULL)
return E_INVALIDARG;
else
*pbstrErrormessages = 0;
if (pparsedExpression == NULL)
return E_INVALIDARG;
else
*pparsedExpression = 0;
if (perrorCount == NULL)
return E_INVALIDARG;
HRESULT hr;
// Look for errors in the expression but ignore results
hr = ::Parse( pszExpression, pbstrErrorMessages );
if (hr != S_OK)
return hr;
CParsedExpression* pparsedExpr = new CParsedExpression( radix, flags, pszExpression );
if (!pparsedExpr)
return E_OUTOFMEMORY;
hr = pparsedExpr->QueryInterface( IID_IDebugParsedExpression,
reinterpret_cast<void**>(ppparsedExpression) );
pparsedExpr->Release();
return hr;
}