다음을 통해 공유


식 계산의 샘플 구현

Important

Visual Studio 2015에서 식 계산기를 구현하는 이 방법은 더 이상 사용되지 않습니다. CLR 식 계산기를 구현하는 방법에 관한 자세한 내용은 CLR 식 계산기관리형 식 계산기 샘플을 참조하세요.

조사식 창 식의 경우 Visual Studio는 ParseText를 호출하여 IDebugExpression2 개체를 생성합니다. IDebugExpressionContext2::ParseText는 EE(식 계산기)를 인스턴스화하고 Parse를 호출하여 IDebugParsedExpression 개체를 가져옵니다.

IDebugExpressionEvaluator::Parse는 다음 작업을 수행합니다.

  1. [C++에만 해당] 식을 구문 분석하여 오류를 찾습니다.

  2. IDebugParsedExpression 인터페이스를 실행하고 구문 분석할 식을 클래스에 저장하는 클래스(이 예제에서는 CParsedExpression이라고 함)를 인스턴스화합니다.

  3. CParsedExpression 개체에서 IDebugParsedExpression 인터페이스를 반환합니다.

참고 항목

뒤에 오는 예제와 MyCEE 샘플에서 식 계산기는 구문 분석을 평가와 구별하지 않습니다.

관리 코드

다음 코드는 관리 코드에서 IDebugExpressionEvaluator::Parse 구현을 보여 줍니다. 이 버전의 메서드는 구문 분석 코드가 동시에 평가될 때 EvaluateSync에 대한 구문 분석을 연기합니다(조사식 식 평가 참조).

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

비관리 코드

다음 코드는 비관리 코드에서 IDebugExpressionEvaluator::Parse의 구현입니다. 이 메서드는 도우미 함수 Parse를 호출하여 식을 구문 분석하고 오류를 확인하지만 이 메서드는 결과 값을 무시합니다. 식이 평가되는 동안 구문 분석되는 경우 EvaluateSync에 대한 정형 평가가 지연됩니다(조사식 식 평가 참조).

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

참고 항목