Udostępnij za pośrednictwem


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::ParseTexttworzy wystąpienie ewaluatora wyrażeń (EE) i wywołuje metodę Parse, aby uzyskać obiekt IDebugParsedExpression.

Program IDebugExpressionEvaluator::Parse wykonuje następujące zadania:

  1. [Tylko C++ ] Analizuje wyrażenie, aby wyszukać błędy.

  2. Tworzy wystąpienie klasy (nazywanej CParsedExpression w tym przykładzie), która uruchamia IDebugParsedExpression interfejs i przechowuje w klasie wyrażenie do przeanalizowania.

  3. IDebugParsedExpression Zwraca interfejs z CParsedExpression 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;
}

Zobacz też