Condividi tramite


Implementazione di esempio della valutazione delle espressioni

Importante

In Visual Studio 2015 questo modo di implementare gli analizzatori di espressioni è deprecato. Per informazioni sull'implementazione degli analizzatori di espressioni CLR, vedere Esempio di analizzatori di espressioni CLR e analizzatore di espressioni gestite.

Per un'espressione di finestra Espressione di controllo, Visual Studio chiama ParseText per produrre un oggetto IDebugExpression2 . IDebugExpressionContext2::ParseTextcrea un'istanza di un analizzatore di espressioni (edizione Enterprise) e chiama Parse per ottenere un oggetto IDebugParsedExpression.

Esegue IDebugExpressionEvaluator::Parse le attività seguenti:

  1. [solo C++] Analizza l'espressione per cercare gli errori.

  2. Crea un'istanza di una classe (chiamata CParsedExpression in questo esempio) che esegue l'interfaccia IDebugParsedExpression e archivia nella classe l'espressione da analizzare.

  3. Restituisce l'interfaccia IDebugParsedExpression dall'oggetto CParsedExpression .

Nota

Negli esempi seguenti e nell'esempio MyC edizione Enterprise l'analizzatore di espressioni non separa l'analisi dalla valutazione.

Codice gestito

Il codice seguente illustra un'implementazione di IDebugExpressionEvaluator::Parse nel codice gestito. Questa versione del metodo rinvia l'analisi a EvaluateSync come codice per l'analisi valuta contemporaneamente (vedere Valutare un'espressione espressione di controllo).

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;
        }
    }
}

Codice non gestito

Il codice seguente è un'implementazione di IDebugExpressionEvaluator::Parse nel codice non gestito. Questo metodo chiama una funzione helper, Parse, per analizzare l'espressione e verificare la presenza di errori, ma questo metodo ignora il valore risultante. La valutazione formale viene posticipata a EvaluateSync in cui l'espressione viene analizzata mentre viene valutata (vedere Evaluate a Watch expression).

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;
}

Vedi anche