C 구문 분석기의 성능 확장

시작하기 전에

다음 주제를 읽고 이해했는지 확인하십시오.
다음과 같은 방법으로 C 구문 분석기의 성능을 확장할 수 있습니다.

구문 분석기 기능 구현

구문 분석기는 다음 유형의 구현 함수를 구현해야 합니다.
  1. 입력 함수
  2. 구문 분석 함수
  3. 출력 함수

각 함수 유형에 대해 아래에서 설명합니다.

입력 함수 구현

다음은 세 가지의 입력 함수입니다. 구문 분석기는 이 함수 중 단 하나만 구현해야 합니다.

사용자 정의 구문 분석기가 입력 메시지를 구문 분석해야 하는 경우, 브로커는 입력 함수를 호출합니다. 구문 분석기는 소유를 요구하는 입력 비트스트림 버퍼의 양을 브로커에 알려야 합니다. 고정 크기 헤더의 경우, 구문 분석기는 헤더 크기를 요구합니다. 구문 분석기가 메시지 전체를 핸들링하려고 한 경우 버퍼의 나머지를 요구합니다.

예를 들면,
  1. 브로커는 cpiParseBufferEncoded 입력 함수를 호출합니다.
    int cpiParseBufferEncoded(
        CciParser*      parser,
        CciContext* context,
        int            encoding,
        int         ccsid
    ){
        PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
      int             rc;
  2. 메시지 버퍼로 포인터를 가져온 다음 cpiBufferPointer 유틸리티 함수를 사용하여 오프셋을 설정합니다.
      pc->iBuffer = (void *)cpiBufferPointer(&rc, parser);
      pc->iIndex = 0;
  3. 버퍼 형식을 저장합니다.
      pc->iEncoding = encoding;
      pc->iCcsid = ccsid;
  4. cpiBufferSize 유틸리티 함수를 사용하여 버퍼 크기를 저장합니다.
      pc->iSize = cpiBufferSize(&rc, parser);
  5. cpiBufferByte 유틸리티 함수를 사용하여 스트림의 첫 번째 바이트를 프라임합니다.
      pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex);
  6. cpiRootElement 유틸리티 함수를 사용하여 현재 요소를 루트 요소로 설정합니다.
      pc->iCurrentElement = cpiRootElement(&rc, parser);
  7. 구문 분석이 올바르게 재설정되도록 플래그를 재설정합니다.
      pc->iInTag = 0;
  8. 버퍼의 나머지에 대한 소유권을 지정합니다.
      return(pc->iSize);
    }

구문 분석 함수 구현

일반 구문 분석 함수(예: cpiParseFirstChild)는 ESQL 또는 Java 표현식을 평가하기 위해 구문 요소 트리가 작성되어야 할 때 브로커가 호출하는 함수입니다. 예를 들어, 필터 노드는 ESQL 표현식에 ESQL 필드 참조를 사용합니다. 표현식을 평가하려면 이 필드 참조를 해석해야 합니다. 요청된 요소가 작성되거나 존재하지 않음을 구문 분석기가 알 때까지 구문 분석기의 일반 구문 분석 함수가 반복적으로 호출됩니다.

예를 들면,
void cpiParseFirstChild(
    CciParser*      parser,
    CciContext* context,
    CciElement* element
){
    PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
  int             rc;

  if ((!cpiElementCompleteNext(&rc, element)) &&
            (cpiElementType(&rc, element) == CCI_ELEMENT_TYPE_NAME)) {

    while ((!cpiElementCompleteNext(&rc, element))     &&
                      (!cpiFirstChild(&rc, element)) &&
           (pc->iCurrentElement))
    {
      pc->iCurrentElement = parseNextItem(parser, context, pc->iCurrentElement);
    }
  }
    return;
}

출력 함수 구현

다음은 세 가지의 출력 함수입니다. 구문 분석기는 이 함수 중 단 하나만 구현해야 합니다.

사용자 정의 구문 분석기가 구문을 직렬화해야 하는 경우, 브로커는 출력함수를 호출합니다. 예를 들어, Compute 노드는 사용자 정의 구문 분석기 도메인에 트리를 작성했을 수 있습니다. 예를 들어, MQOutput 노드에 의해 이 트리가 출력되어야 하는 경우, 구문 분석기는 출력 비트스트림 버퍼에 빌드된 트리를 나타내는 데이터를 추가하는 작업을 담당합니다.

예를 들면,
int cpiWriteBufferEncoded(
    CciParser*      parser,
    CciContext* context,
    int            encoding,
    int         ccsid
){
    PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
    int                initialSize = 0;
    int                rc = 0;
    const void* a;
    CciByte b;

    initialSize = cpiBufferSize(&rc, parser);
    a = cpiBufferPointer(&rc, parser);
    b = cpiBufferByte(&rc, parser, 0);

    cpiAppendToBuffer(&rc, parser, (char *)"Some test data", 14);

    return cpiBufferSize(0, parser) - initialSize;
}

메시지 헤더 구문 분석기 구현

일반적으로 수신되는 메시지 데이터는 단일 메시지 형식이므로, 하나의 구문 분석기가 메시지 컨텐츠 전체를 구문 분석합니다. 필요한 구문 분석기의 클래스 이름은 입력 메시지 MQMD 또는 MQRFH2 헤더의 형식 필드에 정의됩니다.

그러나, 메시지는 여러 형식으로 구성되어야 합니다. 예를 들어, 한 가지 형식의 헤더가 오면 그 다음에 다른 형식의 데이터가 와야 합니다. 이 경우, 첫 번째 구문 분석기가 체인의 다음 형식을 담당하는 구문 분석기의 클래스 이름을 식별하는 방식입니다. 사용자 정의 구문 분석기에서, 브로커는 다중 메시지 형식을 구성하는 메시지를 찾아 구문 분석기 클래스의 체인 아래로 탐색해야 하는 경우 구현 함수 cpiNextParserClassName을 호출합니다.

사용자 정의 구문 분석기가 다중 메시지 형식의 일부인 메시지 형식의 구문 분석을 지원하는 경우, 사용자 정의 구문 분석기는 반드시 cpiNextParserClassName 함수를 구현해야 합니다.

예를 들면,
  1. cpiNextParserClassName 함수를 호출합니다.
    void cpiNextParserClassName(
        CciParser*      parser,
        CciContext* context,
        CciChar*    buffer,
        int         size
    ){
        PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
        int                rc = 0;
  2. 다음 구문 분석기 클래스의 이름을 브로커로 복사합니다.
      CciCharNCpy(buffer, pc->iNextParserClassName, size);
    
        return;
    }
주의사항 | 등록상표 | 다운로드 | 라이브러리 | 지원 | 피드백
Copyright IBM Corporation 1999, 2006 마지막 갱신 날짜: 2006/08/21
as24980_